目錄
- 概述
- 修改簽名配置
- 新建簽名文件目錄
- 配置簽名信息
- 使用簽名信息
- 打包
- 修改APK名稱
概述
之前寫過一篇文章是通過Kotlin的Dsl結合gradle編寫的插件來管理項目依賴,我是從一個開源項目叫DanDanPlayAndroid項目上學到的,那時還沒有使用toml文件來管理項目依賴的技術。不過雖然現在有了toml文件管理依賴的技術,但我覺得使用插件的方式也很好,讀者自己選擇吧。這里提這個插件的原因就是在插件中涉及到修改輸出的APK名字和簽名配置的問題,在最新的gradle kts 版本中,這些配置有點小變化,所以在此處記錄下。
修改簽名配置
Android的應用都需要簽名,才能正常安裝使用,為了方便,我們可以將簽名的信息配置到gradle中,打包的時候直接運行對應的gradle任務就可了,具體步驟如下所示:
新建簽名文件目錄
為APK簽名一般都需要使用一個簽名文件,可以是keystore文件,也可以是jks文件。我們在項目中新建一個目錄,將簽名文件放到目錄里面
注意:這里的簽名文件不要放發布apk的正式簽名文件,這里的簽名文件可以放一個debug的,或者是我們的項目只是為了自己做demo驗證問題使用的,如果是正式的簽名文件,需要放到私服上,然后加密保護好,防止被竊取。這里放到根目錄只是為了演示如何配置簽名信息。
配置簽名信息
簽名信息在我們生成keystore或者是jks文件時會設置的。將其配置到下面的signingConfigs中,以packJKS來標識
signingConfigs {create("packJKS"){keyAlias = "demo" // 別名keyPassword = "123456" // 密碼storeFile = file("${rootDir.absolutePath}/keystore/demo.jks") // 存儲keystore或者是jks文件的路徑storePassword = "123456" // 存儲密碼}}
使用簽名信息
配置好簽名信息后,接下來就是使用簽名信息了,在buildTypes中找到對應的配置并設置給debug和release,如下所示
buildTypes {// 通過前面配置的簽名信息對應的標識符:packJKS拿到簽名的配置信息// 保存在mySignConfig中,分別在debug和release中配置上就行了val mySignConfig = signingConfigs.getByName("packJKS")release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")// 配置release 的簽名信息signingConfig = mySignConfig}debug {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")// 配置debug的簽名信息signingConfig = mySignConfig}}
打包
配置好簽名信息后,我們可以同步下gradle,如果沒有報錯的話我們就可以打包了。在gradle中找到下面的兩個任務,執行對應的任務就可以打對應的包了。
執行完任務后,就能得到想要的APK 了,如下所示:
修改APK名稱
經過上面的配置我們可以打出正常可以安裝的apk了,但是如過要區分還是很難的,因為名字都是默認的app-release.apk啥的 ,標識效果不好,并且如果需要給不同的客戶提供,還需要手動改,非常麻煩,在之前的gradle版本中是通過修改BaseVariantOutput來達到修改APK 輸出文件名的方法,具體的大家可以百度,但是最新的8.0以上不支持這種修改方法了,所以我們就提供了一種使用gradle的任務修改的辦法,在android{…}閉包中加入下面的代碼,如下所示:
android.buildTypes.forEach {buildType ->// 拿到對應的任務類型名稱,比如是release或debug,后面需要用它去拼接成對應的任務名稱val typeName = buildType.name// 獲取版本號versionName寫到apk的民稱中val versionName = android.defaultConfig.versionName// 往apk的名稱中加入時間val date = SimpleDateFormat("yyyy-MM-dd-HH-mm", Locale.US).format(Date())// 按名稱遍歷productFlavors然后創建兩個任務分別打release包和debug包android.productFlavors.map { it.name }.ifEmpty { listOf("") }.forEach {flavorName->// 將獲取到的名稱首字母變為大寫,比如:release變為Releaseval combineName = "${flavorName.capitalize()}${typeName.capitalize()}"// 為我們的任務命名:比如叫packReleaseval taskName = "pack$combineName"// 找到打包的任務,比如release就是assembleRelease任務val originName = "assemble$combineName"// 創建一個任務專門做我們的自定義打包任務project.task(taskName){// 為任務分組group = "Pack apk"// 執行我們的任務之前會先執行的任務,比如,打release包時會先執行assembleRelease任務dependsOn(originName)// 執行完任務后,我們將得到的APK 重命名并輸出到根目錄下的apks文件夾下doLast{copy{from(File(project.buildDir,"outputs/apk/$typeName"))into(File(rootDir,"apks"))rename{"AppPackDemo-V-$versionName-$date.apk"}include("*.apk")}}}}}
運行完沒有問題會在gradle任務欄中看到如下的任務:
點擊運行對應的打包任務,就能得到對應的apk了,比如我們執行packRelease,得到的結果如下所示:
在根目錄下的apks文加夾中,就能生成我們想要的命好名字的APK了