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
第二步:在build.gradle設定productFlavors<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
或者批量設定: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] }
相關文章
- 簽名打包Android版apkAndroidAPK
- Gradle For Android(二) 多渠道打包與簽名配置GradleAndroid
- Gradle for Android(三)多渠道打包、配置簽名資訊GradleAndroid
- Android 打包簽名 從生成keystore到完成簽名Android
- Android使用Ant進行apk多渠道打包AndroidAPK
- Android空包Apk簽名AndroidAPK
- 【Android自動化打包】03. APK的數字簽名AndroidAPK
- Android之重新簽名APKAndroidAPK
- 簽名apkAPK
- 借騰訊開源 VasDolly,談談 Android 簽名和多渠道打包的原理!Android
- Android自定義打包apk名稱AndroidAPK
- Android App的簽名打包AndroidAPP
- Android APK V1 簽名原理AndroidAPK
- Android加固之後Apk重簽名AndroidAPK
- 分享一個自動編譯,打包,簽名 android apk 的小指令碼編譯AndroidAPK指令碼
- Android多渠道打包Android
- Android打包簽名那點事Android
- APK簽名報錯APK
- Android 多渠道打包配置Android
- Android Apk 打包AndroidAPK
- Android APK簽名原理和過程詳解AndroidAPK
- Apk 簽名的那些事APK
- android簽名生成和釋出Android
- Walle —— Android多渠道打包神器Android
- Android多渠道打包實踐Android
- android多渠道打包最快方案Android
- android 利用shell指令碼重新打包簽名Android指令碼
- Android APK打包流程AndroidAPK
- apk空包簽名方法及工具APK
- android studio 打包簽名apk,完成微信和qq的的第三方分享功能AndroidAPK
- Android Studio 簽名打包過程圖解Android圖解
- 教你在Android自動打包解包簽名方法Android
- Android美團多渠道打包Walle整合Android
- Flutter 打包 android端 apkFlutterAndroidAPK
- 多渠道打包
- Visual Studio 2017為Android APK包簽名AndroidAPK
- Android專案如何進行簽名打包釋出Android
- Cordova 打包 apk,html 打包 apkAPKHTML