您的位置:首页 > 移动开发 > Android开发

Android下如何写出一个需要Root应用的程式

2013-07-09 20:31 344 查看
/* kangear:文章提到了NDK怎么获取ROOT权限,abc步应该能够解决了我的NDK获取ROOT的问题 */

在Linux/Unix环境下root是最高权限者,所以拥有root就等于拥有系统全部控制权,也因为这样只要使用root随便一个动作将会造成系统的损毁或是产生资安问题。

正因如此Android装置一般原厂不会开放root权限而只会提供uid及gid为shell的权限,除了担心使用者勿删重要档案外,最主要的原因还是资讯安全的问题,例如保护apk程式、线上影音DRM、...等等。

本篇主要实作如何在Android程式中使用root权限执行动作,注意的是当Android装置进行root后,原厂几乎不在保固该设备,故本篇文章内容说明在SDK开发中使用root权限全所以不提供如何root方法,相关root方法有需要的Google搜寻一下吧。





【免责声明】:本实作有可能会造成Android装置或是相关周边的损毁,相对可能危及到相关设备的保固或维修,请评估是否可以自行承担相关风险,如无把握请勿尝试将不负任何责任。 在Google
Play中我们发现有不少程式会使用到root权限才能执行,通常这些程式绝大多都是为了更改档案(装置)系统权限,然后使用它。 例如HelloUsbUart这一篇文章内容所述如果要挂载USB随身碟的话最快的方法就是将/dev/usb/xxx(装置名)权限改为drwxrwxrwx (chmod 777)然后将该装置挂载到一个目录下就可以使用了,这种方式有点类似[root]
StickMount这个程式做法,使用这样的方法优点是程式撰写简单,使用Linux操作指令就可用了,缺点是装置需要进行root,有保固问题。 另外值得一提的是在Google Play上有一个不用root就可以读取USB随身碟软体Nexus
Media Importer,这支程式作法就类似使用上一篇直接使用USB通讯来做,所以不用root权限就可以读取USB随身碟,这部分请看下图程式开启时会去读取的USB装置是/dev/bus/usb/00x/00x....讯息。使用这样的方法优点是装置不需要进行root,缺点是程式撰写比较进阶(专业)而且要对于USB装置的通讯十分清楚。









除了​​USB随身碟应用外,再举个比较知名的软体SetCPU
for Root Users,这支程式主要就是在调整/sys/devices/system/cpu目录下的参数达到节能获超频的功能,由于该目录下的档案权限一般shell的权限无法修改,所以必须透过root权限来读写。 综合上述说明概略的提出了root权限的使用时机,今天实作如何在Android程式中使用root权限执行动作,延续上一篇HelloUsbUart文章还是以NEXUS
7作为测试平台。 下面是本次实验的环境: Google nexus 7 (Android 4.2 Jelly Bean) ASUS Transformer Prime TF201 OTG线 USB to RS-232 (PL-2303) 开发环境: Win 7 SP1 Java 1.6.0_35Eclipse 3.7.2 Android SDK r20 .0.3 具备知识 Linux系统操作 USB通讯知识 程式内容: (1)获取与设备通讯的权限 在这个部分在这支程式可有可无,这部分功能主要是侦测当USB装置插上后,会询问是否要执行这个程式,如果不需要这样的功能可以直接跳过。 参考Android
USB应用之HelloUsbUart(RS-232)这篇文章中的获取与设备通讯的权限,主要是改AndroidManifest.xml及增加res/xml/device_filter.xml AndroidManifest.xml 在<intent-filter>与</ intent-filter>加入<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
/> 在</activity>前面加入<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> 在专案目录res中建立一个xml目录,在xml目录下建立一个device_filter.xml档案,其内容定义USB的PID与UID这必须要视你连上的USB装置而定,相关内容如下:



res/xml/device_filter.xml <?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1659" product-id="8963" /> </resources
> (2)主程式MainActivity中程式码如下:













上述程式主要有三个步骤:

a.执行"su
-c system/bin/sh"将预设shell使用者改变成root。

b.用root权限执行chmod
0666 /dev/xxx(装置名)

c.离开root权限返回shell使用者。(3)执行结果: 可以用指令方式确认: 执行程式前: android:/ $ ls -l /dev/ttyUSB0 crw------- root
root 188, 0 2012-11-16 09:57 ttyUSB0 执行程式后: android:/ # ls -l /dev/ttyUSB0 crw-rw-rw- root root 188, 0 2012-11-16 17:47 ttyUSB0















后记:

类似这样的方法同样可以使用在NDK开发下,如果是透过NDK来开始用root权限的话,只要找有关于C语言执行外部指令同样执行上面所说的abc三个步骤即可。 ==============延伸阅读===================== Android
USB应用之HelloUsbUart(RS-232) === ===========相关阅读===================== Java
Native Interface (JNI) Android实战篇(使用NDK) -- HelloUartAndroid
Bluetooth应用之HelloBTUart(RS-232)

原文地址:http://cheng-min-i-taiwan.blogspot.com/2012/11/androidroot.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