一、SystemMix接口说明
在android/frameworks/base/swextend/systemmix目录下,全志提供了一套用于访问底层高权限信息的接口,用户可以参照里面的做法来扩展SystemMix类的功能。
1. systemmix目录结构:
2. 该机制使用了Android上使用广泛的 客户端<--->服务端 机制去实现,调度流程如下:
3. 该SystemMix.java文件为用户提供了如下几个示例接口:
/**
* mount device or other
*/
public static int Mount(String source, String mountPoint, String fs, int flags, String options){
return nativeMount(source, mountPoint, fs, flags, options);
}
/**
* umount device or other
*/
public static int Umount(String mountPoint){
return nativeUmount(mountPoint);
}
/**
* get a property's value
*/
public static String getProperty(String key){
return nativeGetProperty(key);
}
/**
* set a property's value
*/
public static void setProperty(String key, String value){
if(key != null && value != null){
nativeSetProperty(key,value);
}
}
/**
* get command para in /proc/cmdline
*/
public static String getCmdPara(String name){
HashMap<String, String> paraMap = mapPara();
return paraMap.get(name);
}
@SuppressWarnings("null")
private static HashMap<String, String> mapPara(){
HashMap<String, String> paraMap = new HashMap<String, String>();
String cmdline = getCmdLine();
Log.d(TAG,"getCmdLine = " + cmdline);
if(cmdline != null){
String[] list = cmdline.split(" ");
if(list != null){
for(int i = 0; i < list.length; i++){
String[] map = list[i].split("=");
if(map == null || map.length != 2){
continue;
}
paraMap.put(map[0], map[1]);
}
}
}
return paraMap;
}
private static String getCmdLine(){
byte[] desData = new byte[256];
int ret = nativeGetFileData(desData, desData.length, "/proc/cmdline");
String str = null;
if(ret > 0){
str = new String(desData);
}
return str;
}
用户在扩展该SystemMix接口的时候,可以参考getCmdPara()方法的调度流程,同时对java端、jni端,client端,server端做出相应的扩展。
二、扩展SystemMix接口,让app执行shell命令
在SystemMix中添加runShell操作接口,为app提供root权限来执行shell命令。
1. SystemMix接口扩展
我们按照java端(SystemMix.javaÿ