zoukankan      html  css  js  c++  java
  • android关机充电

    1、关机充电其实是进入adb shell很快的方式!

    2、手机关机时候插入USB,手机将进入关机充电模式,那么这个模式究竟是怎么进行的,这里分析如下!

     (1)uboot:这里代码大概浏览了一下:u-bootarcharmliboard.c下的函数board_init_r中倒数最后几行:do_cboot(NULL, 0, 1, NULL);选择启动模式

                             else if(charger_connected()){         DBG("%s: charger connected ", __FUNCTION__);         charge_mode();

               这里就进入了charge模式:vlx_nand_boot(BOOT_PART, "androidboot.mode=charge", BACKLIGHT_ON);

             "androidboot.mode=charge",这个很重要,将会传递到内核中!!!!!!!!1

             kernel:内核启动之类的。

            system/core/init/init.c:内核启动完毕后将运行此程序,具体分析有前人分析过了!

           这里主要是关注这里几点:

            a、init_parse_config_file("/init.rc");涉及到了charge模式,提供的是一个服务

              service charge /bin/charge
              user root
             oneshot

             也就是进入charge.c文件

           b、import_kernel_cmdline(0);获取从内核的一些参数,我获得参数如下:

               / # cat /proc/cmdline
    initrd=0x4c00000,0xf9dfe lpj=3350528 mtdparts=sprd-nand:256k(spl),512k(2ndbl),256k(params),512k(vmjaluna),10m(modem),3840k(fixnv),3840k(backupfixnv),5120k(dsp),3840k(runtimenv),10m(boot),10m(recovery),200m(system),190m(userdata),60m(cache),256k(misc),1m(boot_logo),1m(fastboot_logo),3840k(productinfo),512k(kpanic) androidboot.mode=charge video=sprdfb:fb0_id=0x9486,fb1_id=0x0 factory ram=256M nandflash=nandid(0xad,0xbc,0x90,0x55,0x56),pagesize(2048),oobsize(64),eccsize(512),eccbit(4)  show-guest-banks=0x4 no_console_suspend console=ttyNK viomem=* linux-timer=virtual root=/dev/ram0 rw init=/init 
             可以看到uboot中传来的参数androidboot.mode=charge!!!!!!!

           c、import_kernel_cmdline函数内部中调用import_kernel_nv:else if (!strcmp(name,"androidboot.mode")) {
                strlcpy(bootmode, value, sizeof(bootmode));

                这里bootmode=charge

          d、进入for循环模式

               1、 execute_one_command();--》do_class_start(1, args);do_class_start()中调用service_start_if_not_disabled(), 再调用service_start(),用fork() + execve()来创建子进程并执行service指定的可执行文件来终于启动了service。这个过程会根据一些service的属性,例如SVC_DISABLED等来决定是否进行启动service

               2、restart_processes();!!这个很重要的!调用了restart_service_if_needed--》 service_start(svc, NULL);

                    if(strcmp(svc->name,"zygote")==0) {
            if ((calibration[0]) ||
                        (fastsleep_enable) ||
                        (!strncmp(bootmode, "charge", 6))) { //!!!!!!!!!!!!!!此处看到了我们cmdline中传入的模式,是charge模式,因此不启动zygote,是进入charge模式!!
                PRINT("##: Don't start 'zygote'! ");
                PRINT("##: Don't start 'zygote'! ");
                PRINT("##: Don't start 'zygote'! ");
                PRINT("##: Don't start 'zygote'! ");
                return;
            }
            else {
                PRINT("####: Start [zygote] services normally. ");
            }
        }

    execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);//是否是执行/root/bin/charge二进制执行文件???

    就此就不断循环判断是否在充电模式!!!

             

  • 相关阅读:
    frame.origin.x 的意思和作用?
    8小时外的时间决定你的身价
    iOS开发学习路径的一些建议
    2015互联网校招总结—一路走来
    Struts2返回JSON对象的方法总结
    JavaScript HTML DOM 事件
    vc6
    运行html,css,js好的软件
    php编译器
    EasyBCD 可以修改系统引导的软件
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3249219.html
Copyright © 2011-2022 走看看