1. 程式人生 > >Android 生成簽名apk與多渠道打包

Android 生成簽名apk與多渠道打包

一、生成簽名apk

之前我們都是通過Android Studio來將程式安裝到手機上的,而它背後實際的工作流程是Android Studio會將程式程式碼打包成一個APK檔案,然後將這個檔案傳送到手機上,最後再執行安裝操作。Android系統會將所有的APK檔案識別為應用程式的安裝包,但並不是所有的APK檔案都能成功安裝到手機上,Android系統要求只有簽名後的APK檔案才可以安裝,那麼為什麼通過Android Studio執行程式的時候沒有進行過簽名操作還能將程式安裝到手機上?這是因為Android Studio使用了一個預設的keystore檔案幫我們自動進行了簽名。下面介紹兩種生成簽名檔案的方法:

1、使用Android Studio生成

點選Android Studio導航欄上的Build->Generate Signed APK,會彈出如下的建立簽名APK對話方塊:

                                     

由於目前我們還沒有一個正式的keystore檔案,所以點選Create new按鈕,然後會彈出一個新的對話方塊來讓我們填寫keystore檔案所必要的資訊,如下圖:

                                     

key store path一般建立在該專案下,自定義名稱即可:

                                     


填寫完以上所有的資訊後點擊OK,這時我們剛才填寫的資訊會自動填充到建立簽名APK對話方塊中,如下圖:

                                    

然後點選Next,彈出如下對話方塊:

                                    

這時就要選擇APK檔案的輸出地址了,這裡預設將APK檔案生成到專案的根目錄下,點選Finish,然後稍等一段時間,APK檔案就會生成好了,並且會在右上角彈出一個如下圖所示的提示:

                                     

點選提示上的Show in Explorer可以立刻檢視生成的APK檔案。

2、使用Gradle生成

使用Gradle生成APK檔案就要在app/build.gradle檔案中配置些資訊,在android閉包下新增如下資訊:

signingConfigs{
    config{
        storeFile file('C:\\Users\\Administrator\\Desktop\\Personal\\TestRelease\\test.jks')
        storePassword '123456'
        keyAlias 'test'
        keyPassword '123456'

    }
}

繼續編輯該檔案,在buildTypes下面的release閉包中新增如下資訊:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        //新增
        signingConfig signingConfigs.config
    }
}

即在buildTypes下面的release閉包中應用了剛才新增的簽名配置,這樣當生成正式版APK檔案的時候就會自動使用剛才配置的簽名信息來進行簽名了,現在build.gradle檔案已經配置完成,那麼如何生成APK檔案呢?其實Android Studio中內建了很多的Gradle Tasks,其中就包含了生成APK檔案的Task。點選右側工具欄的Gradle->專案名->:app->Tasks->build,如下圖:

                                   

其中assembleDebug用於生成測試版的APK檔案,assembleRelease用於生成正式版的APK檔案。在生成APK之前,先要雙擊clean這個Task來清理一下當前專案,然後雙擊assembleRelease,結果如下圖:

                                   

可以看到assembleRelease執行成功了,APK檔案會自動生成在app/build/outputs/apk目錄下,如下圖:

                                  

雖然現在APK檔案已經成功生成了,不過還有一個小細節需要注意一下。目前這種方式keystore檔案的所有資訊都是以明文的形式直接配置在build.gradle中,注意不太安全。Android推薦的做法是將這類敏感資料配置在一個獨立的檔案裡面,然後在build.gradle中去讀取這些資料。

下面按照這種方式來實現。Android Studio專案的根目錄下有一個gradle.properties,它是專門用來配置全域性鍵值對資料的,我們在gradle.properties檔案中新增如下資訊:

KEY_PATH=C:/Users/Administrator/Desktop/Personal/TestRelease/test.jks
KEY_PASS=123456
ALIAS_NAME=test
ALIAS_PASS=123456

可以看到,這裡將keystore檔案的各種資訊以鍵值對的形式進行了配置,然後我們在build.gradle中去讀取這些資料就可以了。編輯app/build.gradle的signingConfigs閉包,如下:

signingConfigs{
    config{
        storeFile file(KEY_PATH)
        storePassword KEY_PASS
        keyAlias ALIAS_NAME
        keyPassword ALIAS_PASS

    }
}
這樣直接檢視build.gradle檔案是無法看到keystore檔案的各種資訊,只有檢視gradle.properties檔案才能看得到,然後我們只需要將gradle.properties檔案保護好就行了,比如說將它從Git版本控制中排除。這樣gradle.properties檔案就只會保留在本地,從而就不用擔心keystore檔案的資訊會洩露了。

