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二进制执行文件???

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

android关机充电的更多相关文章

  1. 【转】android 电池(二):android关机充电流程、充电画面显示

    关键词:android 电池关机充电 androidboot.mode charger关机充电 充电画面显示 平台信息:内核:linux2.6/linux3.0系统:android/android4. ...

  2. android 电池(二):android关机充电流程、充电画面显示【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8498580 上一篇我们讲了锂电池的充放电的流程和电池的一些特性,这一节我们重点说一下a ...

  3. android 关机充电流程

    点击打开链接 0.主要流程 usb插入通过传递cmdline给init解析从而启动充电进程 1. LK lk\app\aboot\aboot.c update_cmdline ---------- i ...

  4. Android 电池关机充电

    android 电池(一):锂电池基本原理篇 android 电池(二):android关机充电流程.充电画面显示 android 电池(三):android电池系统 android电池(四):电池 ...

  5. Android 8.1 关机充电动画(一)模式选择

    system:Android 8.1 platform:RK3326/PX30 uboot kernel Android 8.1 关机充电动画(一)模式选择 Android 8.1 关机充电动画(二) ...

  6. Android 8.1 关机充电动画(三)Android模式

    system:Android 8.1 platform:RK3326/PX30 uboot kernel system/core/healthd Android 8.1 关机充电动画(一)模式选择 A ...

  7. Android 8.1 关机充电动画(二)Uboot模式

    system:Android 8.1 platform:RK3326/PX30 uboot kernel Android 8.1 关机充电动画(一)模式选择 Android 8.1 关机充电动画(二) ...

  8. Android MTK6580 客制化关机充电动画

    1.客制化关机充电图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/xxx 找到对应分辨率替换 2.调整显示图片位置.大小 ...

  9. android的充电图标显示

    最近RK3026的项目需要修改开机充电,才分析了Android原生态的充电过程. 充电的代码和图标在system/core/charger中,会编译成名字为charger的可执行文件,打包进ramdi ...

随机推荐

  1. gcc向待编译源文件传入参数的方法

    gcc有两种方法向待编译源文件传入参数 第一种 利用–Dmacro=name 编译选项,详见gcc -D选项 第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用 ...

  2. json序列化后日期如何变回来

    日期格式为 日期小于10的时候 占一位 比如 2019年9月1日 2015/9/1 function ChangeDateFormat(cellval) {           var date = ...

  3. Js处理数据——前端分页工具

    这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页--每次根据页码.页大小 ...

  4. block的是发送信号的线程,又不是处理槽函数的线程

    请问UI线程给子线程发信号,应该用哪种连接方式? 如果子线程正在执行一个函数,我发射信号去执行子线程的另一个函数,那么此时子线程到底会执行什么呢? 用信号量做的同步.第一把信号槽的事件丢到线程的事件队 ...

  5. Google 发布 Android 性能优化典范

    2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有 ...

  6. 自定义滚轮效果选择器spinnerwheel的使用总结

    项目中有使用到像IOS滚轮效果的选择时间或数字的组件:android-spinnerwheel github地址:https://github.com/ai212983/android-spinner ...

  7. Android Training精要(五)讀取Bitmap對象實際的尺寸和類型

    讀取Bitmap對象實際的尺寸和類型 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecode ...

  8. 远程仓库版本回退方法 good

    1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支 ...

  9. [LeetCode] 303. Range Sum Query - Immutable (Easy)

    303. Range Sum Query - Immutable class NumArray { private: vector<int> v; public: NumArray(vec ...

  10. 转载:MyEclipse中防止代码格式化时出现换行的情况的设置

     转载出处:http://www.cnblogs.com/yjhrem/articles/2310013.html 编辑完成代码,用MyEclipse的代码格式化后,本来不长的代码也被自动转成了多行. ...