目錄
1.問題場景
2.實現思路
3.將測試代碼做成APK并配置簽名
4.將apk內置到系統當中的方法
1.問題場景
在展訊平臺中Android13的源碼已知的情況下,客戶寫了一個測試類用于調用系統中的一些接口來檢驗一些功能。為了方便調試排查問題我首先的思路是將客戶寫的測試代碼做成apk,內置進入到Android13的系統當中。
2.實現思路
基于上述的問題背景,我們需要分步實現
1.將測試代碼做成apk
2.將apk內置進入到系統中通過log進行調試
3.將測試代碼做成APK并配置簽名
主要參考文件如下顯示,大家可以直接參考或者看我下述的表述
Android11.0 生成系統簽名.jks文件并對Apk進行簽名_android jks-CSDN博客
1.對應用進行系統簽名需要關注的文件是
platform.pk8
platform.x509.pem
signapk,jar同時在AndroidManifest.xml當中添加android:sharedUserId="android.uid.system"例如下述代碼片段
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:sharedUserId="android.uid.system"android:sharedUserMaxSdkVersion="32">當targetSdkVersion>=30 也就是7.0以上的設備會報錯
針對上述報錯的問題我們需要生成.jks文件
1.首先先進入Android13源碼中進行操作cd build/target/product/security/// 1.生成 platform.pemopenssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem// 2.生成 platform.p12 // 別名:systemkey// 密碼:123456openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:123456 -name systemkey// 3.生成 platform.jks文件keytool -importkeystore -deststorepass 123456 -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 1234562.其中第三條命令會提示你輸入源密鑰的口令:直接輸入123456正在將密鑰庫 ./platform.p12 導入到 ./platform.jks...輸入源密鑰庫口令: 已成功導入別名 systemkey 的條目。已完成導入命令: 1 個條目成功導入, 0 個條目失敗或取消Warning:<systemkey> uses the MD5withRSA signature algorithm which is considered a security risk and is disabled.JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore ./platform.jks -destkeystore ./platform.jks -deststoretype pkcs12" 遷移到行業標準格式 PKCS12。3.完成上述命令之后按照慣例就要將其遷移到行業標準格式keytool -importkeystore -srckeystore ./platform.jks -destkeystore ./platform.jks -deststoretype pkcs12輸入源密鑰庫口令: 已成功導入別名 systemkey 的條目。已完成導入命令: 1 個條目成功導入, 0 個條目失敗或取消Warning:<systemkey> uses the MD5withRSA signature algorithm which is considered a security risk and is disabled.已將 "./platform.jks" 遷移到 Non JKS/JCEKS。將 JKS 密鑰庫作為 "./platform.jks.old" 進行了備份。4.同目錄會生成 platform.pem,platform.p12,platform.jks.old,我們使用命令查看.jks的文件keytool -list -v -keystore platform.jks輸入密鑰庫口令: 密鑰庫類型: PKCS12密鑰庫提供方: SUN您的密鑰庫包含 1 個條目別名: systemkey創建日期: 2023-6-20條目類型: PrivateKeyEntry證書鏈長度: 1證書[1]:所有者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US發布者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US序列號: b3998086d056cffa有效期為 Wed Apr 16 06:40:50 CST 2008 至 Sun Sep 02 06:40:50 CST 2035證書指紋:MD5: 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FASHA1: C8:A2:E9:BC:CF:59:7C:2F:B6:DC:66:BE:E2:93:FC:13:F2:FC:47:EC:77:BC:6B:2B:0D:52:C1:1F:51:19:2A:B8SHA256: MD5withRSA (disabled)簽名算法名稱: 2048 位 RSA 密鑰主體公共密鑰算法: 3版本: {10}擴展: #1: ObjectId: 2.5.29.35 Criticality=falseAuthorityKeyIdentifier [KeyIdentifier [0000: 4F E4 A0 B3 DD 9C BA 29 F7 1D 72 87 C4 E7 C3 8F O......)..r.....0010: 20 86 C2 99 ...][EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US]SerialNumber: [ b3998086 d056cffa]]#2: ObjectId: 2.5.29.19 Criticality=falseBasicConstraints:[CA:truePathLen:2147483647]#3: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: 4F E4 A0 B3 DD 9C BA 29 F7 1D 72 87 C4 E7 C3 8F O......)..r.....0010: 20 86 C2 99 ...]]
3.我們將測試代碼放進Androidstudio當中在其app目錄下新建key目錄,將platform.jks放到key目錄下,同時在? build.gradle下添加下述代碼
android {...signingConfigs {release {storeFile file("/key/platform.jks")keyAlias "systemkey"keyPassword "123456"storePassword "123456"}}}
不過有時候build.gradle的文件類型不同或許需要做一些變更比方說我的build.gradle.kts中格式如下
signingConfigs {create("release") {storeFile file("/key/platform.jks")keyAlias "systemkey"keyPassword "123456"storePassword "123456"}}
之后直接運行文件即可
AndroidStudio中生成相應的apk則可以參考下述文檔
Android Studio生成.jks文件-CSDN博客
生成完相應的apk,咱就可以用adb直接install進入到我們的系統中,進行進一步調試
4.將apk內置到系統當中的方法
這一部分思路就比較明確分為三步
1.在package/app下創建文件夾例:Test1
2.在其中添加相應的文件Android.mk文件
#Android.mk文件LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)#模塊名稱
LOCAL_MODULE := Test1
#生成路徑在adb shell system/app
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
#注意此處切換為系統簽名platform
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_DEX_PREOPT = false
include $(BUILD_PREBUILT)
3.在Test1下將相應的apk放進去即可,同時在相應的位置添加好即可:
例子:b/device/sprd/XXXX/common/common_packages.mk
本文為自己的學習參考,僅供大家參考與討論