我修改了AOSP/art/dex2oat.cc
,来做到当 dex2oat 运行时,能够运行别的程序。部分代码段是这样的:
int tester() {
pid_t pid;
int status;
if ((pid = fork()) < 0) {
status = -1;
} else if (pid == 0) {
execl("/system/xbin/busybox", "busybox", "wget", "www.google.com", "-O", "/cache/g.html", (char *) 0);
_exit(127);
} else {
while (waitpid(pid, &status, 0) < 0) {
if (errno != EINTR) {
status = -1;
break;
}
}
}
return status;
}
int main(int argc, char **argv) {
int status = tester();
return art::dex2oat(argc, argv);
}
当我安装一个 apk 的时候, pm 会自动调用dex2oat
,并且上文中的tester
函数会被调用。但是会返回256
(转化成一个字节就是1
,也就是返回的值是 1), 并且在 cache 目录下也找不到g.html
。
但是,当我在 adb shell 中运行/system/bin/dex2oat
时, wget
就能被正常的调用, 并且返回0
,同时,也能在 cache 目录下找到g.html
。(看上去是一切正常的)
SELinux 是 permissive 的, Android 版本是 5.1.1 。
问题究竟出在哪?同时我也发在了 stackoverflow 上了,暂时还没有人解答: http://stackoverflow.com/questions/42200112/modify-aosp-art-dex2oat-cc-to-run-another-program-but-return-value-256