Android S动态移除无关应用

Android 移除相关应用

前景

同一套代码,定制多个客户端项目,不同项目,不同需求,需要单独定制。
例如:android 平台默认集成小区广播功能(CellBroadCast),但是该应用某些客户用不到,需要remove。

有如下两种方式可以参考操作

方案一

查找系统源码,找到对应代码位置,修改mk,使其不编译到系统。

查找应用编译时,需要仔细,检查多个mk文件,避免修改遗漏,导致功能不生效。

下面展示一些 内联代码片

vendor/odm/product_name/mx/configs.mk
#add by hhuiming on 2023-02-08
FEATURE_CELLBROAD_DISABLED := yes
#add by hhuiming end

下面展示一些 内联代码片

build/make/target/product/telephony_system.mk
#add by hhuiming on 2023-02-08
ifeq ($(strip $(FEATURE_CELLBROAD_DISABLED)), yes)
  PRODUCT_PACKAGES := \
  	CallLogBackup \
else
 PRODUCT_PACKAGES := \
 	CallLogBackup \
  	com.android.cellbroadcast \
  	CellBroadcastLegacyApp \
endif
#add by hhuiming end

方案二

所有项目都编译此应用,但是在系统启动时,针对特殊项目,跳过安装。

为了避免项目之前需求混乱,通常可以通过feature的方式进行控制。在编译不同项目时,加载不同项目的configs.mk文件。 在configs.mk文件中新增feature, 在mk中判断,控制应用集成。

以方案二为例:
修改文件目录如下:

下面展示一些 内联代码片

vendor/odm/product_name/mx/configs.mk
//增加自定义feature,控制此功能,如果其他项目有相同需求,只需要在对应项目下增加此feature,而无需在公共仓库通过brand_name的方式进行区分和新增
#add by hhuiming on 2023-02-08
PRODUCT_PRODUCT_PROPERTIES += ro.feature.cellbroad_disable=true
#add by hhuiming end
framework/base/services/core/java/com/android/server/pm/PackageManagerService.java
vendor/odm/product_name/mx/configs.mk
	//引用自定义feature
    //add by hhuiming on 2023-02-08
    private static final boolean FEATURE_CELLBROAD_DISABLE = SystemProperties.getBoolean("ro.feature.cellbroad_disable", false);
    private static final String CELLBROAD_PACKAGE_NAME = "com.android.cellbroadcastreceiver";
    //add by hhuiming end
	
	//scanDirLI 扫描安装
    private void scanDirLI(File scanDir, int parseFlags, int scanFlags, long currentTime,
            PackageParser2 packageParser, ExecutorService executorService) {
    
    
	/*省略*/
        if (throwable == null) {
    
    
        //add by hhuiming on 2023-02-08 
			if(FEATURE_CELLBROAD_DISABLE){
    
    
		    	if(CELLBROAD_PACKAGE_NAME.equals(parseResult.parsedPackage.getPackageName())
					&& (parseResult.scanFile.getAbsolutePath().startsWith("/system/")
					|| parseResult.scanFile.getAbsolutePath().startsWith("/system_ext/")
					|| parseResult.scanFile.getAbsolutePath().startsWith("/vendor/")
					|| parseResult.scanFile.getAbsolutePath().startsWith("/product/"))){
    
    
				continue;
		    }
		}
		//add by hhuiming end
	/*省略*/
    }

猜你喜欢

转载自blog.csdn.net/weixin_45080805/article/details/128938034