android apk获取root权限执行相应的操作 demo调试
在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等。下面是在apk中获取root权限的方法,前提是设备已经root过了。
关键点在于下面这句,通过执行su产生一个具有root权限的进程:
Process p = Runtime.getRuntime().exec(“su”);
然后,在向这个进程的写入要执行的命令,即可达到以root权限执行命令:
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + “\n”);
dos.flush();
或者用下面的方式:
Runtime.getRuntime().exec(new String[]{“/system/bin/su”,”-c”, cmd});
经过测试,以root权限执行命令,只在真机上测试成功,在模拟器上没有成功过。
第一次运行时,会出现请求root权限的界面,选中记住,并允许:
测试程序界面,如果已经root,界面中可以显示出/system分区对应的设备节点:
主要文件:RootCmd.java
[java]
package org.ckl.root; import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException; import android.util.Log; public final class RootCmd { private static final String TAG = "RootCmd"; private static boolean mHaveRoot = false; // 判断机器Android是否已经root,即是否获取root权限 public static boolean haveRoot() { if (!mHaveRoot) { int ret = execRootCmdSilent("echo test"); // 通过执行测试命令来检测 if (ret != -1) { Log.i(TAG, "have root!"); mHaveRoot = true; } else { Log.i(TAG, "not root!"); } } else { Log.i(TAG, "mHaveRoot = true, have root!"); } return mHaveRoot; } // 执行命令并且输出结果 public static String execRootCmd(String cmd) { String result = ""; DataOutputStream dos = null; DataInputStream dis = null; try { Process p = Runtime.getRuntime().exec("su");// 经过Root处理的android系统即有su命令 dos = new DataOutputStream(p.getOutputStream()); dis = new DataInputStream(p.getInputStream()); Log.i(TAG, cmd); dos.writeBytes(cmd + "\n"); dos.flush(); dos.writeBytes("exit\n"); dos.flush(); String line = null; while ((line = dis.readLine()) != null) { Log.d("result", line); result += line; } p.waitFor(); } catch (Exception e) { e.printStackTrace(); } finally { if (dos != null) { try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } if (dis != null) { try { dis.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } // 执行命令但不关注结果输出 public static int execRootCmdSilent(String cmd) { int result = -1; DataOutputStream dos = null; try { Process p = Runtime.getRuntime().exec("su"); dos = new DataOutputStream(p.getOutputStream()); Log.i(TAG, cmd); dos.writeBytes(cmd + "\n"); dos.flush(); dos.writeBytes("exit\n"); dos.flush(); p.waitFor(); result = p.exitValue(); } catch (Exception e) { e.printStackTrace(); } finally { if (dos != null) { try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; }
} 相关文件:SystemPartition.java,获取/system分区设备节点,并支持重新mount /system为可读写:
[java]
package org.ckl.root; import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import android.util.Log; public class SystemPartition { private static final String TAG = "SystemMount"; private static String TMP_PATH = "/sdcard/mount.txt"; private static String mMountPiont = null; private static boolean mWriteable = false; private SystemPartition() { Log.i(TAG, "new SystemMount()"); } private static class SystemPartitionHolder { private static SystemPartition instance = new SystemPartition(); } public SystemPartition getInstance() { return SystemPartitionHolder.instance; } public static String getSystemMountPiont() { DataInputStream dis = null; if (mMountPiont == null) { try { RootCmd.execRootCmd("mount > " + TMP_PATH);
// Runtime.getRuntime().exec("mount > " + TMP_PATH); dis = new DataInputStream(new FileInputStream(TMP_PATH)); String line = null; int index = -1; while ( (line = dis.readLine()) != null ) { index = line.indexOf(" /system "); if (index > 0) { mMountPiont = line.substring(0, index); if (line.indexOf(" rw") > 0) { mWriteable = true; Log.i(TAG, "/system is writeable !"); } else { mWriteable = false; Log.i(TAG, "/system is readonly !"); } break; } } } catch (Exception e) { e.printStackTrace(); } finally { if (dis != null) { try { dis.close(); } catch (IOException e1) { e1.printStackTrace(); } dis = null; } File f = new File(TMP_PATH); if (f.exists()) { f.delete(); } } } if (mMountPiont != null) { Log.i(TAG, "/system mount piont: " + mMountPiont); } else { Log.i(TAG, "get /system mount piont failed !!!"); } return mMountPiont; } public static boolean isWriteable() { mMountPiont = null; getSystemMountPiont(); return mWriteable; } public static void remountSystem(boolean writeable) { String cmd = null; getSystemMountPiont(); if (mMountPiont != null && RootCmd.haveRoot()) { if (writeable) { cmd = "mount -o remount,rw " + mMountPiont + " /system"; } else { cmd = "mount -o remount,ro " + mMountPiont + " /system"; } RootCmd.execRootCmdSilent(cmd); isWriteable(); } }
}
权限列表:
在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作。在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用。android.permission.EXPAND_STATUS_BAR允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序android.permission.FACTORY_TEST作为一个工厂测试程序,运行在root用户android.permission.FLASHLIGHT访问闪光灯,android开发网提示HTC Dream不包含闪光灯android.permission.FORCE_BACK允许程序强行一个后退操作是否在顶层activitiesandroid.permission.FOTA_UPDATE暂时不了解这是做什么使用的,android开发网分析可能是一个预留权限.android.permission.GET_ACCOUNTS访问一个帐户列表在Accounts Service中android.permission.GET_PACKAGE_SIZE允许一个程序获取任何package占用空间容量android.permission.GET_TASKS允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等android.permission.HARDWARE_TEST允许访问硬件android.permission.INJECT_EVENTS允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android开发网提醒算是hook技术吧android.permission.INSTALL_PACKAGES允许一个程序安装packagesandroid.permission.INTERNAL_SYSTEM_WINDOW允许打开窗口使用系统用户界面android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问“properties”表在checkin数据库中,改值可以修改上传。android.permission.ACCESS_COARSE_LOCATION允许一个程序访问CellID或WiFi热点来获取粗略的位置android.permission.ACCESS_FINE_LOCATION允许一个程序访问精良位置(如GPS)android.permission.WRITE_CONTACTS允许程序写入但不读取用户联系人数据android.permission.WRITE_GSERVICES允许程序修改Google服务地图android.permission.WRITE_OWNER_DATA允许一个程序写入但不读取所有者数据android.permission.WRITE_SETTINGS允许程序读取或写入系统设置android.permission.WRITE_SMS允许程序写短信android.permission.WRITE_SYNC_SETTINGS允许程序写入同步设置android.permission.ACCESS_LOCATION_EXTRA_COMMANDS允许应用程序访问额外的位置提供命令android.permission.ACCESS_MOCK_LOCATION允许程序创建模拟位置提供用于测试android.permission.ACCESS_NETWORK_STATE允许程序访问有关GSM网络信息android.permission.ACCESS_SURFACE_FLINGER允许程序使用SurfaceFlinger底层特性android.permission.ACCESS_WIFI_STATE允许程序访问Wi-Fi网络状态信息android.permission.ADD_SYSTEM_SERVICE允许程序发布系统级服务android.permission.BATTERY_STATS允许程序更新手机电池统计信息android.permission.BLUETOOTH允许程序连接到已配对的蓝牙设备android.permission.BLUETOOTH_ADMIN允许程序发现和配对蓝牙设备android.permission.BROADCAST_PACKAGE_REMOVED允许程序广播一个提示消息在一个应用程序包已经移除后android.permission.BROADCAST_STICKY允许一个程序广播常用intentsandroid.permission.CALL_PHONE允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认android.permission.DELETE_CACHE_FILES允许程序删除缓存文件android.permission.DELETE_PACKAGES允许一个程序删除包android.permission.DEVICE_POWER允许访问底层电源管理android.permission.DIAGNOSTIC允许程序RW诊断资源android.permission.DISABLE_KEYGUARD允许程序禁用键盘锁android.permission.DUMP允许程序返回状态抓取信息从系统服务android.permission.CALL_PRIVILEGED允许一个程序拨打任何号码,包含紧急号码无需通过拨号用户界面需要用户确认android.permission.CAMERA请求访问使用照相设备android.permission.CHANGE_COMPONENT_ENABLED_STATE允许一个程序是否改变一个组件或其他的启用或禁用android.permission.CHANGE_CONFIGURATION允许一个程序修改当前设置,如本地化android.permission.CHANGE_NETWORK_STATE允许程序改变网络连接状态android.permission.CHANGE_WIFI_STATE允许程序改变Wi-Fi连接状态android.permission.CLEAR_APP_CACHE允许一个程序清楚缓存从所有安装的程序在设备中android.permission.CLEAR_APP_USER_DATA允许一个程序清除用户设置android.permission.CONTROL_LOCATION_UPDATES允许启用禁止位置更新提示从无线模块android.permission.REBOOT请求能够重新启动设备android.permission.RECEIVE_BOOT_COMPLETED允许一个程序接收到ACTION_BOOT_COMPLETED广播在系统完成启动android.permission.RECEIVE_MMS允许一个程序监控将收到MMS彩信,记录或处理android.permission.RECEIVE_SMS允许程序监控一个将收到短信息,记录或处理android.permission.RECEIVE_WAP_PUSH允许程序监控将收到WAP PUSH信息android.permission.RECORD_AUDIO允许程序录制音频android.permission.REORDER_TASKS允许程序改变Z轴排列任务android.permission.RESTART_PACKAGES允许程序重新启动其他程序android.permission.SEND_SMS允许程序发送SMS短信android.permission.INTERNET允许程序打开网络套接字android.permission.MANAGE_APP_TOKENS允许程序管理(创建、催后、 z-order默认向z轴推移)程序引用在窗口管理器中android.permission.MASTER_CLEAR目前还没有明确的解释,android开发网分析可能是清除一切数据,类似硬格机android.permission.MODIFY_AUDIO_SETTINGS允许程序修改全局音频设置android.permission.MODIFY_PHONE_STATE允许修改话机状态,如电源,人机接口等android.permission.MOUNT_UNMOUNT_FILESYSTEMS允许挂载和反挂载文件系统可移动存储android.permission.PERSISTENT_ACTIVITY允许一个程序设置他的activities显示android.permission.PROCESS_OUTGOING_CALLS允许程序监视、修改有关播出电话android.permission.READ_CALENDAR允许程序读取用户日历数据android.permission.READ_CONTACTS允许程序读取用户联系人数据android.permission.READ_FRAME_BUFFER允许程序屏幕波或和更多常规的访问帧缓冲数据android.permission.READ_INPUT_STATE允许程序返回当前按键状态android.permission.READ_LOGS允许程序读取底层系统日志文件android.permission.READ_OWNER_DATA允许程序读取所有者数据android.permission.READ_SMS允许程序读取短信息android.permission.READ_SYNC_SETTINGS允许程序读取同步设置android.permission.READ_SYNC_STATS允许程序读取同步状态android.permission.SET_ACTIVITY_WATCHER允许程序监控或控制activities已经启动全局系统中android.permission.SET_ALWAYS_FINISH允许程序控制是否活动间接完成在处于后台时android.permission.SET_ANIMATION_SCALE修改全局信息比例android.permission.SET_DEBUG_APP配置一个程序用于调试android.permission.SET_ORIENTATION允许底层访问设置屏幕方向和实际旋转android.permission.SET_PREFERRED_APPLICATIONS允许一个程序修改列表参数PackageManager.addPackageToPreferred()和PackageManager.removePackageFromPreferred()方法android.permission.SET_PROCESS_FOREGROUND允许程序当前运行程序强行到前台android.permission.SET_PROCESS_LIMIT允许设置最大的运行进程数量android.permission.SET_TIME_ZONE允许程序设置时间区域android.permission.SET_WALLPAPER允许程序设置壁纸android.permission.SET_WALLPAPER_HINTS允许程序设置壁纸hitsandroid.permission.SIGNAL_PERSISTENT_PROCESSES允许程序请求发送信号到所有显示的进程中android.permission.STATUS_BAR允许程序打开、关闭或禁用状态栏及图标Allows an application toopen, close, or disable the status bar and its icons.android.permission.SUBSCRIBED_FEEDS_READ允许一个程序访问订阅RSS Feed内容提供android.permission.SUBSCRIBED_FEEDS_WRITE系统暂时保留改设置,android开发网认为未来版本会加入该功能。android.permission.SYSTEM_ALERT_WINDOW允许一个程序打开窗口使用TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层android.permission.VIBRATE允许访问振动设备android.permission.WAKE_LOCK允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失android.permission.WRITE_APN_SETTINGS允许程序写入API设置android.permission.WRITE_CALENDAR允许一个程序写入但不读取用户日历数据可以看出Android中对资源以及服务的访问都非常严格,另外,在程序打包成APK的时候也需要对软件进行签名。获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令 获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用 获取网络状态 android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效 访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图 获取WiFi状态 android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息 账户管理 android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限 验证账户 android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息 电量统计 android.permission.BATTERY_STATS,获取电池电量统计信息 绑定小插件 android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限 绑定设备管理 android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用 绑定输入法 android.permission.BIND_INPUT_METHOD,请求InputMethodService服务,只有系统才能使用 绑定RemoteView android.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用 绑定壁纸 android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用 使用蓝牙 android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备 蓝牙管理 android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备 变成砖头 android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头 应用删除时广播 android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播 收到短信时广播 android.permission.BROADCAST_SMS,当收到短信时触发一个广播 连续广播 android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播 WAP PUSH广播 android.permission.BROADCAST_WAP_PUSH,WAPPUSH服务收到后触发一个广播 拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 通话权限 android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面 拍照权限 android.permission.CAMERA,允许访问摄像头进行拍照 改变组件状态 android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态 改变配置 android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位 改变网络状态 android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网 改变WiFi多播状态 android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态 改变WiFi状态 android.permission.CHANGE_WIFI_STATE,改变WiFi状态 清除应用缓存 android.permission.CLEAR_APP_CACHE,清除应用缓存 清除用户数据 android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据 底层访问权限 android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息 手机优化大师扩展权限 android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限 控制定位更新 android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变 删除缓存文件 android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件 删除应用 android.permission.DELETE_PACKAGES,允许程序删除应用 电源管理 android.permission.DEVICE_POWER,允许访问底层电源管理 应用诊断 android.permission.DIAGNOSTIC,允许程序到RW到诊断资源 禁用键盘锁 android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁 转存系统信息 android.permission.DUMP,允许程序获取系统dump信息从系统服务 状态栏控制 android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏 工厂测试模式 android.permission.FACTORY_TEST,允许程序运行工厂测试模式 使用闪光灯 android.permission.FLASHLIGHT,允许访问闪光灯 强制后退 android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层 访问账户Gmail列表 android.permission.GET_ACCOUNTS,访问GMail账户列表 获取应用大小 android.permission.GET_PACKAGE_SIZE,获取应用的文件大小 获取任务信息 android.permission.GET_TASKS,允许程序获取当前或最近运行的应用 允许全局搜索 android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能 硬件测试 android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试 注射事件 android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流 安装定位提供 android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供 安装应用程序 android.permission.INSTALL_PACKAGES,允许程序安装应用 内部系统窗口 android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限 访问网络 android.permission.INTERNET,访问网络连接,可能产生GPRS流量 结束后台进程 android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程 管理账户 android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表
android apk获取root权限执行相应的操作 demo调试相关推荐
- Android 系统(67)---android apk 的root 权限和USB adb 权限的区别
android apk 的root 权限和USB adb 权限的区别 USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权 ...
- android编译系统root权限,Android系统获取ROOT权限后能做些什么?
Android的设备Root了以后可以做些什么特别的操作呢?今天刷机之家小编为大家简述Root以后最实用的几种用途. 在了解Root的用途之前,我们先来简单看看Android的Root是什么. And ...
- android 手机获取 root 权限
为了让android 手机获取root权限,需要经历以下几个步骤. 手机解锁 现在大部分的手机在出厂时都锁定了bootloader,需要在官网上申请解锁,以小米为例,解锁网址.解锁的具体教程不在此详述 ...
- android 执行shell root权限,Android App 获取root权限后,执行shell命令
背景: 做一个应用,需求是获取root权限后可以停用/启用某些应用,包括系统应用!停用的应用将不在设置-->应用中展示,大部分系统自带的桌面应该也不会再显示! 如果是用menifest.xml中 ...
- Android程序获取root权限问题的最终解决与分析
为了方便给出上一篇上一篇地址: http://blog.csdn.net/up1up2up3/article/details/7380651,调了几天这个root权限获取问题终于搞定了, ...
- android 版本权限差别,android apk 的root 权限和USB adb 权限的区别
USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权限,通常如果adb shell 看到是: Android 4.0 以后 ...
- ToolRoot——让你的APK获取ROOT权限
这个程序是把SuperUser中的su进行改版后做成的例子,关于SuperUser,可以看一下这两篇文章: RootExplorer怎么样获取root权限的 http://blog.csdn.net/ ...
- android 应用使用Root权限执行linux命令
要让Android应用使用Root权限,首先Android设备必须已经获得Root权限.之后可以通过下面的代码取得process对象. Process process = Runtime.getRun ...
- android apk获取权限,Android apk 获取系统权限的方式
Android系统中,权限等级分为 ["normal" | "dangerous"| "signature" | "signatu ...
最新文章
- 如何提高增加包含大量记录的表的主键字段的效率
- OpenGL硬件加速指南
- JSON字符串key缺少双引号的解决方法
- 【Python】序列通用操作
- 地图索引 R-tree
- shell学习三十四天----printf详解
- 光纤收发器出现死机故障怎么解决
- spark任务提交流程源码分析
- 每天一道剑指offer-翻转单词顺序列
- StringUtils简单判断字符串是否为null或者空字符串
- Android创建txt文件并写入
- 治愈系英语笔记-3-一般现在时、疑问词主语相同的句子
- C语言50题之百度笔试题
- 方法重载时,需要遵循以下三条原则
- hping3对某网站发起ddos攻击
- matlab迭代法求超越方程,matlab fsolve函数求解超越方程
- 【目标检测】Receptive Field Block Net for Accurate and Fast Object Detection论文理解
- php下单声音提醒,拼多多商家怎么设置下单的声音?开启方法是什么?
- 120亿光年外发现大量水:为地球储量140万亿倍
- 无法在设置线程模式后对其加以更改