這篇文章將介紹如何在Android系統(tǒng)中內置第三方apk
一、準備工作
- 編譯好的Android源碼
- Android apk文件:也就是安卓應用安裝包
二、步驟
(1)在源碼packages/apps
目錄下以我們需要內置的APK名字來創(chuàng)建一個新的文件夾
以 qqmusic.apk 為例,在Android_12_AOSP/packages/apps
目錄下新建qqmusic文件夾
cd Android_12_AOSP/packages/apps/
mkdir qqmusic
(2)將 qqmusic.apk 放入建好的文件夾中,在文件夾中創(chuàng)建 Android.mk 文件
cd Android_12_AOSP/packages/apps/qqmusic/
touch Android.mk
(3)編輯 Android.mk 文件內容,內容如下
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := CarSkin.apk
LOCAL_MODULE_CLASS := APPS
#可以為user、eng、tests、optional,optional代表在任何版本下都編譯
LOCAL_MODULE_TAGS := optional
#編譯模塊的名稱
LOCAL_MODULE := CarSkin
#可以為testkey、platform、shared、media、PRESIGNED(使用原簽名),platform代表為系統(tǒng)應用
LOCAL_CERTIFICATE := PRESIGNED
#不設置或者設置為false,安裝位置為system/app,如果設置為true,則安裝位置為system/priv-app?
LOCAL_PRIVILEGED_MODULE := false
#module的后綴,可不設置
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# 關閉預編譯,不會生成OAT文件
LOCAL_DEX_PREOPT := true
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)
或
# Test
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := qqmusic
LOCAL_MODULE_CLASS := APPS
#可以為user、eng、tests、optional,optional代表在任何版本下都編譯
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_DEX_PREOPT := nostripping
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#不設置或者設置為false,安裝位置為system/app,如果設置為true,則安裝位置為system/priv-app
LOCAL_PRIVILEGED_MODULE := true
#可以為testkey、platform、shared、media、PRESIGNED(使用原簽名),platform代表為系統(tǒng)應用
LOCAL_CERTIFICATE := platform
#覆蓋安裝
#LOCAL_OVERRIDES_PACKAGES := DeviceTest RKDeviceTest
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MULTILIB := 32
#LOCAL_REQUIRED_MODULES :=
#JNI_LIBS :=
#$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/ -name *.so), $(eval JNI_LIBS += $(FILE)))
#LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))
include $(BUILD_PREBUILT)
預裝帶源碼的APP到系統(tǒng)
Android.bp文件
// Android依賴導入
android_library_import {
name: "com.google.android.material_material",
aars: ["material-1.6.0.aar"],
sdk_version: "current",
min_sdk_version: "14",
static_libs: [
"androidx.annotation_annotation",
"androidx.appcompat_appcompat",
"androidx.cardview_cardview",
"androidx.coordinatorlayout_coordinatorlayout",
"androidx-constraintlayout_constraintlayout",
"androidx.core_core",
"androidx.dynamicanimation_dynamicanimation",
"androidx.annotation_annotation-experimental",
"androidx.fragment_fragment",
"androidx.lifecycle_lifecycle-runtime",
"androidx.recyclerview_recyclerview",
"androidx.transition_transition",
"androidx.vectordrawable_vectordrawable",
"androidx.viewpager2_viewpager2",
"androidx.drawerlayout_drawerlayout",
],
}
//
// Build rule for app.
//
android_app {
//name: "DebuggingRestrictionController",
//srcs: ["app/src/main/java/**/*.java", "soong/BuildConfig.java", "soong/FirebaseApplication.java"],
//resource_dirs: ["app/src/main/res"],
//manifest: "soong/AndroidManifest.xml",
//sdk_version: "system_current",
//certificate: "platform",
//privileged: true,
//optimize: {
// enabled: true,
// proguard_flags_files: ["app/proguard-rules.pro"],
//},
name: "CarSkin",
//使用以下構建標記向 product 分區(qū)中安裝模塊。
product_specific: true,
//導入 src 文件內容
srcs: [
"src/**/*.java"
],
//資源導入模塊,如果aar包中帶資源文件,需要將aar包解壓拷貝資源文件,在源碼根目錄下新建一個 res-lottie 文件夾,將資源文件拷入此目錄
//resource_dirs: [
// "res-lottie",
//],
libs: [
"res-lottie"
],
//libs: [],
sdk_version: "current",
min_sdk_version: "14",
target_sdk_version: "current",
//platform_apis:true,
certificate: "platform",
//privileged: true,
//system_ext_specific: true,
//導入manifest文件
manifest: "app/src/main/AndroidManifest.xml",
//添加manifest文件模塊
//additional_manifests: [
// "AndroidManifest-common.xml",
//],
//導入靜態(tài)庫
static_libs: [
"com.google.android.material_material"
],
//apptflags: [
// "--extra-packages",
// "com.google.android.material" //導入aar包包名,用于生成 R 文件
//],
}
(4)下面我們需要將將創(chuàng)建的qq音樂編譯模塊加入到編譯系統(tǒng),我們找到 /Android_12_AOSP/build/make/target/product/handheld_product.mk
文件,在文件下面這個位置加入qqmusic
PRODUCT_PACKAGES += \
apps \
qqmusic
進入源碼根目錄,重新編譯文章來源:http://www.zghlxwxcb.cn/news/detail-786414.html
cd Android_12_AOSP/
source build/envsetup.sh # 導入環(huán)境
lunch 12 # 選擇系統(tǒng)
make -j6 # 編譯
make snod # 快速打包生成最新的system.img文件
問題記錄:
注意:每次內置應用或修改mk文件時,一定要重新編譯 system.img 然后在啟動模擬器
錯誤1
FAILED: out/target/common/obj/APPS/qqmusic_intermediates/enforce_uses_libraries.
status
/bin/bash -c "(rm -f out/target/common/obj/APPS/qqmusic_intermediates/enforce_us
es_libraries.status ) && (build/soong/scripts/manifest_check.py --enfo
rce-uses-libraries --enforce-uses-libraries-status out/target/common/obj/
APPS/qqmusic_intermediates/enforce_uses_libraries.status --aapt out/hos
t/linux-x86/bin/aapt packages/apps/qqmusic/
qqmusic.apk )"
error: mismatch in the <uses-library> tags between the build system and the manifest:
- required libraries in build system: []
vs. in the manifest: []
- optional libraries in build system: []
vs. in the manifest: [org.apache.http.legacy]
- tags in the manifest (packages/apps/qqmusic/qqmusic.apk):
uses-library-not-required:'org.apache.http.legacy'
note: the following options are available:
- to temporarily disable the check on command line, rebuild with RELAX_U
SES_LIBRARY_CHECK=true (this will set compiler filter "verify" and disable AOT-c
ompilation in dexpreopt)
- to temporarily disable the check for the whole product, set PRODUCT_BR
OKEN_VERIFY_USES_LIBRARIES := true in the product makefiles
- to fix the check, make build system properties coherent with the manif
est
- see build/make/Changes.md for details
12:19:02 ninja failed with: exit status 1
解決方法
修改Android.mk,添加LOCAL_ENFORCE_USES_LIBRARIES := false
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := SogouInput
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_ENFORCE_USES_LIBRARIES := false
include $(BUILD_PREBUILT)
錯誤2
輸入命令報錯
adb install -r /home/lai/下載/SogouInput_v11.7_Build_40e311fcaf0_20220714_android_sweb.apk
adb: failed to install /home/lai/下載/SogouInput_v11.7_Build_40e311fcaf0_20220714_android_sweb.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
問題當前的app使用的native libraries與模擬器的CPU架構不一致所導致的
錯誤3
[100% 1/1] Creating out/target/product/generic_car_x86/VerifiedBootParams.textproto
FAILED: out/target/product/generic_car_x86/VerifiedBootParams.textproto
/bin/bash -c "(export AVBTOOL=out/host/linux-x86/bin/avbtool; device/generic/goldfish/tools/mk_vbmeta_boot_params.sh out/target/product/generic_car_x86/vbmeta.img out/target/product/generic_car_x86/system.img out/target/product/generic_car_x86/VerifiedBootParams.textproto)"
/home/lai/Android_12_AOSP/out/host/linux-x86/bin/avbtool: Given image does not look like a vbmeta image.
/home/lai/Android_12_AOSP/out/host/linux-x86/bin/avbtool: Given image does not look like a vbmeta image.
expr: 語法錯誤:“+” 后缺少參數(shù)
ninja: build stopped: subcommand failed.
14:25:23 ninja failed with: exit status 1
#### failed to build some targets (04:34 (mm:ss)) ####
錯誤4
問題:系統(tǒng)卡在開機動畫進不去
原因:內置一個apk時,因為軟件簽名問題,導致系統(tǒng)服務啟動不了
解決方法:將軟件刪掉重新編譯就行
過程中常用的命令
通過adb安裝應用
adb install -r /home/lai/下載/SogouInput_v11.7_Build_40e311fcaf0_20220714_android_sweb.apk
通過adb查看安裝的應用包名
adb shell pm list packages #只顯示應用包名
adb shell pm list packages -f #顯示應用包名及路徑
adb shell dumpsys package > ./package.txt
adb shell am switch-user 10
adb shell pm list users
執(zhí)行make clean
將會會刪除out/目錄下所有內容。
make clean
執(zhí)行make clobber
效果等同于make clean
,也是刪除out/目錄下所有內容。
make clobber
執(zhí)行make installclean
將會刪除installclean_files
,installclean_files
make installclean
查詢手機cpu命令行:
adb shell getprop ro.product.cpu.abi
開機日志的獲?。?/p>
adb logcat -b main -b system -b radio -b events -v time > bootLog.log
adb 日志獲取
adb logcat
通過關鍵字查找文件所在位置
grep "Calendar" ./ -rn
grep "Contacts" ./ -rn
自定義內置apk流程
(1)在源碼根目錄 /vendor
下新建一個test
文件夾
mkdir test
(2)在 test
文件目錄下新建一個 test.mk
文件
touch test.mk
(3)在源碼test
目錄下以我們需要內置的APK名字來創(chuàng)建一個新的文件夾
- 以 ABC.apk為例,在
test
目錄下新建ABC文件夾
mkdir ABC
(4)將 ABC.apk 放入ABC
文件夾中,在文件夾ABC
中創(chuàng)建 Android.mk 文件
touch Android.mk
Android.mk
文件的內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ABC
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := ABC.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := false
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
(5)打開我們建好的 test.mk
文件,在里面加入以下內容,將ABC模塊加入到編譯系統(tǒng)
PRODUCT_PACKAGES += \
ABC \
user
(6)將我們建的 test.mk
加入到編譯環(huán)境中,這樣我們后面需要新加入模塊就能直接在test.mk里配置了
我們在源碼根目錄下找到 device/rockchip/rk3588/device.mk
文件
注:這個路徑以及上面的
/vendor
目錄一般是項目中存放內置apk的路徑,不同項目路徑可能不同,根據(jù)自己實際路徑來選擇,一般都是在源碼根目錄的/device
目錄下
將下面內容加入到文件如下對應位置
#$(call inherit-product-if-exists, vendor/rockchip/common/npu/npu.mk)
$(call inherit-product-if-exists, vendor/test/test.mk) # 我們配置的文件,加入進來
$(call inherit-product-if-exists, vendor/firefly/firefly.mk)
(7)最后我們進入源碼根目錄重新編譯源碼
進入源碼根目錄,重新編譯
source build/envsetup.sh # 導入環(huán)境
lunch # 選擇系統(tǒng),選擇自己的系統(tǒng)
make installclean # 清除out目錄下對應板文件夾中的內容
make -j6 # 編譯,如果這一步生成了最新的鏡像文件,那不需要進行下一步了
make snod # 快速打包生成最新的system.img文件
后面我們如果需要繼續(xù)添加新apk,只需要重復(3)(4)(5)(7)步驟就行文章來源地址http://www.zghlxwxcb.cn/news/detail-786414.html
到了這里,關于【Android 12 AOSP學習】Android內置第三方apk到系統(tǒng)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!