问题
在adb shell
中直接执行命令脚本可正常执行
su
export CLASSPATH=Test.jar
exec app_process /system/bin xx.xx.Test $0
但通过Runtime.getRuntime().exec("sh")
执行时,却没有任何效果。
原因
在安卓4.4下正常运行,安卓4.2却不行。一度怀疑是dx --dex
打包进去的依赖包无法兼容API 17导致。
最后在Stack Overflow
上挖到了同样的旧坑…
原文如下:
It seems like that when launching dalvikvm, your LD_LIBRARY_PATH is not correctly set in the environment. In ICS & JB, dalvikvm requires LD_LIBRARY_PATH to have certain path in it. The default is /vendor/lib:/system/lib, although usually /system/lib is enough. Else you would see the exception.
You may try to add export LD_LIBRARY_PATH=/vendor/lib:/system/lib after the su command in your script.
If your euid does not match your uid, LD_LIBRARY_PATH may be stripped from the environment. You can use id and id -r after su to check if they match. You may also check if /system/bin/mksh is setuid’ed, since this may also cause the problem.
大致意思是,当执行su
命令时,如果euid
与uid
不匹配,则可能会从环境中删除环境变量LD_LIBRARY_PATH。
解决办法
在命令脚本su
命令后,增加如下命令:
export LD_LIBRARY_PATH=/vendor/lib:/system/lib