系统签名的意义
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样,据有所有的系统权限,进行所有的系统操作。
签名的方式有散三种:
第一种:CMD命令方式
做系统签名必须要拿到的三个文件platform.x509.pem,platform.pk8,signapk.jar。其中platform.x509.pem,platform.pk8存放在android系统源码的/build/target/product/security/目录下,系统封装工具signapk.jarout/host/linux-x86/framework/目录,找到这三个文件后就可以做我们的app签名了。在你的jdk环境下,使用cmd命令行执行如下命令:
java -jar signapk.jar platform.x509.pem platform.pk8 XXX.apk XXXNew.apk
这样我们生成的app就是有系统签名的app了,但是我们每次都要使用命令的方式来执行给我们开发调试的app签名是不是很烦,有没有更好的方式呢?下面就重点说下keysotre的方式。
第二种:Android studio的方式
本质的原理是给apk加上开发者签名(jks文件),使用keytool-importkeypair 对jks文件进行系统签名,在出包的时候,直接使用带有系统签名的jks对apk进行签名,这样编译生成的apk文件就自带系统签名了。
这种方式也是需要上面提到的这两个文件platform.x509.pem、platform.pk8(位于../build/target/product/security)。
1.AndroidManifest.xml中添加
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="android.uid.system"
通过android:sharedUserId="android.uid.system"让APP应有系统的权限
2.生成jks文件
新建个目录(建议放在工程目录的signAPK目录下),拷贝platform.x509.pem、platform.pk8,然后在终端此目录下做如下操作生成jks文件:
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:123456 -name SignDemo`
keytool -importkeystore -deststorepass 123456 -destkeystore ./SignDemo.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass 123456
上面的文件密码:123456 用户名:SignDemo。这里很重要,后续要用到。
3、生成你自己的jks文件(说明:图片均来自网络)
如果,之前没有的就新建,点击Create New ... 设置密码(易记,建议123456),如下图:
然后Next -- Finish
4、配置gradle(app)
在在Android区域下(与defaultConfig同级)添加signingConfigs配置:
依次填写jks的路径,密码,别名等
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.cxq.signdemo" minSdkVersion 19 targetSdkVersion 23 versionCode 1 versionName "1.0" } signingConfigs { release { storeFile file("../signApk/SignDemo.jks") storePassword '123456' keyAlias 'SignDemo' keyPassword '123456' } debug { storeFile file("../signApk/SignDemo.jks") storePassword '123456' keyAlias 'SignDemo' keyPassword '123456' } } buildTypes {//友情提醒:注意如下的设置,网上很多帖子写的有问题
release { minifyEnabled false signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false signingConfig signingConfigs.debug proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
} dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' }
5.经过以上配置之后,点击run,app就可以直接安装到手机上了
第三种方法:通过系统编译进行签名
1.AndroidManifest.xml中添加
android:sharedUserId="android.uid.system"
2.自己写个Android.mk文件,修改如下内容。
LOCAL_CERTIFICATE := platform
用系统签名对APP进行签名
3.通过make进行系统编译,更新镜像。