Android P 的 Camera JNI 加载流程概述

平台 OS版本
MT6739 Android 9.0

系统上电,加载完 kernel 以后,是通过 init.rc 启动 Android 系统的 Zygote 的。

init.rc

文件路径: system/core/rootdir

  import /init.environ.rc
  import /init.usb.rc
  import /init.${ro.hardware}.rc
  import /vendor/etc/init/hw/init.${ro.hardware}.rc
  import /init.usb.configfs.rc
  import /init.${ro.zygote}.rc
  
  on early-init
  ... #省略无关命令

Android 系统启动后,首先启动 init 进程, 在该进程中解析了 init.rc 文件。在 Android P 中,关于 Zygotesection 段是在 import 字段中。

import /init.${ro.zygote}.rc

从这个这段可以知道,在 init.rc 文件中不再直接引入一个固定的文件,而是根据属性 ro.zygote 的内容来引入不同的文件。
android5.0 开始, android 开始支持64位的编译, zygote 本身也就有了32位和64位的区别,所以在这里用 ro.zygote属性来控制启动不同版本的zygote进程。
init.rc 位于 /system/core/rootdir 下。在这个路径下还包括四个关于 zygoterc 文件。分别是Init.zygote32.rc,Init.zygote32_64.rc,Init.zygote64.rc,Init.zygote64_32.rc 。由硬件决定调用哪个文件。
在我的项目中使用的是 Init.zygote32.rc

Init.zygote32.rc

文件路径: system/core/rootdir

 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
     class main    #class是一个option,指定zygote服务的类型是main
     priority -20
     user root
     group root readproc reserved_disk
     #socket关键字表示一个option。创建一个名为dev/socket/zygote,类型为stream,权限660的socket。
     socket zygote stream 660 root system 
     #onrestart是一个option,说明在zygote重启时需要执行的command
     onrestart write /sys/android_power/request_state wake
     onrestart write /sys/power/state on
     onrestart restart audioserver
     onrestart restart cameraserver
     onrestart restart media
     onrestart restart netd
     onrestart restart wificond
     writepid /dev/cpuset/foreground/tasks

注:在init.rc中是按照section来解析每一段数据的,每一段section的起始位置是symbol标识,
结束位置是下一个section开始的起始标示。在init.rc中,symbol一共有两个,分别是on和service。

Init.zygote32.rc 中,定义了一个 zygote 服务: zygote。由关键字 service 告诉 init 进程,创建一个名为 zygote的进程,这个进程要执行的程序是 /system/bin/app_process ,给这个进程四个参数分别是

    -Xzygote
    /system/bin
    --zygote
    --start-system-server

zygote 是由 init 进程解析 init.rc 文件启动的,启动的过程传入了这四个参数。
需要注意一下, zygote 最初的名字是 app_process ,他对应的源代码是在 App_main.cpp 中。由此我们
可以从 main 函数分析。

App_main.cpp

文件路径: framework/base/cmds/app_process/App_main.cpp

int main(int argc, char* const argv[])
{
   
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    // Process command line arguments
    // ignore argv[0]
    argc--;
    argv++;
    
    ... /* 省略部分代码 */

    // Parse runtime arguments.  Stop at first unrecognized option.
    bool zygote = false;

    ... /* 省略部分代码 */

    if (strcmp(arg, "--zygote") == 0) {
   
        zygote = true;
        niceName = ZYGOTE_NICE_NAME;
    } 

	... /* 省略部分代码 */
	
    if (zygote) {
   
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } 
    ... /* 省略部分代码 */
}

因为仅仅是为了分析 camera jni 的加载流程,所以这里省略了很多其他的代码,仅仅关注于 runtime.start 函数的调用。
从上述代码中,我们可以了解到,当传入的参数带有 "--zygote" 这个字符串时,才会调用到 runtime.start 方法。runtimeapptime 类型的对象,而 apptime 继承了 AndroidRuntime 中的 start 方法。

AndroidRuntime.cpp

文件路径: ./framework/base/core/jni

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
   
	/*******************************************************************************
	 * 实际运行中打印的log:
	 * AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<< 
	*******************************************************************************/
    ALOGD(">>>>>> START %s uid %d <<<<<<\n",
            className 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值