Android開發中,不可避免的會對apk進行簽名打包,在此記錄一下,友善以後檢視;
目前開發環境:Android Studio 3.3
主要講以下幾個方面問題:
1、手動對apk簽名打包
2、配置Gradle進行自動簽名打包
3、自定義打包apk的名稱
4、記錄一個小錯誤: Could not get unknown property ‘release’ for SigningConfig Container.
5、配置不同風格
6、剔除無用語言資源,限定産品語言
日常開發中 常見的組合就是 配置gradle自動簽名打包 + 自定義apk存放路徑
一、手動對apk進行簽名打包
第一步:As--->導航欄--->Build--->Generate Signed Bundle /APK...
第二步:選擇APK (第一個選擇是Google 推出的模式,APK容量将大大縮小,也是官方推薦的,此處暫不講)
第三步:選擇建立簽名檔案 或 選擇已有的簽名檔案(檔案名以 .jks結尾)
如果是建立簽名檔案,就點選下圖紅色箭頭指向的選項,選擇已有右邊的選項;
建立簽名檔案:
Alias(别名)、Password(設定别名密碼)、Confirm(确認别名密碼)、Validity(證書有限期,推薦25年)、First and Last Name(開發者姓名),Organizational Unit(開發者的組織代碼),Organization(開發者的組織名字),City or Locality(開發者所在的城市),State or Province(開發者所在的省份),Country Code(XX)(開發者所在的國家的代碼,中國填寫86)填寫資訊的目的用于生産密鑰和簽名認證。
名字密碼最好記錄下來,後續更新還要用到,如果時間長忘記了,那你就挂機吧 -_-
第四步:建立/選擇 完畢簽名檔案,依次填寫 , 并記住密碼(下次就不用填寫了),點選Next
簽名檔案路徑、密碼(Key store path、Key store)
簽名别名、密碼(Key alias、Key password)
第五步:選擇release , 勾選選擇V1、V2 , 點選Finish
v1簽名是對jar進行簽名,V2簽名是對整個apk簽名
圖像 小部件
第六步:等待簽名打包完成,點選locate即可檢視apk存放位置。
二、配置Gradle進行自動簽名打包
第一步:右鍵項目--->Open Module Setting -->Modules-->app--->Signing Configs
點選下圖中release上面的加号(我這裡是之前建立的release,第一次是沒有個release的,這裡隻是為了友善說明加号的箭頭)彈出Create New Signing Config ,填入release ,點選ok,效果如下圖,
然後在release下方依次填寫入之前生成的
簽名檔案路徑、密碼(Key store path、Key store)
簽名别名、密碼(Key alias、Key password)
第二步:切換到Build Variants-->app--->Build Types--->release --->選擇Signing Config(下方圖檔中間藍色字型部分)
點選ok 即可;
第三步:進入項目build.gradle(app)檔案中,你會發現多了部分内容,如下:
signingConfigs { release { 簽名路徑、密碼、别名、别名密碼 } }
此時,使用assembleRelease就會生成release版的apk;
預設路徑儲存在:app/build/outputs/apk/release/app-release.apk
注意(報錯):
Could not set process working directory to ..... could not setcwd() (errno 2: 沒有那個檔案或目錄),
出現這個錯誤,點選Refresh Gradle project 即可;
三、自定義打包apk的存放路徑
修改打包後的apk名稱(如果你願意手動配置當我沒說),那就需要在build.gradle檔案中進行配置了,找到檔案中的buildTypes
第一步:加載配置檔案signapk.properties:
在app的根目錄下建立檔案,命名為signapk.properties ;将
簽名檔案路徑、密碼(Key store path、Key store)、簽名别名、密碼(Key alias、Key password)放置進去
(一般情況下,keystore檔案路徑、密碼、别名及其密碼都不會直接放在build.gradle檔案中的)
build.gradle(app)中加入以下代碼:
Properties signprops = new Properties()
signprops.load(new FileInputStream(file("signapk.properties")))
第二步:build.gradle(app)中加入時間格式
/*時間*/
static def releaseTime(){
return new Date().format("yyyyMMdd",TimeZone.getTimeZone("UTC"));
}
第三步:build.gradle(app)中找到buildTypes标簽,加入自定義路徑部分代碼:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if(outputFile !=null && outputFile.name.endsWith('.apk')){
//此處的project.appname也可以在signapk.properties檔案中聲明。fileName即生成apk的名稱
def fileName = "${signprops['project.appname']}
-${defaultConfig.versionCode}
-${defaultConfig.versionName}-${releaseTime()}"
if(variant.buildType.name.equals('release')){
outputFileName = fileName + ".apk"
} else if(variant.buildType.name.equals('debug')){
outputFileName = fileName + "-debug.apk"
}
}
}
}
}
第四步:點選sync,點選assembleRelease,檢視apk(可根據個人需要,調整修改相關屬性)
如有報錯,點選上述圖檔的 Refresh Gradle project ,進行重新整理,
然後點選下圖中的assembleRelease,等待結束後,進入app/build/outputs/apk/release/目錄下,即可檢視生成的apk;
例如:Shodow-100-1.0.0-20190605.apk (app名稱+版本号+版本名稱+日期+檔案字尾)
四、Could not get unknown property ‘release’ for SigningConfig Container. 的錯誤
解決辦法: 将
signingConfigs {} 标簽放在 buildTypes{}标簽前面,即可Sync通過;
五、不同産品風格
flavorDimensions 'res'// 定義要替換res目錄下風格屬性
/*為不同的APP配置不同産品風格,替換不同資源檔案,代碼*/
productFlavors {
def appname = signprops['project.appname']
if ("Crazy".equals(appname)) {
crazy {
dimension 'res'
}
} else if ("Happy".equals(appname)) {
happy {
dimension 'res'
}
}
}
六、使用resConfigs去除無用語言資源
當項目本身支援多國語言時,對不同産品風格進行适配,某些産品限定支援的國家語言,此時,可以使用resConfig移除無用資源;
productFlavors {
def appname = signprops['project.appname']
if ("Crazy".equals(appname)) {
crazy {
dimension 'res'
resConfigs "en","zh" //限定目前Happy産品隻支援英語和中文
} else if ("Happy".equals(appname)) {
happy {
dimension 'res'
resConfigs "en" //限定目前Happy産品隻支援英語
}
}