二、生成多渠道APK檔案

目前Android領域的應用商店非常多,不像蘋果只有一個App Store。當然我們完全可以使用同一個APK檔案來上架不同的應用商店,但是如果你有一些特殊需求的話,比如說針對不同的應用商店渠道來定製不同的介面,或者為了統計每個渠道的下載及其他資料,這就比較頭疼了。傳統情況下,開發這種差異性需求非常痛苦,通常需要維護多份程式碼版本,然後逐個打成相應渠道的APK檔案。一旦有任何功能變更就苦不堪言,因為每份程式碼版本里面都需要逐個修改一遍。幸運的是,現在Android Studio提供了一種非常方便的方法來應對這種差異性需求,極大程度地解決了之前版本維護困難的問題。下面來進行學習。

1、普通多渠道APK

比如說我們準備生成360和伴讀兩個渠道的APK檔案,那麼修改app/build.gradle檔案,如下:

productFlavors{
        c360{
            applicationId "com.testrelease.android.c360"

        }
        baidu{
            applicationId "com.testrelease.android.baidu"

        }

    }

可以看到,這裡添加了一個productFlavors的閉包,然後在該閉包中新增所有的渠道配置就可以了。注意Gradle中的配置規定不能以數字開頭,因此這裡將360的渠道名配置成了c360。渠道名的閉包中可以覆寫defaultConfig中的任何屬性,比如說這裡將applicationId屬性進行了覆寫,那麼最終生成的各渠道APK檔案的包名也將各不相同。

接下來我們開始針對不同渠道編寫差異性需求。在app/src目錄下新建一個baidu目錄,然後在baidu目錄下再新建java和res這兩個目錄,如下圖:

這樣我們就可以在這裡編寫百度渠道特有的功能了,java目錄用於存放程式碼,res目錄用於存放資源,如果需要覆寫AndroidManifest檔案中的內容,還可以在baidu目錄下再新建一個AndroidManifest.xml檔案。當然,實際上我們並沒有什麼渠道差異性的需求,在這裡只是為了演示,就給不同渠道的APK起一個不同的應用名吧。

應用名之前是定義在main/res/values/string.xml檔案中的,那麼我們在baidu目錄下也建立一個相同的目錄結構,然後將baidu/res/vaules/string.xml中的內容進行如下修改:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">測試百度版</string>
</resources>

這樣百度渠道的APK就會使用baidu/res/values/string.xml中定義的應用名來覆蓋原有的應用名。同樣的道理,新建qihoo目錄,進行類似的操作。這樣我們就以一個簡單的示例實現渠道差異性需求了,下面開始來生成多渠道的APK檔案,用以上的兩種方式都可以,個人偏好使用Android Studio提供的視覺化工具來生成,如下圖:

                                     

到這裡可以選擇生成的渠道包,如果想生成多個,按住CTRL鍵進行多選就可以了。這裡我們全選,生成結果如下:

                                    

下面就是安裝到手機了,結果如下:

                   

可以看到,3個版本成功安裝到手機上,這是由於之前我們在productFlavors中覆寫了各渠道的applicationId屬性,保證每個APK檔案的包名都不想同,因而它們才能安裝到同一個裝置上。

2、友盟多渠道APK

由於國內Android市場眾多渠道,為了統計每個渠道的下載及其它資料統計,就需要我們針對每個渠道單獨打包,如果讓你打幾十個市場的包豈不煩死了,不過有了Gradle,這再也不是事了。

第一步:在AndroidManifest.xml裡配置PlaceHolder

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />
第二步:在build.gradle設定productFlavors
productFlavors{
        c360{
            manifestPlaceholders=[UMENG_CHANNEL_VALUE:"c360"]

        }
        baidu{
            manifestPlaceholders=[UMENG_CHANNEL_VALUE:"baidu"]

        }
        wandoujia{
            manifestPlaceholders=[UMENG_CHANNEL_VALUE:"wandoujia"]

        }
        xiaomi{
            manifestPlaceholders=[UMENG_CHANNEL_VALUE:"xiaomi"]

        }

    }
或者批量設定:
productFlavors{
        c360{}
        baidu{}
        wandoujia{}
        xiaomi{}

    }

    productFlavors.all{
        flavor->flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
很簡單清晰有沒有,後面就是打包了,按照之前的兩種方式,任選一種即可,結果如下: