Android8系统内使用apk预装

(学习课程为千里马framework的教程,整理成笔记自用)

1. 在package/apps/ 目录下创建一个以apk名字命名的目录.
   >> package/apps/MyApp
2. 在 build/make/target/product/core.mk 目录下,加入apk的名字.
 第二步中,主要参考Launcher2的启动。

在build目录下,输入:

grep "Launcher2" ./ -rn

得到如下信息:

~/core/Android8/android-8.1.0_r1/build$ grep "Launcher2" ./ -rn
./make/target/product/core.mk:45:    Launcher2 \

进入core.mk文件:

PRODUCT_PACKAGES += \

在PRODUCT_PACKAGES 最末段,加入apk的名字 >>  MyApp

接下来,重新回到package/apps/MyApp 目录下,将需要预装的apk导入其中,并创建一个Android.mk文件。


第一次配置文件Android.mk文件如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)") #打印输出
#Module name should match apk name to be installed
LOCAL_MODULE := MyApp

LOCAL_MODULE := optional
#设置模块标签,通常是 optional 或者是 eng user等
#这里的optional表示不管是user 还是eng 版本都会编译此app

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED
#设置证书,如果是预签名APK,可以使用 PRESIGNED

include $(BUILD_PREBUILT) 
#包含构建APK的规则

 回到根目录下,执行 make -j4 命令后出现一下报错信息:

[544/996] including ./packages/apps/MyApp/Android.mk ...
./packages/apps/MyApp/Android.mk:4: warning: "MyApp of LOCAL_PATH is packages/apps/MyApp"
build/core/java_common.mk:140: warning: packages/apps/MyApp/Android.mk: MyApp: Unused source files: MyApp.apk
build/core/java.mk:405: error: packages/apps/MyApp: Target java module does not define any source or resource files.
14:54:00 ckati failed with: exit status 1

#### failed to build some targets (17 seconds) ####

packages/apps/MyApp: Target java module does not define any source or resource files.
这条报错信息表明,在资源文件或者源文件的定义上存在问题。这可能和LOCAL_SRC_FILES 被设置为 apk文件有关。
(当尝试构建一个预装的APK文件时,如果直接使用LOCAL_SRC_FILES,构建系统会期望找到源代码或资源文件,而实际上已经有了一个预构建的APK 文件,这时就会出现“Target java module does not define any source or resource files"的错误。)

        LOCAL_SRC_FILES被设置为APK文件,这导致系统将其误认为是源文件,从而引发构建错误。
        通过将LOCAL_SRC_FILES 替换为 LOCAL_PREBUILT_MODULE_FILE,并使用 BUILD_PREBUILT宏可以解决“Target java module does not define any source or resource files”的错误。

        还需指定APK安装路径:将apk文件安装到 /system/app目录下

LOCAL_MODULE_PATH := $(TARGET_OUT)/app

最终修改后的Android.mk文件为:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

$(warning "MyApp of LOCAL_PATH is$(LOCAL_PATH)")
LOCAL_MODULE    := MyApp
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_MODULE_FILE := $(LOCAL_PATH)/$(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/app

include $(BUILD_PREBUILT)

将上述Android.mk文件和MyApp.apk导入 /package/apps/MyApp 目录下,在回到根目录下

( Android.mk的作用:
        Android.mk文件是Android构建系统的一部分,用于描述如何构建一个模块(如库、可执行文件或预构建文件)。
        1:模块定义:Android.mk文件定义类模块的基本信息,包括模块名称、类别、证书类型等。

LOCAL_MODULE    := MyApp
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED

        2:预构建文件指定:通过 LOCAL_PREBUILT_MODULE_FILE变量,指定预构建的APK文件路径。这里会告诉构建系统,该模块是一个预构建文件,不需要编译:

LOCAL_PREBUILT_MODULE_FILE := $(LOCAL_PATH)/$(LOCAL_MODULE).apk

        3:安装路径设置:使用LOCAL_MODULE_PATH 变量指定APK文件在系统镜像中的安装路径。例如安装到 /system/app 目录:

LOCAL_MODULE_PATH := $(TARGET_OUT)/app

        4:构建宏包含:最后,通过包含BUILD_PREBUILT宏,告知构建系统如何处理这个预构建模块:

include $(BUILD_PREBUILT)

分析:LOCAL_PREBUILT_MODULE_FILE 和 LOCAL_SRC_FILES 的区别
LOCAL_SRC_FILES:
       
这个变量用于指定模块的源代码文件。
        对于Java模块,它通常包含Java源文件( .java ) 的路径
        构建系统会是使用这些源文件来编译生成APK或JAR文件
LOCAL_PREBUILT_MODULE_FILE:
       
这个变量用于指定预构建模块的文件路径
        当有一个已经编译好的APK或JAR文件,并且不想让构建系统再次编译它时,可以使用这个变量
        构建系统会直接使用这个预购文件,而不会编译任何代码
LOCAL_MODULE_PATH 变量用于指定模块的安装路径。

        LOCAL_MODULE_PATH := $(TARGET_OUT)/app

        其中的$(TARGET_OUT)/app 就是 /system/app 。这个目录通常用于存放系统级的应用程序 APK文件。

        如果不指定 LOCAL_MODULE_PATH,模块默认会被安装到 /system/lib 目录下 ,这对文件来说是不正确的。APK文件需要被安装到 /system/app 或者 /system/priv-app 目录下,以便系统能够正确地识别和启动他们。

1: LOCAL_PATH := $(call my-dir)

        作用:设置LOCAL_PATH变量为当前Android.mk文件所在目录路径。my-dir是一个内置函数,用于返回当前目录路径。
2:include $(CLEAR_VARS)
        作用:包含CLEAR_VARS文件,该文件不会重置所有以LOCAL开头的变量,确保在定义新模块时不会收到之前模块干扰。

3:$(warning "MyApp of LOCAL_PATH is$(LOCAL_PATH)")
        作用:使用warning函数在构建过程中输出一条警告信息,显示当前的LOCAL_PATH 路径,便于调试和确认路径的正确性。
4: LOCAL_MODULE := MyApp
        作用:定义模块的名称微 MyApp 。 LOCAL_MODULE是每个模块必须设置的变量。

5:LOCAL_MODULE_TAGS := optional
        作用:设置模块标签为 optional , 表示该模块是可选的,不是构建产物中必须包含的。
6: LOCAL_PREBUILT_MODULE_FILE := $(LOCAL_PATH)/$(LOCAL_MODULE).apk

        作用:指定预构建模块的路径为LOCAL_PATH目录下的MyApp.apk文件。
7:LOCAL_MODULE_CLASS := APPS

        作用:设置模块的类别为 APPS , 这表示这是一个应用程序模块。

8:LOCAL_CERTIFICATE := PRESIGNED

        作用:设置模块的证明书类型微 persigned,表示模块已经签署了,不需要再次签名了

9: LOCAL_MODULE_PATH := $(TARGET_OUT)/app

        作用:指定模块在最终构建产物中的安装路径微 (TARGET_OUT)目录下的app目录中,即 /system/app 目录下。

10:include $(BUILD_PREBUILT)

        作用:包含 BUILD_PREBUILT文件,告知构建系统这是一个预构建模块,应按照预构建模块的规则进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值