android 预置apk总结

3人阅读 评论(0) 收藏 举报
分类:

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)

查看评论

云原生路演总结

-
  • 1970年01月01日 08:00

Android 预置APK的权限授予

Android 预置APK的权限授予
  • PrisonJoker
  • PrisonJoker
  • 2017-09-30 14:52:16
  • 364

android源码预置apk

本次实践基于android N原生代码,其实没有多大卵用,因为基本每个ROM厂商都有自己的定制方式,但话又说回来,会了总归是好的。 这里我们可以预置包含源码的应用,也可以直接预置第三方apk增加有源码...
  • mockingbirds
  • mockingbirds
  • 2017-01-22 22:14:32
  • 4425

Android 6.0 预置so库 apk

一、将无源码的 APK 和它 依赖的库预置进系统,此apk可以升级 ---------- cut here ------------------ LOCAL_PATH := $(call my-di...
  • q1183345443
  • q1183345443
  • 2016-11-08 10:25:39
  • 2193

Android L 预置apk

DESCRIPTION] 1, 如何将带源码的 APK 预置进系统? 2, 如何将无源码的APK预置进系统? 3, 如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复? 4, 如何预置...
  • lizzywu
  • lizzywu
  • 2015-09-23 15:28:54
  • 998

MTK android6.0 如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复

MTK android6.0 如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复 1.在 vendor/mediatek/proprietary/packages/3rd-party下面...
  • u014379571
  • u014379571
  • 2017-08-22 16:07:25
  • 482

在android系统源码中预置apk

一、如何将带源码的APK预置进系统? 1)     在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预制一个名为Test的APK 为例 2)     将 Tes...
  • LK1105010206
  • LK1105010206
  • 2016-08-08 15:23:50
  • 1835

在android系统源码中预置apK

如何将无源码的google play APK预置进系统(有源码和无源码有一点区别,网上下载的google play.apk解压之后里面没有源码)? (注意下文中的Test就是我们要预置到源码中的go...
  • JiangzhouHe
  • JiangzhouHe
  • 2016-09-06 16:32:38
  • 1732

Android 6预置APK的权限授予

主要是 修改\frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java,但是CTS可能会有...
  • q1183345443
  • q1183345443
  • 2016-11-02 10:16:23
  • 1125

Android如何预置apk,jar,lib等任意文件到系统中

ep :我手上有个libapp.so , fuse.bin , busybox,我需要将这三个文件在编译的时候自动拷贝到out目录下编译完成以后,.so文件会被预置到Andorid系统的根目录下的sy...
  • morixinguan
  • morixinguan
  • 2017-04-14 11:43:55
  • 907
    个人资料
    等级:
    访问量: 2304
    积分: 249
    排名: 99万+
    文章存档