前提

本文介绍的方案是在有安卓底层SDK源码的方案下实行的,若不具备这个条件的就不用往下继续看了,以免耽误你的时间。

写作目的

公司是做工程设备,运行的是安卓系统,系统使用是的user,系统上层的app都是预安装的。正常情况下,这样的app的是没法做一些特权操作的,如重启系统、安装软件、读写一些特殊文件夹的文件。为了解决这些问题,特意做了一个方案,使第三方的app也拥有了root权限。

实现思路

我们知道系统启动后会运行init程序,init程序会解析init.rc脚本,并执行init.rc中的命令,而init程序是拥有root权限的,那么如果写一个服务程序,将此服务程序放入到init.rc中,使其开机启动,并常驻与系统中,这样这个服务程序也将拥有了root权限。而我们的第三方app想要获取一些特权操作时,只需要把把操作指令发送给我们的服务程序,由这个服务程序去执行即可。

最终效果

Runtime.getRuntime().exec(“god reboot”); // 第三方app执行了系统重启命令

不难看出,这其实是用java调用了一个exec方法执行了一条脚本命令,而god是我底层的一个发送程序,意思是将god后方的命令发送给我底层的一个服务程序。底层的服务程序收到命令后,就会去执行它。
下面简单说下代码

发送方部分代码(god)

#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include "common/nativeNetServer.h"
#include "common/Utils.h"int main(int argc,char *argv[]){char cmdstr[1024] = {0};int i;if(argc < 2){return -1;}pNativeNetServerOps  netServer = createNativeNetServer();if(netServer == NULL){return -1;}char tempStr[32] = {0};for(i = 1;i<argc;i++){sprintf(cmdstr,"%s %s",cmdstr,argv[i]);}LOGD("[jerry] %s\n",cmdstr);return    netServer->runScript(netServer,cmdstr,4);
}
static int runScript(struct NativeNetServerOps * ops, const char * str,int timeout) {pNativeNetServer pthis = (pNativeNetServer) ops;int ret  =-1;if (pthis == NULL || pthis->udpServer == NULL) {return -1;}char recvbuf[1024] = {0};MsgBody msg = UdpBuildMsg(NOT_ACK, CMD_RUN_SCRIPT, str, strlen(str) + 1);ret = pthis->udpServer->write(pthis->udpServer, msg.buf, msg.len,SERVER_IP_ADDR, SERVER_PORT);if(ret < 0){LOGE(" fail to write!");goto fail0;}ret = pthis->udpServer->read(pthis->udpServer,recvbuf,sizeof(recvbuf),timeout*1000);if(ret < 0){LOGE(" fail to read!");goto fail0;}pT_Comm_Head ackComm =  &recvbuf;LOGE("ackComm.dataPack.dataStart : %d\n",ackComm->dataPack.dataStart);return ackComm->dataPack.dataStart;
fail0:LOGE(" fail to runScript!");return -1;}

这里的通讯使用的是socket,当然你也可以用管道或者binder或其他进程间通讯方案

服务端部分代码

