预置APK到android系统中(带源码不带源码)⼀、如何将带源码的APK预置进系统?
1.⾸先将app代码放在源码中
1.1 可以放在vendor ⽬录下⾃⼰项⽬的package/app/下⾯
1.2 可以放在vendor/google/partner_gms/apps 或者 vendor/mtk/qcom 等
1.3 也可以直接放在 packages/apps/ 下⾯
2.以android studio中app⼯程源码为例,把⼯程⽬录下⽂件拷贝1.1中放置在源码的位置
3.在⽬录下添加 Android.mk ⽂件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#这个主要⽤于是 eng、user还是 userdebug 版本参与编译; optional值所有版本都参与编译
LOCAL_MODULE_TAGS  := optional
#编译的java⽂件⽂件路径
LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main/java)
#需要编译的 l ⽂件
LOCAL_MANIFEST_FILE := app/src/l
#编译的资源⽂件⽂件路径
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res
#编译出的apk的名称
LOCAL_PACKAGE_NAME := XXXX
#apk 签名
LOCAL_CERTIFICATE := platform
#LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_SDK_VERSION =current
include $(BUILD_PACKAGE)
include $(CLEAR_VERS)
include $(call all-makefiles-under,$(LOCAL_PATH))
4.添加到系统中进⾏编译
打开⽂件 device/下的.mk , 将ApkTest添加到 PRODUCT_PACKAGES ⾥⾯。
PRODUCT_PACKAGES += ApkTest
重新 build 整个⼯程
⼆.将⽆源码的 APK 预置进系统
1.⾸先将apk放在源码中,参考上⾯ 源码的apk预置系统的第⼀步
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := ApkTest
LOCAL_MODULE_TAGS := optional
java影视app源码LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
2.添加到系统中进⾏编译
打开⽂件 device/下的.mk , 将ApkTest添加到 PRODUCT_PACKAGES ⾥⾯。
PRODUCT_PACKAGES += ApkTest
重新 build 整个⼯程
3.需要注意的是,如果这个apk带有so⽂件。需要将lib/arm下的so⽂件按照LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libcom_iflytek_inputmethod_mmp.so
这样的格式来写。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := ApkTest
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/armeabi/libcom_iflytek_inputmethod_mmp.so \
@lib/armeabi/libdexopt.so  \
@lib/armeabi/libmsc-v8.so  \
@lib/armeabi/libNativeCrashCollect.so \
@lib/armeabi/libsmartaiwrite-jni-v22.so \
@lib/armeabi/libvadLib-v5.so \
@lib/armeabi/libwatchdog.so
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
三 .附加:Android.mk中的相关配置项
内置Apk的关键点在于配置编译⽂件,即Android.mk⽂件,下⾯介绍⼀部分Android.mk中的相关配置项,更多的可以去⽹上寻:LOCAL_PRIVILEGED_MODULE
1. 决定编译后apk的位置,如果设置为true,则⽣成在/system/priv-app,如果不设置或false,则⽣成在/system/app。
2. 复制代码
LOCAL_CERTIFICATE
1. LOCAL_CERTIFICATE可设置的值如下:
2. testkey 默认使⽤,普通的apk
3. platform APK所在进程的UID为system,完成⼀些系统的核⼼功能
4. shared
5. media
6. 复制代码
$(call my-dir)
1. 获取当前⽂件夹的路径
2. 复制代码
$(call all-java-files-under, src)
1. 获取src⽬录下所有java⽂件
2. 复制代码
$(call all-makefiles-under,local_path)
1. 获取local_path⽬录下所有Make⽂件
2. 复制代码
LOCAL_PATH
1. LOCAL_PATH := $(call my-dir)
2. 此变量指⽰源⽂件在开发树中所处的位置。在这⾥,构建系统提供的宏函数 my-dir 将返回当前⽬录(Android.mk ⽂件本⾝所在的⽬
录)的路径。
3. 复制代码
CLEAR_VARS
1. include $(CLEAR_VARS)
2. 由构建系统提供, CLEAR_VARS 变量指向⼀个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,GNU Makefile 不会清除
LOCAL_PATH
3. 复制代码
LOCAL_MODULE
1. LOCAL_MODULE := ApkTest
2. 存储您要构建的模块的名称,每个模块名称必须唯⼀,且不含任何空格.如果未设置,则默认使⽤LOCAL_PACKAGE_NAME
3. 复制代码
LOCAL_PACKAGE_NAME
1. LOCAL_PACKAGE_NAME:= ApkTest
2. yuanma编译出来的apk名称
3. 复制代码
LOCAL_MODULE_TAGS
1. LOCAL_MODULE_TAGS := optional
2. 指定在什么版本下才会编译该模块,可能是eng、user、debug、development、optional。
3. 其中,optional是默认标签,指该模块在所有版本下都编译。
4. 复制代码
LOCAL_MODULE_CLASS
1. LOCAL_MODULE_CLASS := APPS
2. 标识所编译模块放置的位置, APPS表⽰放置在/system/app⽬录下。
3. 复制代码
LOCAL_SRC_FILES
1. LOCAL_SRC_FILES := $(call all-java-files-under, src)或者
2. LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
3. 源⽂件列表
4. 复制代码