今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如
- 修改系统时间
- 静默安装
- 执行某shell命令
这些对于正常的应用来说,是需要很多技巧性的东西来做的,因为他们没有权限,而我们做定制系统的
话,可以给我们的应用来系统签名,这样就拥有系统的权限了,那我们应该怎么做呢?
我们以执行某shell命令为课题来解释:
首先,我们要知道,一般的命令都是在system/bin下,我们可以看图
使用shell命令,比如ls之类的,我们可以直接执行
try {Runtime runtime = Runtime.getRuntime();runtime.exec("ls");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
你会发现可以执行的,而且可以拿到返回值,通过返回一个Process,然后就可以拿到流了,这里不说,我们继续来看这个ls命令,如果你细心的话,你会发现,ls命令后面有一个字号:toolbox
关于toolbox,他是一个指令集,但是我们今天不讲他,但是你要知道他是一个全局集,有点类似配置了JAVA的环境变量,所有才会用户可以执行
但是我现在执行一个tinymix的指令
try {Runtime runtime = Runtime.getRuntime();Process exec = runtime.exec("tinymix -D 1");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
他肯定会报操作不允许,也就是我们没有这个权限,拿我们应该怎么去拿到这个权限呢?就是通过我们的系统签名
1.设置sharedUserId
为了拿到权限,我们需要在清单文件的manifest里设置和系统同一个UserId
android:sharedUserId=“android.uid.system”
2.获取签名文件
签名文件有三个
- platform.pk8
- platform.x509.pem
- signapk.jar
这三个都是可以在源码里拿到的
platform.pk8和platform.x509.pem都可以在build/target/product/security/目录下找到
signapk.jar在build/tools/signapk/目录下
3.系统签名
//执行命令signapk.jar platform.x509.pem platform.pk8 input.apk output.apk
我们拿到之后把这几个放在同一个目录下,然后打开cmd,执行命令
这句命令后面两个apk分别是你要签名的apk名字和签名后的apk名字,比如我需要签名的apk叫做app_debug
执行命令后会的到
ok,我们现在拿到Test.apk可不能安装,需要push到system/app下,执行命令
adb push apk路径 /system/app
但是很多人应该会报 Read-only file system错误的
那是因为你没有在remount模式下,你可以执行
adb root adb remount
就像这样
好的,至此,我们成功的系统签名了,接下来你就可以执行这个shell命令了
这里只是抛砖引玉下,各位自己发挥
有兴趣的可以加群:417046685