android 9 预装可卸载的app,只安装一次

本文介绍了一种预装应用程序的智能卸载方案,确保系统重启后不再重复安装。通过监听系统启动广播,检查特定App是否已安装及APK文件存在状态,利用自定义Receiver实现有条件地删除APK文件,避免重复加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前修改代码做了可卸载的预装app,但客户要求,只安装一次,后面就不管了,卸载了也不需要再次安装。

需求的节点在于,预装后apk文件还存在,重新启动后会再次安装。

解决的思路:

系统启动后检查是否已经安装了app,同时检查apk文件是否存在,如果满足条件,删之。

1、预装可卸载的app

https://blog.youkuaiyun.com/cau_eric/article/details/104004350

2、启动后监听 ACTION_BOOT_COMPLETED 广播

https://blog.youkuaiyun.com/cau_eric/article/details/89393779 

 我在源码中找了,setting里面有这种receiver,

a、修改 

\packages\apps\Settings\AndroidManifest.xml

添加:

<receiver android:name=".fuelgauge.batterytip.Mile8Receiver">
    <intent-filter android:priority="1000">
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

b、增加Receiver 文件:

public class Mile8Receiver extends BroadcastReceiver {
    private static final String TAG = "Mile8Receiver";
	private final String apk_1 = "/vendor/priv-app/acquisitor_app-release-3.4.0.10-V69.apk";
    private final String apk_2 = "/vendor/priv-app/com.google.android.inputmethod.pinyin.apk";
    private final String apk_3 = "/vendor/priv-app/ES_File_Explorer.apk";
	private final String packageName_1 = "com.nl.android.ecgviewer";
    private final String packageName_2 = "com.google.android.inputmethod.pinyin";
    private final String packageName_3 = "com.estrongs.android.pop";
	private List<String> packages;

    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d(TAG,"=Mile8Receiver=>>ACTION_BOOT_COMPLETED");			
			execSuCmd("mount -o remount -w /vendor");
			packages = getNullSystemPackageNames(context);
			if (isFileExist(apk_1) && isPackageInstalled(packageName_1)){
            	Log.d(TAG,"=Mile8Receiver=apk1=>>");
				execSuCmd("rm -f " + apk_1);
        	}
			if (isFileExist(apk_2) && isPackageInstalled(packageName_2)){
            	Log.d(TAG,"=Mile8Receiver=apk2=>>");
				execSuCmd("rm -f " + apk_2);
        	}
			if (isFileExist(apk_3) && isPackageInstalled(packageName_3)){
            	Log.d(TAG,"=Mile8Receiver=apk3=>>");
				execSuCmd("rm -f " + apk_3);
        	}
		
        }
    }
...
}

 c、检查app是否已安装:

private boolean isPackageInstalled(String packageName_input){
        for (String packageName : packages){
            if (packageName.equals(packageName_input)){
                return true;
            }
        }
        return false;
    }

获取第三方应用: https://blog.youkuaiyun.com/cau_eric/article/details/100572601

d、检查apk文件是否存在:

private boolean isFileExist(String file){
        return (new File(file)).exists();
    }

基本完工了,但是还有一个问题,删除文件的时候提示read-only file system错误。

解决办法:https://blog.youkuaiyun.com/cau_eric/article/details/104757888

e、su系统执行命令:

https://blog.youkuaiyun.com/cau_eric/article/details/98969975

 

OK!测试通过

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值