用 Android Studio 开发应用时,adb 连接设备后,可以直接 run 运行到设备上。
当 debug 的是系统应用时,都会配置 android:sharedUserId="android.uid.system"
因为没有打系统签名, 无法直接装到设备上,不利于开发效率。
于是有了AS给应用打系统签名的需求。
要打系统签名,需要如下工具:
1.系统签名文件 platform.x509.pem platform.pk8
; 在源码 build/target/product/security 路径下;
2.keytool-importkeypair-master 工具以及 Linux 环境;
keytool-importkeypair-master下载链接 https://github.com/getfatday/keytool-importkeypair
在Linux环境下,在 keytool-importkeypair-master 根目录放置 platform.x509.pem 、 platform.pk8 文件,进入 keytool-importkeypair-master 根目录执行
./keytool-importkeypair -k name.keystore -p yourpassword -pk8 platform.pk8 -cert platform.x509.pem -alias mykeyalias
其中,name.keystore
为生成的 keystore ,name 是 keystore 的名称,随便取;
keystore 的密码为 yourpassword
,一般为字母和数字;
mykeyalias
为 keystore 的别名,随便取;
举例,要生成 beauty.keystore ,密码为 beauty100 ,别名是 love ,则命令为:
./keytool-importkeypair -k beauty.keystore -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love
ps: 生成 jks 文件也是可以的,如果生成的是 jks 文件,后面的操作步骤同 keystore ,将对应的 keystore 替换为 jks 即可。
./keytool-importkeypair -k beauty.jks -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love
我的AS是 4.0 版本,为方便,将生成的 beauty.keystore 放到工程的 app/
目录下,
Build --> Generate Signed Bundle/APK -->APK --> Next
如图,Choose existing...
选择 app
目录下的 beauty.keystore 文件;
Key store password 即为密码,对应 beauty100 ;
Key alias 为别名,对应 love ;
Key password 为别名的密码,保持和 Key store password 一致,要不然编译报错。
下一步,选择 release 版本打签名,debug版本选上也没问题,
v1 、v2 版本签名都打上,Finish
在 android { }
里添加 signingConfigs {}
和 signingConfig signingConfigs.release
,
signingConfigs{ }
要添加在 buildTypes{ }
之前,否则提示 signingConfigs.release
找不到
signingConfigs {
release {
storeFile file('beauty.keystore')
storePassword 'beauty100'
keyAlias 'love'
keyPassword 'beauty100'
}
// 如果 debug 版本也打签名,则添加这一部分
debug {
storeFile file('beauty.keystore')
storePassword 'beauty100'
keyAlias 'love'
keyPassword 'beauty100'
}
// 如果 debug 版本也打签名,则添加这一部分
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
其中, storeFile file('beauty.keystore')
指 beauty.keystore 相对于 app/build.gradle
文件的路径,我把 beauty.keystore 文件放到了 app/
根目录, app/build.gradle
文件也在 app/
根目录,所以直接这样写;
如果 beauty.keystore 文件放在 app/
同个目录,则应该这样写:
storeFile file('../beauty.keystore')
;
也可以按照磁盘(windows)目录写:
storeFile file('D:\\xxx\\xxx\\SignedDemo\\app\\beauty.keystore')
。
storePassword
和 keyPassword'
保持一致,否则AS编译会报错: Cannot recover key
。
别忘了在 AndroidManifest.xml
添加 android:sharedUserId="android.uid.system"
。
至此,配置完成,AS 上编译出来的 app 即是具有系统签名的应用。