博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发中,apk文件安装到\system\app 的解决办法 仅限root机
阅读量:6551 次
发布时间:2019-06-24

本文共 3249 字,大约阅读时间需要 10 分钟。

hot3.png

在 Android 中,如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到 /system/app/ 下。下面以 SecureSetting.apk 为例,演示这个操作。需要准备一台已经获得 Root 权限的手机。1、通过 USB 连接手机和电脑。2、使用 adb 控制手机。源码打印?   1. $ adb push SecureSetting.apk /sdcard/  // 上传要安装的文件,为安装做准备。     2. $ adb shell     3. $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。     4. # mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。     5. # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。      6. # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。     7. # exit     8. $ exit  $ adb push SecureSetting.apk /sdcard/  // 上传要安装的文件,为安装做准备。$ adb shell$ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。# cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。 # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。# exit$ exit重启,可以看到 SecureSetting 已经安装好。
 
 
补充,如果要实现将自己的apk直接安装到/system/app/,则需要先写一个installer.apk,在里面执行shell将主要apk通过cat的方式写入/system/app,再用chmod修改权限,然后执行reboot就行了
附上java执行shell的代码:
public final class RootCmd {	// 执行linux命令并且输出结果	protected static String execRootCmd(String paramString) {		String result = "result : ";		try {			Process localProcess = Runtime.getRuntime().exec("su ");// 经过Root处理的android系统即有su命令			OutputStream localOutputStream = localProcess.getOutputStream();			DataOutputStream localDataOutputStream = new DataOutputStream(					localOutputStream);			InputStream localInputStream = localProcess.getInputStream();			DataInputStream localDataInputStream = new DataInputStream(					localInputStream);			String str1 = String.valueOf(paramString);			String str2 = str1 + "\n";			localDataOutputStream.writeBytes(str2);			localDataOutputStream.flush();			String str3 = null;//			while ((str3 = localDataInputStream.readLine()) != null) {//				Log.d("result", str3);//			}			localDataOutputStream.writeBytes("exit\n");			localDataOutputStream.flush();			localProcess.waitFor();			return result;		} catch (Exception localException) {			localException.printStackTrace();			return result;		}	}	// 执行linux命令但不关注结果输出	protected static int execRootCmdSilent(String paramString) {		try {			Process localProcess = Runtime.getRuntime().exec("su");			Object localObject = localProcess.getOutputStream();			DataOutputStream localDataOutputStream = new DataOutputStream(					(OutputStream) localObject);			String str = String.valueOf(paramString);			localObject = str + "\n";			localDataOutputStream.writeBytes((String) localObject);			localDataOutputStream.flush();			localDataOutputStream.writeBytes("exit\n");			localDataOutputStream.flush();			localProcess.waitFor();			int result = localProcess.exitValue();			return (Integer) result;		} catch (Exception localException) {			localException.printStackTrace();			return -1;		}	}	// 判断机器Android是否已经root,即是否获取root权限	protected static boolean haveRoot() {		int i = execRootCmdSilent("echo test"); // 通过执行测试命令来检测		if (i != -1) {			return true;		}		return false;	}}

转载于:https://my.oschina.net/tomcater/blog/346022

你可能感兴趣的文章
vue打包到服务器,页面显示空白
查看>>
hadoop大数据基础框架技术详解
查看>>
CNBC:现在是时候购买BCH了
查看>>
2018-11-29学习笔记
查看>>
【2018.04.18学习笔记】【linux基础知识7.1-7.5】
查看>>
Python基础——内置hashlib、IO、Json、codecs模块(0426)
查看>>
企业级 SpringBoot教程(三)SpringBoot用JdbcTemplates访问Mysql
查看>>
find命令,文件后缀名
查看>>
Illegal modifier for parameter s; only final is permitted
查看>>
多线程系列六:线程池
查看>>
5 月编程语言排行榜:Java第一,R跌出Top20
查看>>
使用SpringMVC的@Validated注解验证
查看>>
DDoS攻击新趋势:海量移动设备成为新一代肉鸡
查看>>
超详细的SN74LVC14ADR介绍,就在这里
查看>>
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统
查看>>
手把手教你设计一个百万级的消息推送系统
查看>>
关于请求被挂起页面加载缓慢问题的追查
查看>>
Python之父重回决策层,社区未来如何发展?
查看>>
Git管理代码:Git简介与安装、配置(一)
查看>>
Flutter 实现原理及在马蜂窝的跨平台开发实践
查看>>