最近要做一个重复开关机的专项测试,发现需要系统权限才能实现
1.需要SYSTEM USER
1> android:sharedUserId="android.uid.system
2> <uses-permission android:name="android.permission.SHUTDOWN" />
2. 系统签名
系统签名方法:
1. 直接用android studio生成的APK用signapk.jar进行签名,注意window和UBUNTU环境的签名jar文件是不一样的。
1> linux下面签名:
在UBUNTU环境下,signapk.jar有两个地方获取到,分别是:
/prebuilts/sdk/tools/lib有signapk.jar文件
out/host/linux-x86/framework/signapk.jar
linux下面签名命令为:
java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk app-release-sign.apk
有时会碰到如下报错信息
如下报错为JAVA版本不对
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk : Unsupported major.minor version 52.0
这个错误是由于找不到 libconscrypt_openjdk_jni.so 文件导致的
路径:prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so
Exception in thread "main" java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni in java.library.path
如果WINDOWS环境下有 Cygwin64 Terminal,可以直接用
java -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk app-release-sign.apk签名
执行命令的目录为安装目录,如安装在D:\cygwin64,即把相应的APK及密钥文件放到D:\cygwin64\home\windows登录用户名\目录下执行以上命令。
cywin下载安装页面 http://www.cygwin.com/ 点周 setup-x86_64.exe即可安装,选择网络安装时间会较长。
由于百度网盘不能创建共享链接,可以百度cygwin64.zip这个离线安装包,越大越好(支持的一些工具就越全),安装的时候选择本地包安装即可。
安装完成后的执行命令和UBUNTU一样。
windows下面签名
java -jar signapk.jar platform.x509.pem platform.pk8 app-release.apk flashtest-sign.apk
2. 用平台的.pem .pk8文件生成key.store,进行导入android studio这样,可以直接生成相应的系统签名APK
.pem这种文件就是一个X.509的数字证书,里面有用户的公钥等信息,是用来解密的。但是由上文可知,这种文件格式里面不仅可以存储数字证书,还能存各种key。
.pk8为扩展名的文件,应该和PKCS #8是对应的,用来保存private key。
用android OS源码工程的私钥和公钥行成keysotre
https://github.com/getfatday/keytool-importkeypair
keytool-importkeypair -k ~/.android/debug.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
-k 表示要生成的 keystore 文件的名字,这里命名为 platform.keystore
-p 表示要生成的 keystore 的密码,这里是 android
-pk8 表示要导入的 platform.pk8 文件
-cert 表示要导入的platform.x509.pem
-alias 表示给生成的 platform.keystore 取一个别名,这是命名为 platform
用如下命令生成的keystore就是系统APK的签名文件。直接在android studio里面设置即可。具体怎么设置请自行百度。
注: .pk8,.pem文件不能从网上下载,因为这些公钥,私钥文件有些项目需要过谷歌认证,为安全起见要求重新生成,所以要直接从项目代码里面获取。