Android 編譯系統(tǒng)應(yīng)用
一、應(yīng)用簽名
應(yīng)用沙盒:Android平臺(tái)利用Linux保護(hù)機(jī)制識(shí)別和隔離應(yīng)用資源,為此,Android會(huì)為每個(gè)Android應(yīng)用分配一個(gè)唯一的用戶ID(UID) ,并在自己的進(jìn)程中運(yùn)行,Android 會(huì)使用此UID設(shè)置一個(gè)內(nèi)核級(jí)應(yīng)用沙盒(避免相同包名應(yīng)用隨意覆蓋安裝)。
應(yīng)用簽名:通過(guò)應(yīng)用簽名,開(kāi)發(fā)者可以標(biāo)識(shí)應(yīng)用創(chuàng)作者并更新其應(yīng)用,而無(wú)需創(chuàng)建復(fù)雜的接口和權(quán)限,在 Android 平臺(tái)運(yùn)行的每個(gè)應(yīng)用都必須有開(kāi)發(fā)者簽名。
身份驗(yàn)證:
APK 簽名驗(yàn)證過(guò)程
Android 系統(tǒng)中的主要簽名文件,系統(tǒng)簽名文件主要位于build/target/product/security/目錄下
- pk8 : 私鑰文件,用于對(duì)APK進(jìn)行簽名,這個(gè)私鑰需要保密保存,不能公開(kāi)
- x509.pem是證書文件,相對(duì)于公鑰,這個(gè)可以公開(kāi),主要用于驗(yàn)證某個(gè)apk 是否 由相應(yīng)的私鑰簽名。
系統(tǒng)簽名文件
在編譯 APK 通過(guò)設(shè)置Android.mk文件的LOCAL_CERTIFICATE 來(lái)實(shí)現(xiàn),
- LOCAL_CERTIFICATE := platform系統(tǒng)簽名
- LOCAL_CERTIFICATE := PRESIGNED 原本第三方簽名
- media: 此簽名的apk是media/download的一部分
- shared:此apk可以和home/contacts進(jìn)行共享數(shù)據(jù)
- tastkey/releasekey: 平臺(tái)默認(rèn)key ,在編譯時(shí)未指定LOCAL_CERTIFICATE的,默認(rèn)是用testkey,因?yàn)閠estkey是公開(kāi)的,任何人都可以獲取,不安全,所以一般使用releasekey作為默認(rèn)key.
二、打包為 APK 進(jìn)行系統(tǒng)簽名
對(duì)于 部分功能的訪問(wèn)需要使用到系統(tǒng)權(quán)限,需要 添加 android:sharedUserId="android.uid.system" 權(quán)限,但是不正確的系統(tǒng)簽名會(huì)出現(xiàn)如下報(bào)錯(cuò) Installation did not succeed.The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.RBTest"
coreApp="true"
android:sharedUserId="android.uid.system">
將app編譯成 可 安裝的 APP:
編譯成可以安裝的app
編譯成功之后,將app 的后綴名 修改為 rar 根據(jù)如下操作 刪除對(duì)應(yīng)的 簽名文件 (不刪除也可,此處 重新 簽名 會(huì)進(jìn)行覆蓋)。
刪除完成之后 將文件后綴名改為app:
刪除對(duì)應(yīng)的文件
創(chuàng)建app文件夾 并開(kāi)始書寫 Android.mk文件:
- 修改LOCAL_MODULE 名稱為自己的名稱
LOCAL_PATH := $(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := Factorytest
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_DEX_PREOPT := false
LOCAL_CERTIFICATE := platform
LOCAL_PRODUCT_MODULE := true
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include$(BUILD_PREBUILT)
目錄結(jié)構(gòu)
- 放入文件夾 vendor/rockchip/common/apps/Factorytest
- 使用mm執(zhí)行 編譯:
build/envsetup.sh # 加載環(huán)境
lunch # 配置版本
cd vendor/rockchip/common/apps/Factorytest # 進(jìn)入 文件放入的目錄
mm -j$(nproc) # 進(jìn)行編譯
編譯結(jié)果如下:
編譯成功
使用 ADB 向主板中 進(jìn)行安裝即可 (如果有相同包名的程序已經(jīng)安裝了,記得對(duì)原有包名的程序進(jìn)行刪除)。
安裝擁有系統(tǒng)權(quán)限 程序
三、使用系統(tǒng)密鑰(推薦便于開(kāi)發(fā)與調(diào)試)
- testkey : 開(kāi)發(fā)和測(cè)試使用
- platform : Android 平臺(tái)的系統(tǒng)應(yīng)用
- shared: 平臺(tái)的共享系統(tǒng)庫(kù)
- media: 用于簽署媒體庫(kù)(簽署 Android 平臺(tái)上的媒體庫(kù),這些庫(kù)提供音頻和視頻處理功能,允許訪問(wèn)系統(tǒng)上的音頻和視頻資源,對(duì)于多媒體應(yīng)用和功能非常重要)
進(jìn)入目錄:build/target/product/security 下查看
- pk8 代表私鑰
- x509.pem 代表 公鑰
- GMS版本和非GMS版本需要進(jìn)行重新生成密鑰。
平臺(tái)
1. 系統(tǒng) key 文件生成 keystore
對(duì)如下內(nèi)容進(jìn)行個(gè)人DIY配置:
- name : android14s.keystore
- keyAlias : android14
- keyPassword : 123456
cd android/build/target/product/security
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 android14
keytool -importkeystore -deststorepass 123456 -destkeystore ./android14s.keystore -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 123456
重新生成 rk3576密鑰:
cd android/build/target/product/security
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 rk3576
keytool -importkeystore -deststorepass 123456 -destkeystore ./rk3576.keystore -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 123456
生成keystore
- 在APK源碼中進(jìn)行配置
- 配置文件為: build.gradle(Module:app)
配置apk
signingConfigs {
debug {
storeFile file('android14s.keystore')
storePassword '123456'
keyAlias 'android14'
keyPassword '123456'
}
main {
storeFile file('android14s.keystore')
storePassword '123456'
keyAlias 'android14'
keyPassword '123456'
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.main
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
signingConfig signingConfigs.main
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
2. 配置 AndroidManifest.xml
添加系統(tǒng)權(quán)限:
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
coreApp="true"
package="com.RealBom.RBTest"
android:sharedUserId="android.uid.system"
>
參考閱讀:
- [1] 平臺(tái)簽名的共享 UID 許可名單: https://source.android.com/docs/core/permissions/platform-signed-shared-uid-allowlist?hl=zh-cn
- [2] 應(yīng)用簽名: https://source.android.com/docs/security/features/apksigning?hl=zh-cn
- [3] Android 系統(tǒng)簽名簡(jiǎn)介 : https://www.cnblogs.com/fanglongxiang/p/12445810.html