【Android】Android 簽名相關問題

指間沙似流年發表於2017-12-23

加固後重新打包

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檔案忽略即可。

微信獲取簽名

連結

相關文章