Android Framework实战开发-Socket让app实现shell命令行执行

Posted Android高级知识分享官

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Framework实战开发-Socket让app实现shell命令行执行相关的知识,希望对你有一定的参考价值。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

android Framework实战开发-Socket让app实现shell命令行执行

1、项目背景

在android系统开发过程中,经常会有这样一个需求,就是可能需要让自己app执行一个shell脚本,但是目前app的一般方法都是getRumtime exec方式,但是这种方法基本不可能可以实现,因为只有在root的机子上这个方法才可以成功,但是你想想,一般正常的产品可以有root权限么,那是当然不可能可以有的。

但是有客户就是想要在他的app上可以执行对应的shell命令等来动态启动一些脚本等。
那么问题来了,到底什么方式才可以实现在不用root的机子上也可以成功让普通app实现对shell命令行的一个执行?这里我相信网上应该几乎没有资料,所以这个也是前期学员一直问我的一个经典实战案例。这里我就把他实现后,给大家分享出来。

为什么app的getRumtime 不行?
其实这里不行最主要还是android本身的权限机制管控导致了,你想想如果android要是不管控,如果任意一个第三方app都可以实现对shell命令的操作了,那么第三方app随意获取系统里面的包名,把自己竞品的apk都统统卸载,任意删除一些系统数据等,这是多么危险的事情。所以普通app是绝对没有shell修改权限。那么这个问题就无解了么?

2、解决方法

这里我们才有的解决方法是一种借壳法,什么是借壳法呢?意思就是虽然我app自己没有权限,但是我可以让有权限的程序来帮我执行啊,

这个时候我们就要找到一个有执行shell权限的程序,然后和这个程序进行一个跨进程通信,app把要执行的命令发送给这个高权限的程序,程序就会执行app发送过来的命令,这个时候再跨进程返回结果给app既可以

3、具体实现

那么说了这个借壳法可能大家思路都是明白,那么大家可能又会说那具体谁才有高权限,具体怎么做呢?
首先我们知道shell命令行执行的程序那么他的权限组都是和我们命令行一样的权限,即都是shell,所以我们shell启动的程序就是一个高权限的程序,故我们是否可以考虑写一个native程序与普通app程序进行通信,执行对应命令既可以。
那么native程序实现好了后,那这个native程序又怎么获得这个shell相关权限呢?
不可能还让用户手动去shell命令行启动我们的程序。。。
所以这个时候我们就需要了解adb shell命令行本质其实也是android系统的adbd来比我们执行命令的,那么就立即会想到adbd的权限就是一切shell的根源,也就是完全可以考虑在adbd源码程序里面来启动我们自己写的native程序

大家看以下这幅图

MyApplicationB就是我们普通第三方程序

rootServer就是我们写的native执行,负责和MyApplicationB进行通信和执行shell命令

adbd就是负责来拉起rootServer

以上就是实现普通app也可以命令行的根本原理,代码等需要视频资料里面获取哦

以上是关于Android Framework实战开发-Socket让app实现shell命令行执行的主要内容,如果未能解决你的问题,请参考以下文章

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析