> 首页 > 生活 > 百科 > Android如何静默卸载应用

Android如何静默卸载应用

来源:网络 作者:佚名 时间:04-04 手机版

要实现静默卸载,首先你要有root权限,能把你的静默卸载程序移动到system/app目录下。用RE浏览器将你的应用一般在/data/app目录下)移动到/system/app目录下,如果你的程序有.so文件,那么请将相应的.so文件从/data/data/程序包名/lib目录下移动到/system/lib目录下。重启你的手机,你就会发现你的应用已经是系统级应用了,不能被卸载,也就是说你的应用现在已经八门全开,活力无限了。

android在root权限下实现apk的静默卸载,静默安装,重启

1.静默卸载实现:

/**
    * 静默卸载app

    *

    * @param context

    * @param packageName app的包名

    * @throws IOException

    * @throws InterruptedException

    */

    public static void uninstallApp(Context context, String packageName) throws IOException, InterruptedException {

        List<PackageInfo> packageInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

        for (PackageInfo packageInfo1 : packageInfos) {

            if (packageName.equals(packageInfo1.packageName)) {

                String suPath = "/system/xbin/su";

                File file = new File(suPath);

                if (!file.exists()) {

                    suPath = "/system/bin/su";

                }

                Process process = Runtime.getRuntime().exec(suPath);

                String cmd = "pm uninstall " + packageName + "\n" + "exit\n";

                process.getOutputStream().write(cmd.getBytes());

                process.waitFor();

                break;

            }

        }

    }

2.静默安装实现:

/**
    * 静默安装app

    *

    * @param filePath

    * @throws IOException

    * @throws InterruptedException

    */

    public static void installApp(String filePath) throws IOException, InterruptedException {

        String suPath = "/system/xbin/su";

        File file = new File(suPath);

        if (!file.exists()) {

            suPath = "/system/bin/su";

        }

        Process process = Runtime.getRuntime().exec(suPath);

        String cmd = "pm install -r " + filePath + "\n" + "exit\n";

        process.getOutputStream().write(cmd.getBytes());

        process.waitFor();

    }

最后加上重启命令:

/**
    * 重启系统

    *

    * @return

    */

    public static boolean reboot() {

        try {

            String suPath = "/system/xbin/su";

            File file = new File(suPath);

            if (!file.exists()) {

                suPath = "/system/bin/su";

            }

            Process process = Runtime.getRuntime().exec(suPath);

            String cmd = "reboot\nexit\n";

            process.getOutputStream().write(cmd.getBytes());

            return true;

        } catch (IOException error) {

            return false;

        }

    }

注意卸载和安装需要在子线程中执行;如果单纯关机则用“reboot -p”命令。

Android静默安装与静默卸载(系统应用)

一.轰隆一声雳响,我闪亮登场。

本篇基于已有系统证书(从Android设备厂家获得)的情况下实现静默安装与静默卸载,可分为三部分讲解:将apk内置为系统应用,apk静默安装与apk静默卸载。

1.将apk内置为系统应用。内置的方法有共性,也有区别。基础操作是共性,区别就在于Android4.4以上版本与Android4.4以下版本。

2.apk静默安装。

3.apk静默卸载。

二.若您觉得本文对您有帮助,记得点个关注哟~

android如何实现静默安装哦

原理

静默安装、卸载的原理就是利用pm install命令来安装apk,pm uninstall 来卸载apk.

智能安装是利用android系统提供的无障碍服务AccessibilityService,来模拟用户点击,从而自动安装.

//静默安装
    private void installSlient() {
        String cmd = "pm install -r /mnt/sdcard/test.apk";
        Process process = null;
        DataOutputStream os = null;
        BufferedReader successResult = null;
        BufferedReader errorResult = null;
        StringBuilder successMsg = null;
        StringBuilder errorMsg = null;
        try {
            //静默安装需要root权限
            process = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(process.getOutputStream());
            os.write(cmd.getBytes());
            os.writeBytes("\n");
            os.writeBytes("exit\n");
            os.flush();
            //执行命令
            process.waitFor();
            //获取返回结果
            successMsg = new StringBuilder();
            errorMsg = new StringBuilder();
            successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
            errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String s;
            while ((s = successResult.readLine()) != null) {
                successMsg.append(s);
            }
            while ((s = errorResult.readLine()) != null) {
                errorMsg.append(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (process != null) {
                    process.destroy();
                }
                if (successResult != null) {
                    successResult.close();
                }
                if (errorResult != null) {
                    errorResult.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //显示结果
        tvTest.setText("成功消息:" + successMsg.toString() + "\n" + "错误消息: " + errorMsg.toString());
    }

android N 内置可卸载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" >  

相关推荐:

Android如何静默卸载应用

深圳海鲜市场哪里便宜

马拉松是为了纪念的.

5G对于工业互联网有什么助力

深圳海关口岸代码

马拉松是为了纪念谁

Android开发还有明天吗

深圳国际园林花卉博览园要门票吗

标签: [db:标签]

声明:《Android如何静默卸载应用》一文由排行榜大全(佚名 )网友供稿,版权归原作者本人所有,转载请注明出处。如果您对文章有异议,可在反馈入口提交处理!

最近更新

  • Android如何静默卸载应用

    要实现静默卸载,首先你要有root权限,能把你的静默卸载程序移动到system/app目录下。用RE浏览器将你的应用一般在/data/app目录下)移动到/syste...

    百科 日期:2023-04-04

  • 深圳海鲜市场哪里便宜

    1、布吉海鲜批发市场。地址:深圳市罗湖区布吉路1021号。2、福海海鲜市场。地址:深圳市宝安区宝安大道6003号附近。3、西乡海鲜市场。地址:深圳...

    百科 日期:2023-04-04

  • 马拉松是为了纪念的.

    马拉松赛跑是为了纪念公元前490年希腊战士菲迪皮茨。公元前490年,希腊人在马拉松平原打败了波斯侵略军。当时有个叫菲迪皮茨的士兵,从马拉松平...

    百科 日期:2023-04-04

  • 5G对于工业互联网有什么助力

    5G将为工业互联网提供基础网络和业务能力,为制造强国建设提供关键支撑。5G在工业领域的应用具有非常广阔的前景,5G、互联网、大数据、人工智能...

    百科 日期:2023-04-04

  • 深圳海关口岸代码

    根据报关自动化常用代码表及其说明中的《关区代码表》,深圳关区下的关区代码为5300至5348。关区代码与海关设关地并不完全对应。深圳海关下属...

    百科 日期:2023-04-04

  • 马拉松是为了纪念谁

    公元前490年9月12日,在波斯与雅典的战役中,波斯人丢下了6400具尸体和7条战船,雅典人牺牲了192人,雅典取得了胜利。米太亚得急于把胜利的消息告诉...

    百科 日期:2023-04-04

  • Android开发还有明天吗

    Android 的核心平台是其智能手机这块,但长期以来一直所受的困扰就是运行其系统的智能手机品质差次不齐。老的 Anroid 设备运行起来对比其同时...

    百科 日期:2023-04-04

  • 深圳国际园林花卉博览园要门票吗

    深圳国际园林花卉博览园免费开放。深圳国际园林花卉博览园,地处深圳市深南大道竹子林西段,面积约66万平方米,于2004年9月23日正式对游客开放。...

    百科 日期:2023-04-04

百科排行榜精选

邮箱不能为空
留下您的宝贵意见