(学习课程为千里马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文件,告知构建系统这是一个预构建模块,应按照预构建模块的规则进行处理。