赞
踩
用 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.jks -p yourpassword -pk8 platform.pk8 -cert platform.x509.pem -alias mykeyalias
其中,name.jks
为生成的 jks,name 是 jks 的名称,随便取;
jks 的密码为 yourpassword
,一般为字母和数字;
mykeyalias
为 jks 的别名,随便取;
举例,要生成 beauty.jks,密码为 beauty100 ,别名是 love ,则命令为:
./keytool-importkeypair -k beauty.jks -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love
ps:
jks 是 AndroidStudio 生成的签名。
keystore 是 Eclipse 生成的签名。
生成 keystore 文件也是可以的,如果生成的是 keystore 文件,后面的操作步骤同 jks,将对应的 jks 替换为 keystore 即可。
./keytool-importkeypair -k beauty.keystore -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love
我的AS是 4.0 版本,为方便,将生成的 beauty.jks 放到工程的 app/
目录下,
Build --> Generate Signed Bundle/APK -->APK --> Next
如图,Choose existing...
选择 app
目录下的 beauty.jks 文件;
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.jks') storePassword 'beauty100' keyAlias 'love' keyPassword 'beauty100' } // 如果 debug 版本也打签名,则添加这一部分 debug { storeFile file('beauty.jks') 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.jks')
指 beauty.jks 相对于 app/build.gradle
文件的路径,
我把 beauty.jks 文件放到了 app/
根目录,
app/build.gradle
文件也在 app/
根目录,所以直接这样写.
如果 beauty.jks 文件放在 app/
同级目录,则应该这样写:
storeFile file('../beauty.jks')
;
也可以按照磁盘(windows)目录写:
storeFile file('D:\\xxx\\xxx\\SignedDemo\\app\\beauty.jks')
。
storePassword
和 keyPassword'
保持一致,否则AS编译会报错: Cannot recover key
。
别忘了在 AndroidManifest.xml
添加 android:sharedUserId="android.uid.system"
。
至此,配置完成,AS 上编译出来的 app 即是具有系统签名的应用。
已经打上系统签名的应用,如何验证是否具有系统权限了呢?
模拟发送 power 键,未打系统签名的应用这样操作是无效的,打了系统签名可以实现关机。
sendKeyCode(KeyEvent.KEYCODE_POWER);
private void sendKeyCode(final int keyCode){
new Thread() {
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(keyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
尝试发送 frameworks/base/core/res/AndroidManifest.xml
文件里定义的某个广播 <protected-broadcast android:name="xxxxxx" />
;
未打签名的应用发送该广播,log 可看到禁止发送,功能不能正常实现;
打签名的应用发送该广播,log 不会提示禁止发送,功能也正常。
安卓 8.0 后,非系统应用无法使用 SYSTEM_ALERT_WINDOW ,如下操作会报错
WindowManager.LayoutParams layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
| WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
系统应用则可以正常使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。