• Android 11源码——预置无源码apk到Android系统(带so文件)


    Android 11源码——预置无源码apk到Android系统(带so文件)

    1. packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为 MyExample 的APK为例。
      在这里插入图片描述

    2. MyExample.apk 放到 packages/apps/MyExample 下面。
      在这里插入图片描述

    3. packages/apps/MyExample 下面创建文件 Android.mk,文件内容如下:

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE_TAGS := optional
      LOCAL_MODULE := < your app folder name >
      # 签名
      LOCAL_CERTIFICATE := < desired key >
      # 指定 src 目录
      LOCAL_SRC_FILES := < app apk filename >
      LOCAL_MODULE_CLASS := APPS
      # 该模块的后缀,不用定义
      #LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
      include $(BUILD_PREBUILT)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    解释:

    • LOCAL_PATH := $(call my-dir)
      每个 Android.mk 文件必须以定义 LOCAL_PATH 为开始,它用于在开发 tree 中查找源文件。

    • include $(CLEAR_VARS)
      CLEAR_VARS 变量由 Build System 提供,并指向一个指定的 GNU Makefile,由它负责清理很多 LOCAL_xxx。
      例如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES 等等,但不清理 LOCAL_PATH。

    • LOCAL_MODULE_TAGS := user eng tests optional
      可选定义,表示在什么版本情况下编译该版本,默认 optional

      user: 指该模块只在 user 版本下才编译
      eng: 指该模块只在 eng 版本下才编译
      tests: 指该模块只在 tests 版本下才编译
      optional:指该模块在所有版本下都编译

    • LOCAL_MODULE
      模块名,可不用定义,默认 = $(LOCAL_PACKAGE_NAME),不能和既有模块相同,如果该变量未设置,则使用 LOCAL_PACKAGE_NAME,如果再没有,就会编译失败。

    • LOCAL_CERTIFICATE
      在什么情况下签名。

      testkey:普通 APK,默认情况下使用。
      platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的 APK 所在进程的 UID 为 system,可以参见 Settings。
      shared:该 APK 需要和 home/contacts 进程共享数据,可以参见 Launcher。
      media:该 APK 是 media/download 系统中的一环,可以参见 Gallery。

    • LOCAL_MODULE_CLASS
      指定模块的类型,可不用定义。

      # 编译 apk 文件
      LOCAL_MODULE_CLASS := APPS
      # 编译 jar 包
      LOCAL_MODULE_CLASS := JAVA_LIBRAYIES
      # 定义动态库文件
      LOCAL_MODULE_CLASS := SHARED_LIBRAYIES
      # 编译可执行文件
      LOCAL_MODULE_CLASS := EXECUTABLES
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • include $(BUILD_PACKAGE)
      表示生成一个 apk,它可以是多种类型

      BUILD_PACKAGE(既可以编apk,也可以编资源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
      BUILD_JAVA_LIBRARY(java共享库)
      BUILD_STATIC_JAVA_LIBRARY(java静态库)
      BUILD_EXECUTABLE(执行文件)
      BUILD_SHARED_LIBRARY(native共享库)
      BUILD_STATIC_LIBRARY(native静态库)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    1. 解压apk,将其中的lib目录也放置到当前目录中。并在Android.mk文件中添加.so的引用。
    LOCAL_PREBUILT_JNI_LIBS := lib\arm64-v8a\xxxx.so
    
    • 1

    Android.mk文件完整配置:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    # Module name should match apk name to be installed
    LOCAL_MODULE := MyExample
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    LOCAL_PREBUILT_JNI_LIBS := lib\arm64-v8a\xxxx.so
    LOCAL_CERTIFICATE := PRESIGNED
    include $(BUILD_PREBUILT)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 将需要预置的app添加到系统编译中。
      1)aosp/build/目录下查找添加文件的位置:
      因为系统自带了Calendar日历应用,所以我们可以通过查找Calendar所在的文件位置,确定需要添加文件的位置:
      grep "Calendar" ./ -rn
      grep "Contacts" ./ -rn
      
      • 1
      • 2

    在这里插入图片描述

    2)打开我们查找到的文件`aosp/build/make/target/product/handheld_product.mk`,在文件中添加内容:
    ```
    PRODUCT_PACKAGES += \
    		MyExample\
    ```
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    1. 使用 mmm 命令来编译指定的模块:
      cd ~/aosp/packages/apps/MyExample
      mmm
      
      • 1
      • 2

    在这里插入图片描述

    1. 重新编译system.img
      cd ~/aosp
      make snod
      
      • 1
      • 2

    在这里插入图片描述

    说明:如果编译过程报错:

    build/make/core/Makefile:2787: warning: Warning: with dexpreopt enabled, you may need a full rebuild.
    15:02:00 Excepted "out/target/product/sargo/.installable_files" to be readable
    
    • 1
    • 2

    在这里插入图片描述

    将dex优化关闭:packages/apps/MyExample/Android.mk

    LOCAL_DEX_PREOPT := false
    
    • 1

    回到第5步重新编译指定模块及system.img:

    这时候就能成功编译,如图:
    在这里插入图片描述

    1. 将编译生成的system.img烧到设备中验证。
    adb reboot bootloader
    fastboot reboot fastboot
    fastboot flash system system.img
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    1. 重启手机,查看是否内置了我们添加的apk。
      在这里插入图片描述
  • 相关阅读:
    第1章 数据库及其表的自动生成与前言
    Qt QCustomPlot介绍
    SpringBoot+MyBatis flex实现简单增删改查
    【C++】加了<string.h>还是报“strlen:找不到标识符”的错误
    栈(Java)
    CS_上线三层跨网段机器(完整过程还原)
    python-web应用程序-Django-From组件
    Fedora Linux 下使用dnf安装opengl或者叫做mesa
    gdb相关初始化配置,包括在vscode中配置gdb初始化参数
    OpenCV之稠密光流
  • 原文地址:https://blog.csdn.net/tracydragonlxy/article/details/124244798