signed

QiShunwang

“诚信为本、客户至上”

[Android 基础] -- 把 apk、so 等文件,打包到 system.img 的方法 —— PRODUCT_PACKAGES 与 PRODUCT_COPY_FILES

2021/4/26 16:20:58   来源:

本文说的打包是指在 aosp 中用 make -j8 编译后,把自己需要的文件打包到 system.img 中。

这里有两种情况,第一种是 apk、so 是第三方提供的,已经编译好了,只要打包到 system.img 即可;第二种是有 apk、so 的源码,并且需要放在 aosp 中编译。

一、第一种情况 —— PRODUCT_COPY_FILES

可以修改 device.mk 中的 PRODUCT_COPY_FILES,这里用 android4.0 中自带的 device/ti/panda 来修改。

在 device/ti/panda 增加已经自己的文件夹,并且把需要打包的文件,拷贝到文件夹下:

root@xxx:/mnt/ics-android/ics-src/device/ti/panda# ls my/*
my/app:
my.apk
 
my/bin:
my.sh
 
my/fonts:
 
my/lib:
libmy.so

这里在 device/ti/panda 下增加了一个文件夹 my,并且在 my 下面增加了 app、bin、fonts、lib,对应 out/target/product/panda/system 下面的目录,在 device.mk 的最后增加:

PRODUCT_COPY_FILES += \
        device/ti/panda/my/app/my.apk:system/app/my.apk \
        device/ti/panda/my/bin/my.sh:system/bin/my.sh \
        device/ti/panda/my/lib/libmy.so:system/lib/libmy.so

二、第二种情况 —— PRODUCT_PACKAGES

同样需要修改 device.mk,把需要打包的文件添加到变量 PRODUCT_PACKAGES 中:

PRODUCT_PACKAGES += \
    libmy \
    my

注意这里的名字要求和模块的 Android.mk 中,指定生成的文件名称相同,例如:

LOCAL_MODULE := libmy

或者

LOCAL_PACKAGE_NAME := my

同时,还要求模块的 Android.mk 中变量 LOCAL_MODULE_TAGS 值为 optional

LOCAL_MODULE_TAGS := optional

在 aosp 的 build 目录下有多处指定打包文件的地方,可以参考下:

root@xxx:/ics-android/ics-src/build# grep PRODUCT_PACKAGES * -rn
core/main.mk:614:                       $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES))
core/Makefile:315:      $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \
core/product.mk:68:    PRODUCT_PACKAGES \
core/base_rules.mk:93:    $(warning *    into the PRODUCT_PACKAGES section of product)
core/base_rules.mk:99:    $(warning * PRODUCT_PACKAGES section of)
target/product/large_emu_hw.mk:22:PRODUCT_PACKAGES := \
target/product/sdk.mk:20:PRODUCT_PACKAGES := \
target/product/sdk.mk:71:PRODUCT_PACKAGES += \
target/product/sdk.mk:91:PRODUCT_PACKAGES += \
target/product/sdk.mk:132:PRODUCT_PACKAGES += \
target/product/core.mk:25:PRODUCT_PACKAGES := \
target/product/core.mk:111:    PRODUCT_PACKAGES += \
target/product/full_x86.mk:29:PRODUCT_PACKAGES := \
target/product/full_x86.mk:36:PRODUCT_PACKAGES += \
target/product/full.mk:22:PRODUCT_PACKAGES := \
target/product/generic_no_telephony.mk:22:PRODUCT_PACKAGES := \
target/product/generic_no_telephony.mk:48:PRODUCT_PACKAGES += \
target/product/generic_no_telephony.mk:51:PRODUCT_PACKAGES += \
target/product/generic_no_telephony.mk:57:PRODUCT_PACKAGES += \
target/product/telephony.mk:20:PRODUCT_PACKAGES := \
target/product/full_base_telephony.mk:22:PRODUCT_PACKAGES := \
target/product/full_base.mk:22:PRODUCT_PACKAGES := \
target/board/generic/device.mk:29:PRODUCT_PACKAGES := \

扩展:

关于预置的方法,具体可参考另一篇博文:Android定制:预置应用程序