android 预置apk总结

1.概述:

介绍预置apk的种类,流程及具体方法

2.预置apk方法分类:

预置apk按有无源码分的话可以分为两种,一种是有apk源码的预置方式,一种是无源码的预置apk方式,区别是mk文件写发不同;按预置的用途分的话可以分为3种,一种是预置apk不可删除,一种是可删除恢复出厂设置后还存在,一种是可删除恢复出厂设置后不存在,区别 也是mk文件写法不同

3.预置apk的流程

3.1首先系统原生的apk的方法一般是在build\target\product下面的一些mk文件中被定义是否添加编译项(如果是mtk或者rk的则会在device/mediatek(rockchip)下被重新定义),相关字符为

PRODUCT_PACKAGES += \

    Launcher3 \

关键字是PRODUCT_PACKAGES,语法是makefile的语法,大概意思是加了这句话,就会去编译package/app下面的Launcher3下面的Android.mk文件(mk文件中有个module名也是Launcher3,与PRODUCT_PACKAGES名字相对应),大概流程是make的时候会去遍历所有路径下面的mk文件,然后mk如果PRODUCT_PACKAGES定义的module在mk文件中也有定义则会编译那个mudule项,碰到有些人在apk的文件中添加了mk文件,但是一make就在out下面没看见生成apk文件,那就是因为没有在mk文件中添加module编译选项

3.2实际mtk或者rk的一般是在device\mediatek(rockchip)\下面的device.mk中自己添加或者修改了预置apk的逻辑,rk的有的是在vendor\rockchip\common\apps\apps.mk中被定义,gms的是在vendor\partner_gms\products\gms.mk中被定义

3.3实际我们需要添加预置apk的编译module则只要在device下面的device.mk文件中添加

单个

PRODUCT_PACKAGES += XXX

多个

PRODUCT_PACKAGES += \

    XXX \

注意:多个的也可以直接用多个这个PRODUCT_PACKAGES += XXX,多个的用PRODUCT_PACKAGES += \注意参考mtk或者原生的mk的文件格式,注意末尾的\字符,否则会编译报错,且如果是删除的预置apk则可以用#注释掉那个module名即可,最好是直接删除掉那句话,因为makefile语法有的加了#号字符的编码不对或者空格/tab键的影响会导致#下面的其他的module名都编译不到,可能会导致机器开机起不来

XXX改为自己客制化的apk的mudule就行了,一般device中的module名和apk名称及mk中的module名都最好是一致

3.4基于以上的说明,个人建议自己客制化的文件最好独立出来一个文件夹管理,不要和mtk或者rk的混在一起了,我个人是这样处理的

vendor\custom\app\XXX 下面放apk文件(或者源码)和Android.mk文件

vendor\custom\lib\XXX 下面放预置所需的so文件

vendor\custom\custom.mk

PRODUCT_PACKAGES += XXX

PRODUCT_COPY_FILES += vendor/custom/lib/XXX.so:system/lib/XXX.so 将so文件copy到system/lib下面,注意文件路径要对应上,apk调用so文件的优先级是先是自己apk的内部lib路径,然后是vender下的lib,然后是system下面的lib,apk如果 因为so文件找不到的话,可以看到提示

device\rockchip\rkXXX\device.mk或者device\mediatek\mtXXX\device.mk中最底部添加语句

$(call inherit-product-if-exists, vendor/custom/custom.mk)

大概流程是make的时候会去include所有的mk文件,包括device.mk,而device.mk中又关联添加了custom.mk,custom.mk中又添加了PRODUCT_PACKAGES += XXX,然后XXX和vendor\custom\app\XXX下面的Android.mk中XXX一致,之后就编译到了XXX,其中custom为自己定义的文件名,其实可以为其他任何文件名,包括custom.mk,但是后缀要是.mk即可,且

$(call inherit-product-if-exists中的文件路径要实际对应

4.预置apk方法

4.1有源码的预置apk方法

结合上面所述的3.4,在XXX文件下面放源码相关文件,实际必须的为res,src(eclipse工程对应为src,androidstudio对应java),Android.mk,AndroidManifest.xml文件,清单文件中添加android:sharedUserId="android.uid.system"属性,androidstudio中文件注意主题(如果不支持的主题会报错),图标(如果找不到资源会报错),string资源文件(源码需做国际化处理,否则会报错)及Activity的包(最好别用AppCompatActivity,容易报找不到包,用原始的Activity就可以了),Android.mk文件如下

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

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := 工程名称
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

include $(call all-makefiles-under,$(LOCAL_PATH))

4.2无源码,有apk文件的预置apk方法

结合上面所述的3.4,在XXX文件下面放XXX.APK文件和Android.mk文件即可

4.2.1不可删除类型

PRESIGNED 为使用apk原生的签名,platform为系统签名

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

LOCAL_MODULE := XXX
LOCAL_MODULE_TAGS := optional   
LOCAL_MODULE_PATH := $(TARGET_OUT)/app     
   
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
 
#LOCAL_CERTIFICATE := PRESIGNED 
LOCAL_CERTIFICATE := platform

include $(BUILD_PREBUILT)

4.2.2可删除,恢复出厂设置后还存在

rk的方法见RKDocs下面的相关说明文档

mtk的6.0的处理方法如下

LOCAL_PATH := $(my-dir)
TARGET_PREINSTALL_APPS := $(TARGET_OUT)/vendor/operator/app


include $(CLEAR_VARS)
LOCAL_MODULE := XXX
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_PATH := $(TARGET_PREINSTALL_APPS)
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

mtk7.0方法如下,7.0以上有V1,V2签名认证,用6.0的方法不行了,大概意思是不走系统签名逻辑,直接将apk复制到相关路径下面去

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := XXX
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
$(shell mkdir $(TARGET_OUT)/vendor/operator/app/XXX)

$(shell cp $(LOCAL_PATH)/XXX.apk $(TARGET_OUT)/vendor/operator/app/XXX)  

4.3可删除,恢复出厂设置后不存在

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
# Module name should match apk name to be installed
LOCAL_MODULE := Test
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)

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页