android關機充電

來源:互聯網
上載者:User

1、關機充電其實是進入adb shell很快的方式!

 

2、手機關機時候插入USB,手機將進入關機充電模式,那麼這個模式究竟是怎麼進行的,這裡分析如下!

 (1)uboot:這裡代碼大概瀏覽了一下:u-boot\arch\arm\lib\board.c下的函數board_init_r中倒數最後幾行:do_cboot(NULL, 0, 1, NULL);選擇啟動模式

                         else if(charger_connected()){         DBG("%s: charger connected\n", __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'!\n");
            PRINT("##: Don't start 'zygote'!\n");
            PRINT("##: Don't start 'zygote'!\n");
            PRINT("##: Don't start 'zygote'!\n");
            return;
        }
        else {
            PRINT("####: Start [zygote] services normally.\n");
        }
    }

execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);//是否是執行/root/bin/charge二進位執行檔案???

就此就不斷迴圈判斷是否在充電模式!!!

         

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.