Android提供了一种非常强大的方法来控制应用程序进程启动 - 它被称为wrapper script。它是一个名为wrap.sh
的简单shell脚本,应放在app installation lib/
目录中(如果有的话,包含本机库):
#!/system/bin/sh
my_wrapper_cmd $@
如果应用程序有这样的脚本,系统将不会分叉zygote来为应用程序创建托管进程。相反,一旦用户尝试启动应用程序 - 系统会使用单独的JVM将该脚本调用到start全新的app_process
。如果你是非常有用的,例如想要在Valgrind下启动应用程序或做一些LD_PRELOAD
。 (它仅适用于可调试的APK,但现在无关紧要)
目前,我可以制作包含libs/<my_device_abi>/wrap.sh
的APK。感谢snippet。但安装完成后,我在设备的wrap.sh
文件夹中看不到lib/
:
sailfish:/ $ run-as com.example.sergik.ndksample
sailfish:/data/data/com.example.sergik.ndksample $ ls -l lib/
total 40
-rwxr-xr-x 1 system system 13832 1979-11-30 00:00 libnative-lib.so
只有打包的.so
个库。同时APK包含该脚本。很明显,包经理已经跳过了它。
问题是:有没有人知道如何将我的脚本放到设备上或强制包管理器尊重它?
P.S。设备未植根,尝试通过wrap.sh
推送run-as
将无效,因为lib/
归系统所有,应用程序没有权限在那里写一些内容。