在安卓系统的机制里面 ,只要是将app复制到系统的system文件/system/app 文件夹中的app,都是系统应用,如果你把系统内置的应用从里面删除了,也就是彻底移除了作为系统应用的条件 .这就是很多软件可以删除 操控系统应用的一个实际干的事情…

当然,要做这个操作,就必须得先root,不然是不可能做到的.

首先 : 可以用adb 命令 ,adb 命令是需要在电脑端完成的.
(不明白adb命令的,可以去看我的博客里面的说明(https://blog.csdn.net/u012930316/article/details/90314634)

可以先把你要设置的app ,复制到sd卡的目录下面,也就是 /sdcard/

  1. 这个操作也可以使用adb来完成
    adb push demo.apk /sdcard/

  2. 进入手机的shell 命令行:
    adb shell

  3. 然后切换root 用户
    su root

如图:
在这里插入图片描述

  1. 然后解锁系统分区,就锁这个分区后,就可以往里面复制我们的app安装包了 :
    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system

在这里插入图片描述
5.再复制我们第一步时的app 至 系统分区下面的app目录下面
cat /sdcard/demo.apk > /system/app/demo.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:
6. mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
在这里插入图片描述

然后,关机重启, 将自己的app设置为系统app就完成了.但是,弄完这一步,并不能保证我们的app能正常运行,还需要进行下面的操作 .

在我们的app中,可能会有 lib 相关的关联包,你通过这样的方式引用的,需要手动去复制过去,那么需要进行这样的操作

首先,在电脑端,用解压缩工具,将我们的app解压到某个文件夹下面,在刚才解压的文件夹下面有个文件夹lib

在这里插入图片描述

打开这个文件夹,里面会有三个文件夹,分别对应不同的 系统架构生成的 so文件 ,需要找到合适系统架构的的so文件,复制到 系统分区的lib 目录中去(/system/lib/) 我这里是小米5的手机,我复制的是 armeabi 这个目录下面的 so文件.
那么执行步骤 ,
先执行刚才的第一步,把这个so文件,全部复制到 /sdcard/ 就是文件的根目录下面
再 执行上面的解锁系统分区 将系统分区解锁,然后把这个文件 复制到 对应的目录
如:
cat /sdcard/libsqlcipher.so > /system/lib/libsqlcipher.so

再把系统分区锁回去,然后,就可以试试app,看会不会崩了.

另外还有一个通过代码的方式去将自己的app 设定为系统应用 …原理和上面也是一样的.
代码贴上… 可以通过按钮触发 setSysApp();这个方法即可

/**
 *  设置为系统应用
 */
public  void setSysApp() {
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // 解锁系统分区
            String s = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system";
            CMDUtils.upgradeRootPermission(s);
            //
            s="cat /sdcard/demo.apk > /system/app/demo.apk";
            CMDUtils.upgradeRootPermission(s);
            s="cat /sdcard/libsqlcipher.so > /system/lib/libsqlcipher.so";
            CMDUtils.upgradeRootPermission(s);
            s="mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system ";
            CMDUtils.upgradeRootPermission(s);
        }
    };
    new ExecutorUtil(runnable).execute();

}

public class ExecutorUtil extends Thread{
    final static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    private Runnable runnable;

    public ExecutorUtil(Runnable runnable){
        this.runnable=runnable;
    }
    @Override
    public void run() {
        try{
            Looper.prepare();
            new Handler().post(runnable);//在子线程中直接去new 一个handler
            Looper.loop();//这种情况下,Runnable对象是运行在子线程中的,可以进行联网操作,但是不能更新UI
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public void execute() {
        cachedThreadPool.execute(this);
    }
}

// 获取系统权限的方式执行
    public static String upgradeRootPermission(String cmd) {
        Log.i(TAG, "执行开始");
        //String pkgCodePath = "/sdcard";
        Process process = null;
        DataOutputStream os = null;
        try {
            process = Runtime.getRuntime().exec("su"); //切换到root帐号
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(cmd + "\n");
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();


            StringBuilder successMsg = new StringBuilder();
            StringBuilder errorMsg = new StringBuilder();
            BufferedReader successResult = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            BufferedReader 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);
            }
//                cmdRsult = new CMD_Result(result, errorMsg.toString(),
//                        successMsg.toString());


            Log.i(TAG, successMsg.toString() + "执行完成" + errorMsg.toString());
            return successMsg.toString();
        } catch (Exception e) {
            Log.e(TAG, "异常 upgradeRootPermission: ", e);
        } finally {
            Log.i(TAG, "执行完成finally");
            try {
                if (os != null) {
                    os.close();
                }
                process.destroy();
            } catch (Exception e) {
            }
        }
        return  null;
    }
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