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/ 目錄
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
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