(1)app_process是用来干嘛的?
app_process可以在Android启动独立的Java进程(Main应用程序)
(2)在什么情况下,可以启动Java进程呢?
a. 利用adb shell启动的Java进程,这种情况下Java进程拥有shell级别的权限,所以Java程序对应的PID和Shell的PID一样。
b.利用app启动的Java进程,这种情况下Java进程跟当前app的权限一样,没有Shell权限。
(3)可以做哪些事情?
通过电脑shell启动一个shell的Java程序,就可以长驻手机了,可以做远程录屏、远程控制等特殊功能。
(4)在adb下,如何启动?
d:
cd D:\work_sdk\android\platform-tools
adb push D:\test\Main.dex /sdcard/
@echo off
echo export CLASSPATH=/sdcard/Main.dex >> temp.txt
echo exec app_process /sdcard cn.mimashuo.puppet.Main >> temp.txt
adb shell < temp.txt
del "temp.txt"
pause
(5)在Android下,如何启动?
private int testAppProcess() {
int status = 0;
synchronized (HomeActivity.class) {
Process process = null;
DataOutputStream os = null;
MsgInputThread msgInput = null;
ErrorInputThread errorInput = null;
try {
process = Runtime.getRuntime().exec("su");// 切换到root帐号
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(" export CLASSPATH=/sdcard/Main.dex \n");
os.writeBytes(" exec app_process /sdcard cn.mimashuo.puppet.Main \n");
os.writeBytes(" exit \n");
os.flush();
// 启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流=>解决waitFor()阻塞的问题
msgInput = new MsgInputThread(process.getInputStream(), new MsgInputThread.Listen() {
@Override
public void test() {
}
});
msgInput.start();
errorInput = new ErrorInputThread(process.getErrorStream());
errorInput.start();
// waitFor返回的退出值的过程。按照惯例,0表示正常终止。waitFor会一直等待
status = process.waitFor();// 什么意思呢?具体看http://my.oschina.net/sub/blog/134436
if (status != 0) {
LogUtil.d("root日志:" + msgInput.getMsg());
}
} catch (Exception e) {
LogUtil.e("出错:" + e.getMessage());
status = -2;
return status;
} finally {
try {
if (os != null) {
os.close();
}
} catch (Exception e) {
}
try {
if (process != null) {
process.destroy();
}
} catch (Exception e) {
}
try {
if (msgInput != null) {
msgInput.setOver(true);
}
} catch (Exception e) {
}
try {
if (errorInput != null) {
errorInput.setOver(true);
}
} catch (Exception e) {
}
}
} // end synchronized
return status;
}
(6)关于Java进程启动后的Pid, Uid与权限等问题,可参考:
http://blog.youkuaiyun.com/u010651541/article/details/53163542