修改安卓系统应用,将自己的app变成系统应用
在安卓系统的机制里面 ,只要是将app复制到系统的system文件/system/app 文件夹中的app,都是系统应用,如果你把系统内置的应用从里面删除了,也就是彻底移除了作为系统应用的条件 .这就是很多软件可以删除 操控系统应用的一个实际干的事情…当然,要做这个操作,就必须得先root,不然是不可能做到的.首先 : 可以用adb 命令,adb 命令是需要在电脑端完成的.(不明白adb...
在安卓系统的机制里面 ,只要是将app复制到系统的system文件/system/app 文件夹中的app,都是系统应用,如果你把系统内置的应用从里面删除了,也就是彻底移除了作为系统应用的条件 .这就是很多软件可以删除 操控系统应用的一个实际干的事情…
当然,要做这个操作,就必须得先root,不然是不可能做到的.
首先 : 可以用adb 命令 ,adb 命令是需要在电脑端完成的.
(不明白adb命令的,可以去看我的博客里面的说明(https://blog.csdn.net/u012930316/article/details/90314634)
可以先把你要设置的app ,复制到sd卡的目录下面,也就是 /sdcard/
-
这个操作也可以使用adb来完成
adb push demo.apk /sdcard/ -
进入手机的shell 命令行:
adb shell -
然后切换root 用户
su root
如图:
- 然后解锁系统分区,就锁这个分区后,就可以往里面复制我们的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;
}
更多推荐
所有评论(0)