一.预置可卸载APK,恢复出厂设置以后不可以恢复,将apk预置到data/app目录下

android o 版本以后google 加入了patch,不允许预置apk到data/app目录下,

只允许使用 adb install 的方式来安装apk到data/app目录下,需要将其roll back 回以前的版本,

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

--- a/services/core/java/com/android/server/pm/PackageManagerService.java+++ b/services/core/java/com/android/server/pm/PackageManagerService.java@@ -11394,6 +11394,10 @@                                     + " but expected at " + known.codePathString                                     + "; ignoring.");                         }                    } /*else {+                        throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,+                                "Application package " + pkg.packageName+                                + " not found; ignoring.");                     }*/                 }             }

然后用下列方法可以完成预置:

(1)在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例

(2)将 Test.apk 放到 packages/apps/Test 下面

(3)在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Module name should match apk name to be installedLOCAL_MODULE := TestLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)# LOCAL_PRIVILEGED_MODULE := trueLOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)LOCAL_CERTIFICATE := PRESIGNEDinclude $(BUILD_PREBUILT)

(4)打开文件 device\mediatek\common\device.mk
将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test

(5)重新 build 整个工程
注意:这个比不能卸载的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

二.预置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,文件内容如下

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Module name should match apk name to be installedLOCAL_MODULE := WechatLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := Wechat.apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE := PRESIGNEDLOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/appLOCAL_PROPRIETARY_MODULE := trueLOCAL_MODULE_OWNER := mtkinclude $(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的文件中添加如下内容:

$(shell mkdir $(TARGET_OUT)/vendor/operator/app/Facebook)$(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 里面。
PRODUCT_PACKAGES += Facebook

(4)然后重新build整个工程
注意:
(4.1)需要确保 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的包名

(4.2)这种方式预置facebook,facebook可以成功预置进手机,但是点击手机的时候会报出

avc:denied,selinux权限异常的情况,可以通过在相应的te文件中加入allow语句

三.预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复,将apk预置到 system/app 目录下

(1) 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例

(2) 将 Test.apk 放到 packages/apps/Test 下面

(3) 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Module name should match apk name to be installedLOCAL_MODULE := TestLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE := PRESIGNEDinclude $(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)修改如下代码:

8776    private PackageParser.Package addForInitLI(PackageParser.Package pkg,8777            @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,8778            @Nullable UserHandle user)8779                    throws PackageManagerException {8780        final boolean scanSystemPartition = ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0)8781                // M:operator app also is removable and not system flag8782                || sPmsExt.isRemovableSysApp(pkg.packageName) && pkg.codePath.contains("/system/") ;

更多相关文章

  1. Android中如何获取视频文件的缩略图
  2. Android 根文件系统分析(2)
  3. Android NDK编译 ndk-build方式
  4. 什么是APK文件
  5. android:configChanges属性在不同版本SDK下需要注意的事项
  6. 16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋

随机推荐

  1. android 隐藏虚拟按键
  2. [转]Android中Matrix的pre post set方法
  3. Android 列表数据写入到本地Excel文件(包
  4. Android的res目录
  5. android之通过USB插拔流程来了解android
  6. Android灯光系统(硬件访问服务框架)
  7. Android安装apk文件并适配Android 7.0详
  8. Android SDK无法更新怎么办
  9. Android中设置屏幕全屏两种方法:
  10. android让界面不被弹出的键盘挤上去