搜索

430

主题

515

帖子

2134

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2134
QQ
发表于 2020-8-21 11:33:53 6832 浏览 0 回复

Android O和P版本如何内置APK

[DESCRIPTION]
O版和P版如何预置APK

[SOLUTION]
1.预置可卸载APK,恢复出厂设置以后不可以恢复,将apk预置到data/app目录下
android o 版本以后google 加入了patch,不允许预置apk到data/app目录下,只允许使用adb install 的方式来安装apk到data/app目录下,需要将其roll back 回以前的版本,然后用下列方法可以完成预置:
https://android.googlesource.com ... ManagerService.java
(1)在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例;
(2)将 Test.apk 放到 packages/apps/Test 下面;
(3)在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. # Module name should match apk name to be installed
  4. LOCAL_MODULE := Test
  5. LOCAL_MODULE_TAGS := optional
  6. LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
  7. LOCAL_MODULE_CLASS := APPS
  8. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  9. # LOCAL_PRIVILEGED_MODULE := true
  10. LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
  11. LOCAL_CERTIFICATE := PRESIGNED
  12. include $(BUILD_PREBUILT)
复制代码
(4)打开文件 device\mediatek\common\device.mk 将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test

(5)重新 build 整个工程
注意:这个比不能卸载的多了一句:LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test

2.预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复,将apk预置到vendor/operator/app目录下
如果apk是v1签名方式,按照如下方式预置:
(1)在 vendor\mediatek\proprietary\packages\3rd-party下面以需要预置的 APK 名字创建文件夹,以预置一个名为Wechat.apk为例
(2) 将Wechat.apk 放入vendor\mediatek\proprietary\packages\3rd-party\Wechat下面
(3)在vendor\mediatek\proprietary\packages\3rd-party\Wechat 下面创建文件 Android.mk,文件内容如下
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. # Module name should match apk name to be installed
  4. LOCAL_MODULE := Wechat
  5. LOCAL_MODULE_TAGS := optional
  6. LOCAL_SRC_FILES := Wechat.apk
  7. LOCAL_MODULE_CLASS := APPS
  8. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  9. LOCAL_CERTIFICATE := PRESIGNED
  10. LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
  11. LOCAL_PROPRIETARY_MODULE := true
  12. LOCAL_MODULE_OWNER := mtk
  13. include $(BUILD_PREBUILT)
复制代码
(4)打开文件device\mediatek\common\device.mk
将 Wechat 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Wechat
(5)然后重新build整个工程

注意:需要确保MTK_CTA_SET宏是打开的,会定义属性值persist.vendor.pms_removable=1,MTK_CTA_SET和这个属性值不是强相关的,可以分离,然后在/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt这个白名单文件中加入需要卸载的apk的包名

如果是apk是V2签名方式:
(1)在任意一个apk的目录下(Xunfei)的Android.mk的文件中添加如下内容:
  1. $(shell mkdir $(TARGET_OUT)/vendor/operator/app/Facebook)
  2. $(shell cp $(LOCAL_PATH)/Facebook.apk $(TARGET_OUT)/vendor/operator/app/Facebook)
复制代码
(2)将该Facebook.apk放入任意一个apk目录中,比如放入Xunfei这个目录中
(3)打开文件device\mediatek\common\device.mk
将 Facebook 添加到 PRODUCT_PACKAGES 里面。
  1. PRODUCT_PACKAGES += Facebook
复制代码
(4)然后重新build整个工程
注意:
(1)需要确保MTK_CTA_SET宏是打开的,会定义属性值persist.vendor.pms_removable=1,MTK_CTA_SET和这个属性值不是强相关的,可以分离,然后在
  1. /vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt
复制代码

这个白名单文件中加入需要卸载的apk的包名
(2)这种方式预置facebook,facebook可以成功预置进手机,但是点击手机的时候会报出avc:denied,selinux权限异常的情况,可以通过在相应的te文件中加入allow语句

3.预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复,将apk预置到system/app目录下
(1) 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
(2) 将 Test.apk 放到 packages/apps/Test 下面
(3) 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. # Module name should match apk name to be installed
  4. LOCAL_MODULE := Test
  5. LOCAL_MODULE_TAGS := optional
  6. LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
  7. LOCAL_MODULE_CLASS := APPS
  8. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  9. LOCAL_CERTIFICATE := PRESIGNED
  10. include $(BUILD_PREBUILT)
复制代码
(4) 打开文件 device\mediatek\common\device.mk
将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
(5) 重新 build 整个工程

注意:
(1)需要确保MTK_CTA_SET宏是打开的,会定义属性值persist.vendor.pms_removable=1,MTK_CTA_SET和这个属性值不是强相关的,可以分离,然后在/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt这个白名单文件中加入需要卸载的apk的包名
(2)修改如下代码:
  1. 8776    private PackageParser.Package addForInitLI(PackageParser.Package pkg,
  2. 8777            @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,
  3. 8778            @Nullable UserHandle user)
  4. 8779                    throws PackageManagerException {
  5. 8780        final boolean scanSystemPartition = ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0)
  6. 8781                // M:operator app also is removable and not system flag
  7. 8782                || sPmsExt.isRemovableSysApp(pkg.packageName) && pkg.codePath.contains("/system/") ;
复制代码




手机微信同号:13682654092
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表