进程(Android合子)从init进程分叉,然后调用execv加载要运行的真实二进制文件(/system/bin/app_process)。正如我从日志时间戳中检查的那样,fork和"execv系统调用返回"之间几乎没有延迟,但"execv system call return"one_answers"app_process的main()"之间有一个明显的延迟(约1s)。
看起来进程是在execv系统调用之后调度的,并在一段时间后被调度,导致真正的main()延迟1秒。(当然,.so的加载也应该有助于这1秒)。
我的目标是让这个进程在execv调用后尽快运行。我已经尝试为fork之后的进程设置最高优先级-20,延迟减少到1秒,但我仍然希望进一步减少。
有没有办法让这个进程在execv系统调用返回后立即运行?
后来我转储了目标进程的调度日志,发现它在execv调用之后就已经被调度了,但由于mm映射页故障,它很快就放弃了CPU——这表明它开始加载二进制文件。它需要加载太多的库,以至于在转到main()函数之前花了将近一秒钟的时间。所以问题是朝着错误的方向,如果可能的话,正确的方向是如何加速加载。