android 内置第三方apk

这个功能比较容易实现,只要把apkf放到$(TARGET_OUT_VENDOR)/operator/app目录下面

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := Facebook
LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := Facebook.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED

LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/operator/app

LOCAL_DEX_PREOPT := false

include $(BUILD_PREBUILT)

但是,有些apk放到vendor/operator/app目录下不能成功安装,原因不清楚,推测可能是一些权限问题,就比如这个Facebook.apk。放在vendor/app下面就没有问题,但是不能卸载。在\vendor\mediatek\proprietary\frameworks\base\data\etc\目录有个pms_sysapp_removable_vendor_list.txt文件,从名字就可以知道这个文件的作用了,把apk的包名加到这里面就可以变为可卸载了。这个路径下还有另外两个文件,pms_sysapp_removable_system_list.txt和privapp-permissions-mediatek.xml,同样从名字可以推测出他们的作用,pms_sysapp_removable_system_list.txt是控制system/app目录下app的卸载,privapp-permissions-mediatek.xml是给一些app系统级别的权限。

注意一些app含有so库文件,如果不把so库提取出来可能会出现找不到so的错误。所以要把so库单独提取出来,添加这个属性,

LOCAL_PREBUILT_JNI_LIBS := \
  libgdinamapv4sdk752.so \
  libgdinamapv4sdk752ex.so \
  libJNI_GaussisanBlur.so \
  libStDualCam.so

把so库放在和app同级目录就行了。网上说可以不用把so单独库提取出来,使用这种方式

LOCAL_PREBUILT_JNI_LIBS := \
  @lib/armeabi-v7a/libgdinamapv4sdk752.so \
  @lib/armeabi-v7a/libgdinamapv4sdk752ex.so \
  @lib/armeabi-v7a/libJNI_GaussisanBlur.so \
  @lib/armeabi-v7a/libStDualCam.so

我在8.1的源码上试了一下,没有效果。

后续:fota升级时,发现在pms_sysapp_removable_vendor_list.txt和pms_sysapp_removable_system_list.txt里面的app不能安装,恢复出厂设置可以复原,这个问题困扰了我好久,各种排查问题,一开始以为是MTK平台的问题。但是发现只要不在pms_sysapp_removable_vendor_list和pms_sysapp_removable_system_list里面的应用就可以成功安装,于是去看代码。处理这些txt都是在PmsExtImpl.java。在PackageManagerService.java的scanPackageInternalLI方法里面

    /// M: Skip an uninstalled system or vendor app
            if (sPmsExt.needSkipScanning(pkg, updatedPkg, ps, scanFile))
                return null;

可以看到这里做了判断

 @Override
    public boolean needSkipScanning(PackageParser.Package pkg,
            PackageSetting updatedPkg, PackageSetting ps, File scanFile) {
       if (!mPms.isFirstBoot() &&
           (isRemovableSysApp(pkg.packageName) || locationIsOperator(scanFile)) &&
           (ps == null && updatedPkg == null)) {
            if (mPms.isUpgrade()) {
                if (isRemovableSysApp(pkg.packageName)
                        && !sRemovableSystemAppSetBak.contains(pkg.packageName)) {
                    Slog.d(TAG, "New added removable sys app by OTA:" + pkg.packageName);
                    return false;
                }
                if (locationIsOperator(scanFile)
                        && sUpgradeOperAppSet.contains(pkg.packageName)
                        && !sUpgradeOperAppSetBak.contains(pkg.packageName)) {
                    Slog.d(TAG, "New added operator app by OTA:" + pkg.packageName);
                    return false;
                }
            }
           Slog.d(TAG, "Skip scanning uninstalled sys package " + pkg.packageName);
           return true;
       } else if (ps == null && updatedPkg != null) {
           Slog.d(TAG, "Skip scanning uninstalled package: " + pkg.packageName);
           return true;
       }

       return false;
    }

如果返回false,就被忽略了。

猜你喜欢

转载自blog.csdn.net/qq_32072451/article/details/83862242