Android中使用系统的签名打包

背景

正常开发一个Android软件项目,我们会生成一个签名文件,具体实现方式详见:项目签名

当我们开发一个系统级的app时,若apk已经集成到系统中,再想重新安装新包测试时一般会安装不上,提示签名不一致,原因是系统在整体编译时需要整体的来进行系统签名,当我们把新的apk往系统安装时,就会提示签名不一致,因为当前编译好的apk是应用签名,终端上的app是系统签名,二者不匹配,所以不能覆盖安装。

所以需要将编译好的apk进行系统签名才可以安装,以下总结下系统签名的方法。

 

前提准备

找到Android标准签名key文件,位于源码/build/target/product/security目录下,四组默认签名供Android.mk在编译APK使用。主要有4个key:

  • testkey:普通签名APK,默认情况下使用。
  • platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
  • shared:该APK需要和home/contacts进程共享数据。
  • media:该APK是media/download系统中的一环。
.pk8代表私钥,.x509.pem公钥,它们都是成对出现;

 

testkey是作为android编译的时候默认的签名key,如果系统中的apk的Android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。
而如果设置成:LOCAL_CERTIFICATE := platform,就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!
 
 

生成系统的keystore文件

//如果之前没有生成platform.pem文件,现在可以执行以下命令生成
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

//生成platform.p12文件,设置对应的密码和alias名(app签名使用到)
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:密码 -name 名称

//生成platform.jks(app使用的签名文件),启动
keytool -importkeystore -deststorepass 密码 -destkeystore ./platform.keystore -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 密码

剩下的就是将platform.jks拷贝到app工程目录下并配置build.gradle,打包时使用platform.jks打包即可

signingConfigs {
        release {
            storeFile file('../platfrom.keystore')
            storePassword '密码'
            keyAlias '别名'
            keyPassword '密码'
        }
    }

 

 

参考:AOSP系统签名的生成以及替换

 

 

posted @ 2024-04-19 11:00  渣娃  阅读(91)  评论(0编辑  收藏  举报