首先我先提供以下博主博文,对相关知识点可以提供理解、解决、思考的
- Android 系统如何预装第三方应用以及常见问题汇集
- android Android.mk属性说明及预置系统app操作说明系
- Android 中去除系统原生apk的方法
取消预置APK方法一:
其实就是上面的链接3,但是这个方法有局限性,比较适用于单个Android系统项目,直接对Android.mk中的相关APK代码进行删除,(下图来源链接3)
但是很多情况、很多公司在实际中,使用repo拉取代码上有许多项目,而且A、B、C、D、E项目中,可能对于A、C项目需要保留这个APK,而其余的需要不保留这个APK,需要参看公司的需求表。
取消预置APK方法二:
也是常用惯用方法,根据上面的特殊性说明来,我们需要宏控制,即:在Android.mk文件中添加条件判断,A、C项目包含了这个宏且为yes值,则保留这个APK(预置这个APK),而其余的BDE不设置这个宏或者设置为no值,则不会预置这个APK(宏在项目的var.mk进行编写)
理一下思路,进行编写:以下以Calendar.APK为例
1.如果不知道包名,可以先使用反编译工具进行查看包名
先要知道是否预置这个APK的包名,从而在后面更好的定位、判断是否成功,这里使用了jadx反编译工具,可以上网搜一下使用方法,在这大概讲一下。将jadx下载(解压)到任意路径,将目标apk文件拖动到jadx的bin目录下打开终端执行jadx -gui apk名
D:\jadx\bin>jadx -gui Calendar.apk
反编译出 在AndroidManifest.xml或其他可以查看到包名
2.在需要的项目下var.mk中添加宏,即A、C项目下
示例路径 device\xxx\xxxx\项目名\var.mk
宏的名称编写需要你查看公司的规范文档 例如 公司名_软件名...
宏示例:宏名称=yes
3.在Android.mk下添加判断 来判断是否执行语句(创建文件夹、拷贝apk等操作)
Android.mk无论什么项目都会执行它所以你是否执行apk操作需要你自己的宏是否有、值是否对应来决定
示例路径vendor/xxxx/packages/xxxx/Calendar/Android.mk
ifeq($(XXXXXXX),yes)
$(warning mkdir -p $(PRODUCT_OUT)/system/preloadapp/$(LOCAL_MOULE)/)
$(shell mkdir -p $(PRODUCT_OUT)/system/preloadapp/$(LOCAL_MOULE)/)
$(warning Aron -------- cp $(LOCAL_PATH)/$(LOCAL_MOULE)/$(PRODUCT_OUT)/system/preloadapp/$(LOCAL_MOULE)/$(LOCAL_MOUDLE).apk)
$(shell cp $(LOCAL_PATH)/$(LOCAL_MOULE).apk $(PRODUCT_OUT)/system/preloadapp/$(LOCAL_MOULE)/$(LOCAL_MOULE).apk)
endif
3.在需要预制的项目的main.mk下添加(一般可能有了,检查一下)APK
需要包含Calendar
PRODUCT_PACKAGES +=\
Calendar\
...
4.其他不需要预置的项目不添加宏(一般不进行修改,默认没有宏,不执行预置APK)
番外:
如果需要替换已经有的APK,例如日历我只需要一个,将例如谷歌的APK替换,则在Android.mk进行添加语句:
ifeq($(strip $(XXXXXX)),yes)
LOCAL_OVERRIDES_PACKAGES :=Calender
else
LOCAL_OVERRIDES_PACKAGES :=CalendarGoogle
5.验证是否预置APK
可以通过adb命令来查看手机的包名或者看out目录下是否有生成的APK
adb命令:手机链接电脑,使用adb devices检测到手机
再输入adb shell pm list packages 命令将显示设备上安装的所有应用的包名列表
查看列表中是否有APK包名
检查out目录(编译以后,Android源码中的out目录一开始是不存在的,是在我们执行编译操作之后才由系统自动生成)
路径为:out/target/product/项目名/app(或其他app文件夹)
以下四个路径存放APK(你可以选择,在Android.mk文件可以设置)
- system/app/ :该目录下存放的是一些系统级的应用,该目录下的应用能获取到比较高的权限,应用不可卸载,如Phone、Contacts等
- system/priv-app/ :该目录是从Android 4.4开始出现的目录,它存放的是一些系统核心应用,能获取到比system/app/下应用更高的权限,应用不可卸载,如:Setting、SystemUI等。
- vendor/app/ :该目录存放制造商的一些应用,应用不可卸载。
- data/app/ :该目录下存放的一些第三方应用,应用可卸载。