本篇集中说明第三方应用集成Android.bp 写法,以及怎么集成可卸载第三方应用。
Android.bp写法
签名
- 自签名
android_app_import {
name: "SogouInput",
system_ext_specific: true,
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
- 系统签名
# system signal
android_app_import {
name: "SogouInput",
system_ext_specific: true,
certificate: "platform",
apk: "SogouInput_android_oem_baoneng.apk",
}
集成位置
- system/app
android_app_import {
name: "SogouInput",
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
- system_ext/app
android_app_import {
name: "SogouInput",
system_ext_specific: true,
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
- system/pri-app
必须声明在permission白名单内。
aosp路径:frameworks/base/data/etc/privapp-permissions-platform.xml
手机路径:system/etc/permission/privapp-permission-platform.xml
android_app_import {
name: "SogouInput",
privileged: true,
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
- product/app
android_app_import {
name: "SogouInput",
product_specific: true,
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
- vendor/app
android_app_import {
name: "SogouInput",
proprietary: true,
presigned: true,
dex_preopt: {
enabled: false,
},
apk: "SogouInput_android_oem_baoneng.apk",
}
第三方可卸载apk集成方法
- MTK 平台方案
- 将包名添加到配置文件(vendor\mediatek\proprietary\frameworks\base\data\etc\pms_sysapp_removable_system_list.txt)
- mk文件完成拷贝
// device/mediatek/common/device.mk
ifneq ($(strip $(MTK_BASIC_PACKAGE)), yes)
+ PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_grant_permission_list.txt:system/etc/permissions/pms_sysapp_grant_permission_list.txt)
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt:system/etc/permissions/pms_sysapp_removable_system_list.txt)
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/pms_sysapp_removable_vendor_list.txt)
endif
- 源码分析
// PMS中添加
if (sPmsExt.needSkipScanning(pkg, updatedPkg, ps, scanFile))
return null;
//MtkSystemServiceFactory.makePmsExt()
//MtkSystemServiceFactoryImpl (vendor/mediatak/proprietary/frameworkes/base/.../)
// PmsExtImpl.java(vendor/mediatak/proprietary/frameworkes/base/.../)
@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;
}
- 使用脚本方式安装
使用脚本的方式