【Android 12 AOSP学习】Android内置第三方apk到系统

这篇具有很好参考价值的文章主要介绍了【Android 12 AOSP学习】Android内置第三方apk到系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章将介绍如何在Android系统中内置第三方apk

一、准备工作

  • 编译好的Android源码
  • Android apk文件:也就是安卓应用安装包

二、步骤

(1)在源码packages/apps目录下以我们需要内置的APK名字来创建一个新的文件夹

qqmusic.apk 为例,在Android_12_AOSP/packages/apps目录下新建qqmusic文件夹

cd Android_12_AOSP/packages/apps/
mkdir qqmusic

(2)将 qqmusic.apk 放入建好的文件夹中,在文件夹中创建 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代表为系统应用
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代表为系统应用
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到系统

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 分区中安装模块。
    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",
    //],
    
    //导入静态库
    static_libs: [
        "com.google.android.material_material"
    ],
    
    //apptflags: [
    //  "--extra-packages",
    //  "com.google.android.material" //导入aar包包名,用于生成 R 文件
    //],

}

(4)下面我们需要将将创建的qq音乐编译模块加入到编译系统,我们找到 /Android_12_AOSP/build/make/target/product/handheld_product.mk

文件,在文件下面这个位置加入qqmusic

PRODUCT_PACKAGES += \
    apps \
    qqmusic 

进入源码根目录,重新编译

cd Android_12_AOSP/
source build/envsetup.sh # 导入环境
lunch 12  # 选择系统
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: 语法错误:“+” 后缺少参数
ninja: build stopped: subcommand failed.
14:25:23 ninja failed with: exit status 1

#### failed to build some targets (04:34 (mm:ss)) ####

错误4

问题:系统卡在开机动画进不去

原因:内置一个apk时,因为软件签名问题,导致系统服务启动不了

解决方法:将软件删掉重新编译就行

过程中常用的命令

通过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

执行make clean将会会删除out/目录下所有内容。

make clean

执行make clobber效果等同于make clean,也是删除out/目录下所有内容。

make clobber

执行make installclean将会删除installclean_files,installclean_files

make installclean

查询手机cpu命令行:

adb shell getprop ro.product.cpu.abi

开机日志的获取:

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名字来创建一个新的文件夹

  • 以 ABC.apk为例,在test目录下新建ABC文件夹
mkdir ABC

(4)将 ABC.apk 放入ABC文件夹中,在文件夹ABC中创建 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模块加入到编译系统

PRODUCT_PACKAGES += \
    ABC \
    user 

(6)将我们建的 test.mk 加入到编译环境中,这样我们后面需要新加入模块就能直接在test.mk里配置了

我们在源码根目录下找到 device/rockchip/rk3588/device.mk 文件

注:这个路径以及上面的/vendor目录一般是项目中存放内置apk的路径,不同项目路径可能不同,根据自己实际路径来选择,一般都是在源码根目录的 /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 # 导入环境
lunch   # 选择系统,选择自己的系统
make installclean # 清除out目录下对应板文件夹中的内容
make -j6  # 编译,如果这一步生成了最新的镜像文件,那不需要进行下一步了
make snod  # 快速打包生成最新的system.img文件

后面我们如果需要继续添加新apk,只需要重复(3)(4)(5)(7)步骤就行文章来源地址https://www.toymoban.com/news/detail-786414.html

到了这里,关于【Android 12 AOSP学习】Android内置第三方apk到系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 12.0 第三方输入法app设置系统默认输入法

    在12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置输入法的相关功能需求,然后根据输入法包名来设置默认输入法 在设置系统默认输入法中 每个系统输入法的id不同 根据id设置输入法 需要先根据需要设置默认输入法的id,来

    2024年02月07日
    浏览(42)
  • Java 音频播报(内置 + 第三方)

            jdk内置的可以使用,不过呢就是声音太原始了,这是同过输入文字然后识别读出来的。 1、导入JL的依赖 2、代码实现         这个是通过文件播报的,可以在网上下载自己需要的音频 最近在做项目,做外卖的,其中有一个功能就是接单,商家接单就需要用到这个功

    2024年02月02日
    浏览(35)
  • Android Pdf第三方框架

    导入AndroidPdfViewer 在 repositories 里面添加库 布局文件引用PDFView PdfViewer 为我们提供了以下几种读取文件的方法: Configurator 主要方法 PDFView 其他方法 github地址: https://github.com/barteksc/AndroidPdfViewer 导入mupdf 在 repositories 里面添加库 mupdf提供了解析代码, Document 读取pdf文件, Androi

    2024年02月13日
    浏览(43)
  • Android 解决第三方库版本冲突

    在开发游戏SDK时会使用一些第三方库,例如上文提到的 OkHttp ,或者集成某些第三方,而这些第三方使用的系统库(例如 supportv7)和项目组使用的版本不一致,在编译时就会出现版本冲突问题。解决办法有两个: 尽量不使用第三库,例如针对 OkHttp ,如果没有特殊的需求(比

    2023年04月27日
    浏览(92)
  • Android Studio查看第三方库依赖树

    在Android开发过程中,我们或多或少都会引入第三方库,引入的库越多,越容易产生库之间的依赖冲突,所以我们今天一起来了解Android Studio查看第三方库依赖树。 下面就拿我遇到的问题还原一下: 之前接人容联客服系统的时候,集成完成后进入客服页面发生闪退,我们回顾

    2024年02月08日
    浏览(40)
  • Android Studio连接使用第三方模拟器

           使用Android Studio自带的模拟器,第一会比较卡,第二配置容易出错,第三,自带的模拟器很吃电脑配置。如果电脑配置较差,会比较耽误事。所以为例解决上面三个问题,可以在电脑上按照第三方手机模拟器,例如:夜神模拟器、雷电模拟器、MUMU模拟器等等,不管是

    2024年01月15日
    浏览(39)
  • Android 项目调用第三方库so动态库

    在Android NDK开发中,可以通过自己编写C/C++代码来构建so动态库进行调用之外,还可以把so动态库提供给第三方使用;接下来,我将介绍在新创建的Android 项目(或已存在的Android 项目)中如何调用第三方so动态库。 关于如何进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用

    2024年02月16日
    浏览(34)
  • Android常用的第三方库--.jar、.aar

    JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文 件。JAR是 Java 的一种文档格式,是一种与平台无关的文件格式,可将多个文件合成一个文件。只包含了class文件与清单文件 , 不包含资源文件,如图片等所有res中的文件 。 JAR的优

    2024年02月03日
    浏览(34)
  • Android Studio引用第三方库的方式

    title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 这里描述的第三方库文件格式指的是 so aar so库介绍一种方法 Aar介绍两种方法 libs目录

    2024年02月08日
    浏览(40)
  • 【Android Studio】第三方库 图表(MPAndroidChart)使用

    项目目录-app-build.gradle 项目目录-app-setting.gradle ​ 该类是图表的控件,类似于按键、图片,是从 xml 文件中通过 id 获取到的。 获取/创建 常用方法 方法名 描述 chart.setDrawBorders( boolean ) 是否显示图表边界,true:显示,默认 false chart.setScaleEnabled( boolean ) 是否使能缩放,true:使

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包