Android 編譯系統應用
一、應用簽名
應用沙盒:Android平臺利用Linux保護機制識別和隔離應用資源,為此,Android會為每個Android應用分配一個唯一的用戶ID(UID) ,并在自己的進程中運行,Android 會使用此UID設置一個內核級應用沙盒(避免相同包名應用隨意覆蓋安裝)。
應用簽名:通過應用簽名,開發者可以標識應用創作者并更新其應用,而無需創建復雜的接口和權限,在 Android 平臺運行的每個應用都必須有開發者簽名。
身份驗證:
APK 簽名驗證過程
Android 系統中的主要簽名文件,系統簽名文件主要位于build/target/product/security/目錄下
- pk8 : 私鑰文件,用于對APK進行簽名,這個私鑰需要保密保存,不能公開
- x509.pem是證書文件,相對于公鑰,這個可以公開,主要用于驗證某個apk 是否 由相應的私鑰簽名。
系統簽名文件
在編譯 APK 通過設置Android.mk文件的LOCAL_CERTIFICATE 來實現,
- LOCAL_CERTIFICATE := platform系統簽名
- LOCAL_CERTIFICATE := PRESIGNED 原本第三方簽名
- media: 此簽名的apk是media/download的一部分
- shared:此apk可以和home/contacts進行共享數據
- tastkey/releasekey: 平臺默認key ,在編譯時未指定LOCAL_CERTIFICATE的,默認是用testkey,因為testkey是公開的,任何人都可以獲取,不安全,所以一般使用releasekey作為默認key.
二、打包為 APK 進行系統簽名
對于 部分功能的訪問需要使用到系統權限,需要 添加 android:sharedUserId="android.uid.system" 權限,但是不正確的系統簽名會出現如下報錯 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 根據如下操作 刪除對應的 簽名文件 (不刪除也可,此處 重新 簽名 會進行覆蓋)。
刪除完成之后 將文件后綴名改為app:
刪除對應的文件
創建app文件夾 并開始書寫 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)
目錄結構
- 放入文件夾 vendor/rockchip/common/apps/Factorytest
- 使用mm執行 編譯:
build/envsetup.sh # 加載環境
lunch # 配置版本
cd vendor/rockchip/common/apps/Factorytest # 進入 文件放入的目錄
mm -j$(nproc) # 進行編譯
編譯結果如下:
編譯成功
使用 ADB 向主板中 進行安裝即可 (如果有相同包名的程序已經安裝了,記得對原有包名的程序進行刪除)。
安裝擁有系統權限 程序
三、使用系統密鑰(推薦便于開發與調試)
- testkey : 開發和測試使用
- platform : Android 平臺的系統應用
- shared: 平臺的共享系統庫
- media: 用于簽署媒體庫(簽署 Android 平臺上的媒體庫,這些庫提供音頻和視頻處理功能,允許訪問系統上的音頻和視頻資源,對于多媒體應用和功能非常重要)
進入目錄:build/target/product/security 下查看
- pk8 代表私鑰
- x509.pem 代表 公鑰
- GMS版本和非GMS版本需要進行重新生成密鑰。
平臺
1. 系統 key 文件生成 keystore
對如下內容進行個人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源碼中進行配置
- 配置文件為: 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
添加系統權限:
<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] 平臺簽名的共享 UID 許可名單: https://source.android.com/docs/core/permissions/platform-signed-shared-uid-allowlist?hl=zh-cn
- [2] 應用簽名: https://source.android.com/docs/security/features/apksigning?hl=zh-cn
- [3] Android 系統簽名簡介 : https://www.cnblogs.com/fanglongxiang/p/12445810.html