第一篇博客:将用户程序转为系统程序
时光飞逝,大三因为喜欢玩手机软件开始接触安卓,到现在即将毕业,自己也在试用期中,觉得是时候慢慢把学到的,用到的东西记录下来,也方便以后项目需要用到进行查找,第一篇来讲讲本地应用转为系统应用(前提是得Root,搞机的无视此提醒)。
转成系统应用原理是使用Java的Runtime.getRuntime().exec(“linux指令”)实现转换,首先将/system/目录挂载为可读写,然后获取本地应用的安装路径,设置安装路径为/system/app/xx.apk,执行cat将本地应用文件写到系统应用文件夹,然后修改xx.apk的权限即可。
```
// 执行root指令的方法
public static boolean RootCommand(String command) {
Process process = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
Log.d("*** DEBUG ***", "Root SUC ");
return true;
}
try {
// 获取应用安装的路径
String sourceDir = context.getPackageManager() .getPackageInfo(context.getPackageName(), ).applicationInfo.sourceDir;
// 安装目标路径
String sourceTarget = "/system/app/" + Constant.APP_NAME+ ".apk";
// 挂载系统应用文件夹可读写,写入
String apkRoot = "mount -o remount,rw /system" + "\n"+ "cat " + sourceDir + " > " + sourceTarget;
// 执行指令
RootCmd.RootCommand(apkRoot);
// 修改权限
String apkRoot1 = "chmod 644 " + sourceTarget;
// 执行指令
RootCmd.RootCommand(apkRoot1);
// 转换后先验证是否转换成功,成功则弹出提示窗
File file = new File(sourceTarget);
if (file.exists()) {
RootCmd.showRebootDialog(context);
} else {
ToastUtil.toast(context, "未转换成功,是否没有ROOT或授权该应用");
}
} catch (Exception e) {
e.printStackTrace();
}
在弄毕设的时候做的是程序锁,为防止卸载做了这个功能,在网上找了很多例子都是写到/system/app/文件夹后app是错误的,这个是自己调试修改代码修改成功的,在原生系统,MIUI,FIUI,IUNI系统均可以转成系统应用。