static void cmdHandle(void* arg){pCmdArg cmdArg = arg;if(cmdArg == NULL){return;} pT_Comm_Head commHead = (pT_Comm_Head )cmdArg->data;commHead->dataPack.dtatLen = ntohl(commHead->dataPack.dtatLen);switch(commHead->cmd){case CMD_CONNECT_SCRIPT:{LOGD("CMD_CONNECT_SCRIPT\n");commHead->ackType = ACK_OK;udpServer->ack(udpServer,commHead,sizeof(T_Comm_Head),cmdArg->remoteInfo);}break;case CMD_RUN_SCRIPT:{char runScript[1024] = {0};int ret;memcpy(runScript,&commHead->dataPack.dataStart,commHead->dataPack.dtatLen);//   LOGD("system_run :[ %s ] start\n",runScript);ret = system(runScript);commHead->ackType = ACK_OK;commHead->dataPack.dataStart = ret;udpServer->ack(udpServer,commHead,sizeof(T_Comm_Head),cmdArg->remoteInfo);LOGD("system_run :[ %s ]  end\n",runScript);}break;case CMD_HEARTBEAT:{char heartbeatStr[1024] = {0};memcpy(heartbeatStr,&commHead->dataPack.dataStart,commHead->dataPack.dtatLen);daemonServer->keepHeartBeat(daemonServer,heartbeatStr);}   break;default:break;}if(cmdArg){if(cmdArg->data){free(cmdArg->data);}free(cmdArg);}}

执行脚本时使用的是system,当然也可以使用popen并把代码的执行结果返回给app。

init.rc文件

service nativeNetserver /system/bin/nativeNetserverclass mainuser rootgroup root

后续

当然这只是众多方案中的一种,本人技术有限,目前只能想到这个方案,若有同行朋友还有其他解法或补充之处,交流一二简直再好不过,由于代码文件比较多,这里就不全部上传,若有需要的朋友可以联系我,我将毫无保留的分享给你。

android 如何在user版本中获取root权限相关推荐

  1. Ubuntu中获取root权限

    Ubuntu中获取root权限 [转载]地址:http://bujingyun23.blog.163.com/blog/static/1813102432013233377716/ 2013-03-0 ...

  2. android root权限函数,android 4.4下app永久获取root权限的方法

    本帖最后由 jackson 于 2017-4-16 20:55 编辑 通过参照 [FAQ11414]android KK 4.4 版本后,user 版本su 权限严重被限制问题说明 http://ww ...

  3. AccountManager getAccount 在Android O 8.0版本中获取为 null ?

    问题 AccountManager accountManager = AccountManager.get(this);Account[] accounts = accountManager.getA ...

  4. Android如何在onCreate()方法中获取控件的高度和宽度

    在Android中,有时我们需要测量控件的宽度和高度进行一些运算,特别是在自适应屏幕的时候,这些计算就变得特别必要,但是,如果我们直接在onCreate,或者onStart.onResume(第一次执 ...

  5. Android 获取ROOT权限原理解析

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android玩家中常说的"越狱"有一个更深层次的认识. 二. Root的介绍 1.       Ro ...

  6. android apk获取root权限执行相应的操作 demo调试

    在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等.下面是在apk中获取root权限的方法,前提是设备已经root过 ...

  7. 让Android应用程序申请获取ROOT权限

    有时候我们写 Android APP,需要让它获取 ROOT 权限,那么如何让 APP 去向系统申请呢?下面提供一个方法,前提是系统是已经 ROOT 权限了,能够执行能 su 命令.如果不能,可以参考 ...

  8. Android之——申请获取ROOT权限

    有时候我们写 Android APP,需要让它获取 ROOT 权限,那么如何让 APP 去向系统申请呢?下面提供一个方法,前提是系统是已经 ROOT 权限了,能够执行能 su 命令.如果不能,可以参考 ...

  9. adb修改什么文件获取root权限_Android获取ROOT权限的通用方法

    背景 自从Android问世以后,给手机获取ROOT权限变成了玩机爱好者老生常谈的话题.拥有手机,却不能拥有操作手机的最高权限,这对于手机爱好者而言,这怎么可以忍?所以无论Android升到什么什么版 ...

最新文章

  1. Python处理MLDonkey 下载中文文件乱码问题 (2)
  2. matlab pareto 升级版
  3. VSCode + Latex 配置
  4. RuoYi-Vue————权限管理
  5. MFC 图片部分透明
  6. Oracle 定义变量的方法
  7. Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端
  8. Python3之paramiko模块
  9. python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换
  10. 【COCOS2DX隐藏IOS7状态栏】通过添加PLIST KEY隐藏IOS7状态栏
  11. NO.34 关于禅道加密
  12. 万豪国际数据再遭泄露影响520万客户,两名员工账户为突破口
  13. 前端JAVASCRIPT模块化开发
  14. python能做什么excel-python处理excel总结
  15. ubuntu国内镜像站点及更新源
  16. 实验4:Linux下C语言编程
  17. 「 微信黑科技 」神奇符号
  18. python获取代理服务器地址
  19. html怎么让页脚下方的空白页,Word中后面多出来带页眉页脚的空白页怎么删除
  20. 英特尔固态硬盘测试软件,AS SSD测试:IOPS值高达11万_Intel 520_固态硬盘评测-中关村在线...

热门文章

  1. BUI 示例总结(小技巧)
  2. OneDrive云盘使用
  3. Android 横向滚动列表 (类似横向ListView)
  4. 踩坑---django定时任务django-apscheduler
  5. urllib使用案例
  6. FreeSWITCH关于穿越NAT的那点事儿
  7. 好钢用在刀刃上――选择性启用NTFS压缩节省系统空间
  8. Android TextView竖直滚动文字广告效果
  9. VM虚拟机安装系统出现Operating system not found或Directory “ZEBOOT” not found Error loading iMage错误,保姆级解决教程
  10. 游戏耳机什么牌子好?低延迟游戏蓝牙耳机推荐