Android签名

Android签名目的:

  • 纯软件公司relsase自己的apk产品前,会使用自己的公钥向CA申请数字证书,之后使用该数字证书迭代自己的产品。以保证软件产品的安全性。
  • 平台厂商预装apk一般需要使用签名工具和系统签名文件(在$(android_src)/build/target/product/security/目录下),对预装apk进行签名,一方面保证之后这部分软件升级中证书的一致性;另一方面有些应用需要获取系统权限,签名应与系统一致。

https://blog.csdn.net/u012041204/article/details/73823606

Android系统默认的四种签名类型

  • testkey:普通APK,默认情况下使用。
  • platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
  • shared:该APK需要和home/contacts进程共享数据。
  • media:该APK是media/download系统中的一环。
    应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

系统默认的四种签名类型文件的位置:

1
2
3
$(android_src)/build/target/product/security$ ls
media.pk8       platform.pk8       README   shared.pk8       testkey.pk8
media.x509.pem  platform.x509.pem   shared.x509.pem  testkey.x509.pem

pk8是生成的私钥,而*.x509.pem是公钥,生成时两者是成对出现的

Android系统制作自定义签名:

需要生成四种类型的key文件

  1. cd /Android_src/development/tools
  2. 使用make_key工具生成签名文件

    1
    2
    sh make_key (platform|shared|media|testkey|releasekey) 
    '/C=CN/ST=HuNan/L=ChangSha/O=Company/OU=Department/CN=Zdd/emailAddress=xxxx@qq.com'

    C —> Country Name (2 letter code)
    ST —> State or Province Name (full name)
    L —> Locality Name (eg, city)
    O —> Organization Name (eg, company)
    OU —> Organizational Unit Name (eg, section)
    CN —> Common Name (eg, your name or your server’s hostname)
    emailAddress —> Contact email address

  3. 修改android平台签名:
    修改build/core/config.mk
    修改external/sepolicy/keys.conf

Android签名方式

  • 方式一: 使用命令行工具SignApk.jar签名(out/host/linux-x86/framework/signapk.jar)
    $java -jar SignApk.jar platform.x509.pem platform.pk8 Application.apk Application_signed.apk
  • 方式二: 用 platform.pk8 和 platform.x509.pem (源码\device\xxx\xxx\security)生成 keystore 系统签名文件。然后在build.gradle文件中配置signingConfigs
    使用工具keytool-importkeypair:
    1
    $keytool-importkeypair -k ~/.android/platform.keystore -p android -pk8 					platform.pk8 -cert platform.x509.pem -alias platform

Android Studio使用platform.keystore