加固後重新打包
jarsigner -verbose –keystore 指定數字證書儲存路徑 -signedjar 簽名後的apk包 未簽名的 apk包 數字證書別名
jarsigner -verbose -keystore key.jks -signedjar mifi.apk mifi_3.1.0_2017-07-05_mifi.encrypted.apk default
複製程式碼
獲取keystore數字證書別名
keytool -list -v -keystore keystoreName -storepass keystorePassword
複製程式碼
建立新的KeyStore
keytool -genkey -v -keystore {FILENAME.keystore} -alias {ALIAS} -keyalg RSA -validity {DURATION}
複製程式碼
- {FILENAME.keystore} 為生成的KeyStore的檔名
- {ALIAS} 為生成的KeyStore檔案的別名
- {DURATION} 為該KeyStore檔案的過期時間
獲取KeyStore指紋資訊
keytool -v -list -keystore {FILENAME.keystore} -alias {ALIAS} -keypass {KEYPASSWD} -storepass {STOREPASSWD}
複製程式碼
- {FILENAME.keystore}為keystore檔名
- {ALIAS}為KeyStore的別名
- {KEYPASSWD}為KeyStore的金鑰口令
- {STOREPASSWD}為KeyStore的金鑰庫口令
簽名資訊寫入Gradle指令碼
在Android Stduio中開啟主moudle的build.gradle檔案,在其中的android閉包中鍵入如下內容:
signingConfigs {
release {
keyAlias 'test'
keyPassword 'android'
storeFile file('./keystore/test.keystore')
storePassword 'android'
}
debug {
keyAlias 'test'
keyPassword 'android'
storeFile file('./keystore/test.keystore')
storePassword 'android'
}
}
複製程式碼
- keyAlias keystore的alias
- keyPassword KeyStore的金鑰口令
- storeFile為KeyStore的檔案存放路徑,可以為相對或者絕對路徑,此處使用的為相對路徑
- storePassword為KeyStore的金鑰庫口令
gradlew assembleRelease
複製程式碼
專案將會使用我們上面定義的test.keystore金鑰庫檔案簽名打包專案為Release釋出版。
簽名資訊寫入配置檔案
雖然上面的把簽名資訊寫入gradle指令碼中比較方便省事,但是卻在金鑰檔案的金鑰密碼洩露問題,任何能夠看到此Moudle的build.gradle指令碼的人都可以拿到KeyStore檔案及其對應的金鑰口令,可能會導致一些安全風險,我們可以進行檔案的配置。
在主moudle的build.gradle指令碼的android閉包中:
applicationVariants.all {
if (project.hasProperty('keyAlias') && project.hasProperty('storeFile') &&
project.hasProperty('storePassword') &&
project.hasProperty('keyPassword')) {
android.signingConfigs.release.keyAlias = keyAlias
android.signingConfigs.release.storeFile = file(storeFile)
android.signingConfigs.release.storePassword = storePassword
android.signingConfigs.release.keyPassword = keyPassword
} else {
android.buildTypes.release.signingConfig = null
}
}
複製程式碼
其中Variants翻譯中文為變種,applicationVariants.all屬性含義為app plugin下所有的Variant的配置資訊,可以將其看作為一個總覽,可以方便的訪問所有物件。
我們在其中通過project.hasProperty讀取專案中的配置,並將其動態的賦值給signingConfigs.release下的相關屬性。
然後我們通過在gradle.properties或者其它專案中能夠被gradle的檔案中定義以上屬性並賦值即可。
storeFile=./keystore/test.keystore
storePassword=android
keyAlias=test
keyPassword=android
複製程式碼
這樣我們在專案團隊協作時,將gradle.properties檔案忽略即可。