写在开头:相关部分参考https://www.jianshu.com/p/9af0a34d3eed
目录
一、源码的APK预置进系统
在packeages/apps目录下新建一个以APK名字为名的文件夹,例:新建Taylor文件夹,将 Taylor APK的 源码 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录,再新建一个Android.mk文件,具体内容如下:
#加载源文件目录
LOCAL_PATH:= $(call my-dir)
#清理除LOCAL_PATH的其他变量
include $(CLEAR_VARS)
#模块的名字,表示了一个预置的apk在编译中的唯一标识,同时编译后该apk会以此命名
LOCAL_MODULE := Taylor
#模块的头部信息 在任何版本(user、userdebug和eng)下都编译
LOCAL_MODULE_TAGS := optional
#该文件的类型
LOCAL_MODULE_CLASS := APPS
#该文件的根目录
LOCAL_SRC_FILES := $(call all-subdir-java-files)
#包名
LOCAL_PACKAGE_NAME := Taylor
#签名,PRESIGNED表示保留apk文件之前的签名,platform是对apk重新进行签名
LOCAL_CERTIFICATE := PRESIGNED
#指定编译目标为 32位 或 64位,可选值 /32/64/first/both
LOCAL_MULTILIB := 32
include $(BUILD_PACKAGE)
这些准备工作做好之后,再在device\mediatek\common\device.mk文件中添加一个属性:
PRODUCT_PACKAGES += Taylor //+=表示追加此APK
然后重新编译整个工程
二、不带源码的(带SO库)APK预置进系统
在packeages/apps目录下新建一个以APK名字为名的文件夹,例:新建Taylor文件夹,在其下存放Taylor.apk,再新建一个Android.mk文件,具体内容如下:
a:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Taylor
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#APK内置的so库
LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libtest.so \
@lib/armeabi/libtest2.so
LOCAL_MULTILIB := 32
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
b:如果a不行,需要将apk中的so库单独抽离出来,在Androi.mk文件同级目录下建立lib文件夹,单独build进系统system/lib分区
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Taylor
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#导出的apk内的so库
LOCAL_PREBUILT_JNI_LIBS:= \
lib/libtest.so \
lib/libtest2.so
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
若无so,则需要删除:LOCAL_PREBUILT_JNI_LIBS
若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径。一般情况下@标识符会将apk中的so抽离出来build进apk同级目录下的lib文件夹中,特殊情况下,需要进行b操作
注:若apk支持不同cpu类型的so,针对so的部分的处理
Ifeq ($(TARGET_ARCH),arm)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v7a/xxx.so\
@lib/armeabi-v7a/xxxx.so
else ifeq ($(TARGET_ARCH),x86)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/x86/xxx.so
else ifeq ($(TARGET_ARCH),arm64)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v8a/xxx.so
#即将和TARGET_ARCH对应的so抽离出来
这些准备工作做好之后,再在device\mediatek\common\device.mk文件中添加一个属性:
PRODUCT_PACKAGES += Taylor //+=表示追加此APK
然后重新编译整个工程
注:如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。
修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。
三、预置用户可卸载的APK进系统,并且恢复出厂设置不恢复
在packeages/apps目录下新建一个以APK名字为名的文件夹,例:新建Taylor文件夹,在其下存放Taylor.apk,再新建一个Android.mk文件,具体内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Taylor
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# LOCAL_PRIVILEGED_MODULE := true
#这个用于添加可卸载属性
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
与上雷同,不做赘述
注:LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)即增加了可卸载属性
四、预置用户可卸载的APK进系统,并且恢复出厂设置可恢复
在 vendor\mediatek\proprietary\binary\3rd-party\free下面以需要预置的 APK 名字创建文件夹,并在该目录下存放Taylor.apk,再新建一个Android.mk文件,具体内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Taylor
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
include $(BUILD_PREBUILT)
打开文件device\mediatek\common\device.mk
将 Taylor添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Taylor
然后重新build整个工程,即可生效
写在最后:努力变强吧!