其实就是上面的链接3,但是这个方法有局限性,比较适用于单个Android系统项目,直接对Android.mk中的相关APK代码进行删除,(下图来源链接3)
但是很多情况、很多公司在实际中,使用repo拉取代码上有许多项目,而且A、B、C、D、E项目中,可能对于A、C项目需要保留这个APK,而其余的需要不保留这个APK,需要参看公司的需求表。
也是常用惯用方法,根据上面的特殊性说明来,我们需要宏控制,即:在Android.mk文件中添加条件判断,A、C项目包含了这个宏且为yes值,则保留这个APK(预置这个APK),而其余的BDE不设置这个宏或者设置为no值,则不会预置这个APK(宏在项目的var.mk进行编写)
理一下思路,进行编写:以下以Calendar.APK为例
先要知道是否预置这个APK的包名,从而在后面更好的定位、判断是否成功,这里使用了jadx反编译工具,可以上网搜一下使用方法,在这大概讲一下。将jadx下载(解压)到任意路径,将目标apk文件拖动到jadx的bin目录下打开终端执行jadx -gui apk名
D:\jadx\bin>jadx -gui Calendar.apk
反编译出 在AndroidManifest.xml或其他可以查看到包名
示例路径 device\xxx\xxxx\项目名\var.mk
宏的名称编写需要你查看公司的规范文档 例如 公司名_软件名...
宏示例:宏名称=yes
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
需要包含Calendar
PRODUCT_PACKAGES +=\
Calendar\
...
番外:
如果需要替换已经有的APK,例如日历我只需要一个,将例如谷歌的APK替换,则在Android.mk进行添加语句:
ifeq($(strip $(XXXXXX)),yes)
LOCAL_OVERRIDES_PACKAGES :=Calender
else
LOCAL_OVERRIDES_PACKAGES :=CalendarGoogle
可以通过adb命令来查看手机的包名或者看out目录下是否有生成的APK
adb命令:手机链接电脑,使用adb devices检测到手机
再输入adb shell pm list packages 命令将显示设备上安装的所有应用的包名列表
查看列表中是否有APK包名
检查out目录(编译以后,Android源码中的out目录一开始是不存在的,是在我们执行编译操作之后才由系统自动生成)
路径为:out/target/product/项目名/app(或其他app文件夹)
以下四个路径存放APK(你可以选择,在Android.mk文件可以设置)