- 參考:簽署您的應(yīng)用
一. 手動(dòng)簽名
- 就是普通的簽名方式,大家經(jīng)常用的,GenerateSignedApk
二. 通過配置build文件,在build的時(shí)候自動(dòng)簽名并生成apk(module/build/outputs/apk下)
- 在模塊的build文件下的android塊里面配置signingConfigs
android { signingConfigs { release { /*下面屬性都對(duì)應(yīng)手動(dòng)簽名時(shí)候的那些屬性*/ keyAlias 'nickelfox'//秘鑰別名 keyPassword 'pass'//秘鑰密碼 storeFile file('path')//秘鑰庫位置 storePassword 'pass'//秘鑰庫密碼 } } } - 為每個(gè)buildTypes指定對(duì)應(yīng)的簽名配置,如下面是給release的build指定上面配置的release簽名配置
android { buildTypes { release { signingConfig signingConfigs.release } } } - 進(jìn)行如上配置之后,每次build都會(huì)在module/build/outputs/apk下面生成release版本簽名之后的apk
三. 注意!注意!注意!
上面配置過程中,將秘鑰的密碼等信息直接以明文形式配置在了build文件中,是極其不安全的。所以我們應(yīng)該換種方式:利用配置文件,消除明文配置的重要信息
- 在工程根目錄下新建keystore.properties文件(文件名可以任?。锩媾渲萌缦滦畔ⅲ?strong>注意這里不需要引號(hào))
storePassword=password keyPassword=password keyAlias=nickelfox storeFile=/Users/huanglingyu/Learning/AndroidMaterial/nickelfox.jks - build文件讀取properties配置(一般在build文件頭部?)
//獲取簽名配置 def signProperties = rootProject.file("sign/keystore.properties")//配置文件路徑 def props = new Properties() props.load(new FileInputStream(signProperties)) def file = file(props['storeFile'])//jks秘鑰庫文件 - 更改signingConfigs為從配置文件里面讀取
android { signingConfigs { release { //為了保護(hù)秘鑰信息的安全,這些信息不該以明文放到build文件中,下面是利用配置文件進(jìn)行配置 if (file.exists() && signProperties.exists()) {//如果秘鑰庫文件和配置文件存在就簽名,否則不簽名 keyAlias props['keyAlias']//Properties['key']方法用來獲取key對(duì)應(yīng)的屬性值,就是properties文件下配置的屬性 keyPassword props['keyPassword'] storeFile file//注意這里要的是file storePassword props['storePassword'] } } } } - 配置完成,最后記得在開源的時(shí)候?qū)⑴渲梦募蚸ks文件等信息放在gitignore即可
四. 生成帶有簽名的apk方法
- 執(zhí)行一次完整build,或者rebuild
- 命令行執(zhí)行g(shù)radlew assembleRelease
- 去module下的build/outputs/apk下找?guī)в泻灻腶pk即可
五. 完整build文件
apply plugin: 'com.android.application'
//獲取簽名配置
def signProperties = rootProject.file("sign/keystore.properties")//配置文件路徑
def props = new Properties()
props.load(new FileInputStream(signProperties))
def file = file(props['storeFile'])//jks秘鑰庫文件
android {
signingConfigs {
release {
//為了保護(hù)秘鑰信息的安全,這些信息不該以明文放到build文件中,下面是利用配置文件進(jìn)行配置
if (file.exists() && signProperties.exists()) {//如果秘鑰庫文件和配置文件存在就簽名,否則不簽名
keyAlias props['keyAlias']//Properties['key']方法用來獲取key對(duì)應(yīng)的屬性值,就是properties文件下配置的屬性
keyPassword props['keyPassword']
storeFile file//注意這里要的是file
storePassword props['storePassword']
}
/*下面屬性都對(duì)應(yīng)手動(dòng)簽名時(shí)候的那些屬性*/
/*keyAlias 'nickelfox'//秘鑰別名
keyPassword 'pass'//秘鑰密碼
storeFile file('path')//秘鑰庫位置
storePassword 'pass'//秘鑰庫密碼*/
}
}
compileSdkVersion 26
defaultConfig {
applicationId "cn.foxnickel.autosigndemo"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}