Android系統build階段簽名機制

https://maoao530.github.io/2017/01/31/android-build-sign/

APK簽名機制
https://maoao530.github.io/2017/01/31/apk-sign/

 

本文介紹Android系統build階段的簽名機制。

一、系統build階段簽名機制

1、系統中有4組key用於build階段對apk進行簽名:

  • Media
  • Platform
  • Shared
  • Testkey
  • release

default key是放在Android源碼的/build/target/product/security目錄下:

  • media.pk8與media.x509.pem;
  • platform.pk8與platform.x509.pem;
  • shared.pk8與shared.x509.pem;
  • testkey.pk8與testkey.x509.pem;

其中,*.pk8文件爲私鑰,*.x509.pem文件爲公鑰,這需要去了解非對稱加密方式。

2、在apk的android.mk文件中會指定LOCAL_CERTIFICATE 變量:

LOCAL_CERTIFICATE可設置的值如下:

1
2
3
4
LOCAL_CERTIFICATE := testkey # 普通APK,默認情況下使用
LOCAL_CERTIFICATE := platform # 該APK完成一些系統的核心功能,這種方式編譯出來的APK所在進程的UID爲system
LOCAL_CERTIFICATE := shared # 該APK是media/download系統中的一環
LOCAL_CERTIFICATE := media # 該APK是media/download系統中的一環

如果不指定,默認使用testkey。

對應的,除了在Android.mk指定上述的值,還需要在APK源碼的AndroidManifest.xml文件的manifest節點裏面申明權限:

1
2
3
android:sharedUserId="android.uid.system"
android:sharedUserId="android.uid.shared"
android:sharedUserId="android.media"

3、Build規則是Build/core/prebuilt.mk。
4、在build/core/config.mk中,DEFAULT_SYSTEM_DEV_CERTIFICATE可以通過PRODUCT_DEFAULT_DEV_CERTIFICATE去指定各家廠商的key path。

我們可以看到,默認爲build/target/product/security/testkey。

1
2
3
4
5
6
# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif

 

二、自定義系統簽名的key

上面介紹了系統有默認四組key,那麼如果我們要製作自己的key,需要怎麼做呢?
在build/target/product/security/目錄下有一個README,裏面有說明怎麼製作這些key並且使用。

1、進入Development/tools/ 目錄

cd-dev-tool.png

2、使用make_key工具生成簽名文件:

1
sh make_key releasekey '/C=CN/ST=Guangdong/L=Shenzhen/O=Mediatek/OU=MTK/CN=fzll/[email protected]'

其中:

  • 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、用ls命令發現目錄下多了兩個文件:releasekey.x509.pem 和 releasekey.pk8

release-key.png

4、同樣的步驟生成platform / shared / media

5、用自定義的key替換build/target/product/security/目錄下面的key。

三、對APK進行系統簽名

爲了使apk有system權限,通常我們需要對其進行系統簽名:

1、在應用程序的AndroidManifest.xml中的manifest節點中加入

1
android:sharedUserId="android.uid.system"這個屬性。

2、修改它的Android.mk文件,加入

1
LOCAL_CERTIFICATE := platform

重新編譯,生成的apk就有修改system權限了,我們通過ps命令查看APK所在進程的UID,發現值爲system。


 

1.keystore生成
keystore就是用來保存密鑰對的,比如公鑰和私鑰。用jdk的keytool工具生成keystore:
keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore

 

2.證書的生成
通過.keystore文件生成*.cer證書文件:
Keytool -export -keystore test.keystore -alias test.keystore -file test.cer

 

3.使用Keystore 簽名apk
使用jarsigner工具對apk進行簽名:
jarsigner -verbose -keystore test.keystore -signedjar HelloWorld_sign.apk Hello_un_sign.apk test.keystore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章