android N 内置可卸载app

内置可卸载app, Android.mk如下图编译后apk文件已经加到out/target/product/rk3399_firefly_aio_lvds_box/data/app文件中可是固件烧写后并没有安装到系统里,用文件浏览器查看data/app 里也没有有谁知道这是什么原因吗?

方法一

直接使用Intent卸载

Uri uri = Uri.fromParts("package", "com.example.demo", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);123

这是最简单的方式,调用卸载方法系统会弹出卸载APP对话框,点击确定就会立即卸载,不需要额外权限

方法二

使用PackageManager静默卸载

谷歌认为该方法是不安全的行为,因此该接口是@hide的,不是公开的接口,调用此接口需要有系统签名和相应的系统级权限

具体来说就是需要 
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>权限,但<uses-permission android:name="android.permission.DELETE_PACKAGES"/> 是系统级权限,普通APP根本无法获取到,如果在AndroidManifest.xml强行加入该权限编译也不会通过

唯一的办法就是使用APK反编译工具在Android Studio之外修改权限,比如用apktool反编译工具先把apk文件解压出来,用编辑器在AndroidManifest.xml中加入上面的两个权限,然后在用工具apktool重新打包

获得<uses-permission android:name="android.permission.DELETE_PACKAGES"/>权限后,定义PackageDeleteObserver实现类,实现packageDeleted方法

private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
private int position;
private int mFlag;  

public PackageDeleteObserver(int index, int flag) {
position = index;
mFlag = flag;// 0卸载1个包,1卸载N个包 N>1
}  

@Override
public void packageDeleted(String arg0, int arg1)
throws RemoteException {
// TODO Auto-generated method stub
Message msg;
msg = mHandle.obtainMessage();
msg.what = FLAG_DELETE_VIRUS;
msg.arg1 = position;
msg.arg2 = mFlag;
msg.sendToTarget();
}  
}  123456789101112131415161718192021

获取PackageManager 对象,调用deletePackage方法

PackageManager pkgManager = mContext.getPackageManager();  
PackageDeleteObserver observer = new PackageDeleteObserver(currVirus, 1);  
pkgManager.deletePackage(pakName, observer, 0);  123

最后,还需要进行系统签名才能使用

对apk进行系统签名:

java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk1

将签名之后的文件 push到手机中,需要root权限

方法三

通过pm命令方式实现静默卸载

该方法直接对Android系统执行卸载命令,需要root权限

//pm命令可以通过adb在shell中执行,同样,我们可以通过代码来执行 public static String execCommand(String... command) {
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
String result = "";    try {
process = new ProcessBuilder().command(command).start();
ByteArrayOutputStream baos = new ByteArrayOutputStream();        int read = -1;
errIs = process.getErrorStream();        while ((read = errIs.read()) != -1) {
baos.write(read);
}
inIs = process.getInputStream();        while ((read = inIs.read()) != -1) {
baos.write(read);
}
result = new String(baos.toByteArray());        if (inIs != null)
inIs.close();        if (errIs != null)
errIs.close();
process.destroy();
} catch (IOException e) {

result = e.getMessage();
}    return result;
}123456789101112131415161718192021222324252627282930

执行卸载命令

execCommand("pm","uninstall", "packageName");1

编译生成apk时,要在manifest文件下添加Android:sharedUserId=”android.uid.system”

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xieyuan.mhfilemanager"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly"
android:sharedUserId="android.uid.system" >  

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-03-18

卸载内置app演示

第2个回答  2018-06-14
android N预装可卸载有点麻烦 自己写一个开机脚本
第3个回答  2018-06-15
你这个是整编的吗?
第三方不知道哦,感觉内置的是不是也应该在system/priv-app 下边啊。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网