android启动之子系统切换

转载请注明文章出处和作者!

出处:http://blog.csdn.net/xl19862005

大家多多支持偶家媳妇的网店:http://wen1991.taobao.com

作者:大熊(Xandy)

1、总述

在android系统中有好几个子系统(recovery、factory及power off charge),那么这些子系统是如何与主系统之间进行切换的呢?

(recovery系统的切换与启动已经在另一篇博客里写过了

http://blog.csdn.net/xl19862005/article/details/8517918

今天理了一下factory这个子系统启动过程,现在将其记录如下

由于目前所用的平台方案是MTK的6572,代码路径等会和其它的方案不一样

先来看一个图:

进入factory子系统与recovery系统不同的是:

factory:是在init这个进程中激活并启动的

recovery:则是通过bootcmdline跳转到相应的地址上启动的

2、lk(uboot)检测factory mult key

在mediatek/platform/mt6572/lk/factory.c这个文件中有如下代码

BOOL factory_check_key_trigger(void)
{
	//wait
	ulong begin = get_timer(0);
	printf("\n%s Check factory boot\n",MODULE_NAME);
	printf("%s Wait 50ms for special keys\n",MODULE_NAME);

	/* If the boot reason is RESET, than we will NOT enter factory mode. */
	if(mtk_detect_pmic_just_rst())
	{
	  return false;
	}

    while(get_timer(begin)<50)
    {
		if(mtk_detect_key(MT65XX_FACTORY_KEY))
		{
			printf("%s Detect key\n",MODULE_NAME);
			printf("%s Enable factory mode\n",MODULE_NAME);
			g_boot_mode = FACTORY_BOOT;
			//video_printf("%s : detect factory mode !\n",MODULE_NAME);
			return TRUE;
		}
	}
	return FALSE;
}

当检测到factory key按下时会在这里设置

g_boot_mode = FACTORY_BOOT;

g_boot_mode是一个typedef类型的全局变量

类型定义如下:

typedef enum
{
    NORMAL_BOOT = 0,
    META_BOOT = 1,
    RECOVERY_BOOT = 2,
    SW_REBOOT = 3,
  FACTORY_BOOT = 4,
    ADVMETA_BOOT = 5,
    ATE_FACTORY_BOOT = 6,
    ALARM_BOOT = 7,
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
    KERNEL_POWER_OFF_CHARGING_BOOT = 8,
    LOW_POWER_OFF_CHARGING_BOOT = 9,
#endif
    FASTBOOT = 99,
    DOWNLOAD_BOOT = 100,
    UNKNOWN_BOOT
} BOOTMODE;

可以看出这里定义的FACTORY_BOOT模式的值为4!

3、kernel中启动init进程

lk(uboot)引导内核之后,我们来看看在kernel/init/main.c中这个文件中的kernel_init这个函数,这是一个线程回调函数,

在同文件中的rest_init函数中

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

注册到线程中去并得到执行

在kernel_init中有如下代码:

    if (!ramdisk_execute_command)
       ramdisk_execute_command = "/init";

    if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
        ramdisk_execute_command = NULL;
        prepare_namespace();
    }

可以看出这里将/init这个根目录中的bin文件路径传递给了ramdisk_execute_command这个全局的字符指针,另外根目录中的init bin文件是

打包到ramdisk.img中的(请查看android源码编译后相应的root目录下的文件)

再来看看init_post这个函数中的如下代码:

    if (ramdisk_execute_command) {
        run_init_process(ramdisk_execute_command);
        printk(KERN_WARNING "Failed to execute %s\n",
                ramdisk_execute_command);
    }

在这里内核就引导进入到用户空间的程序了

另外在mediatek/platform/mt6572/kernel/core/mt_boot.c这个文件中有如下代码:

    /* create proc entry at /proc/boot_mode */
create_proc_read_entry(boot_mode, S_IRUGO, NULL, boot_mode_proc, NULL);

在这里创建了一个名为“boot_mode”的属性,用于内核和用户空间的init程序传递参数!

4、init进程

system/core/init/init.c

这是生成根目录中init bin的源码

在这个文件的main函数中对系统启动所需的各种资源进行了准备和初始化……

这里有如下代码:

static int is_factory_boot(void)
{
    int fd;
    size_t s;
    char boot_mode;

    fd = open("/sys/class/BOOT/BOOT/boot/boot_mode", O_RDWR);
    if (fd < 0) {
        printf("fail to open: %s\n", "/sys/class/BOOT/BOOT/boot/boot_mode");
        return 0;
    }
    s = read(fd, (void *)&boot_mode, sizeof(boot_mode));

    close(fd);

    if(s <= 0){
	ERROR("could not read boot mode sys file\n");
    return 0;
    }
    // Factory Mode, '4'
    // ATE Factory Mode, '6'
    if ((boot_mode != '4') && (boot_mode != '6')){
	ERROR("Unsupported factory mode\n");
        return 0;
    }

    printf("Factory Mode Booting.....\n");

    return 1;
}

"/sys/class/BOOT/BOOT/boot/boot_mode"这个路径的属性文件是在内核中的mt_boot.c这个文件中创建的,在init中读取这个文件的属性从而获得系统启动状态

可以看出当boot_mode被设置成“4”时(对应前面提到的FACTORY_BOOT = 4)就会进入到factory子系统了

    if (is_factory_boot())
    {
        ERROR("This is factory boot");
        property_set("sys.mtk.no.factoryimage","1");
        init_parse_config_file("/factory_init.rc");
            INFO("reading project config file\n");
        init_parse_config_file("/factory_init.project.rc");
    }

在这里加载factory_init.rc用于启动factory下所需的一些服务或工具。

另外关机充电功能的实现也是按照这种架构实现的!

android启动之子系统切换,布布扣,bubuko.com

时间: 2024-12-11 09:58:25

android启动之子系统切换的相关文章

Android应用内语言切换实现

自定义控件系列结束了,打个回马枪,补上前段时间埋下的一个坑---"应用内语言切换".APP语言改变是一个Configuration,但是这个Configuration和android手机屏幕旋转有点不大一样.屏幕旋转的时候,会destroy当前页面,并进行重新绘制.而切换语言后不会重新绘制页面,所以这种情况的出现造成了网上的一知半解小伙伴们哀声一片,不是在咒骂api的坑爹,就是在卖力的另辟蹊径想尽办法解决问题.思路都是很好的,目的也是坚决的,可是方向是错误的,把哥哥我也给带进了坑了,爬

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

解决android 启动白屏问题

Android 启动APP时黑屏白屏的三个解决方案 http://www.cnblogs.com/liqw/p/4263418.html android:windowSoftInputMode属性使用 http://www.blogjava.net/zhip/archive/2011/02/14/344258.html

Android的Activity屏幕切换动画(一)-左右滑动切换

这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity增加了一个方法: public void overridePendingTransition (int enterAnim, int exitAnim) 其中: enterAnim 定义A

android启动之SystemServer启动

SystemServer是Android系统的核心,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms).ActivityManagerSystemService(AmS). PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中. startSystemServer systemServer是通过zygote启动的时候fork启动的,我们先看回到ZygoteIni

android启动之init启动

整个Android系统的启动分为Linux kernel的启动和Android系统的启动.Linux kernel启动起来后,然后就运行第一个用户程序,在Android中,就是init程序,上一博文已经介绍. Init进程始终是第一个进程.Init进程的对应的代码的main函数在目录system/core/init/init.c,先来总体看一下这个main函数. main函数 int main(int argc, char **argv) { //首先声明一些局部变量 int fd_count

android启动时报错Unable to instantiate application xxxx:java.lang.NullPointerException

如果程序已经运行,再安装到手机的时候总是报以下错误.而且是在打开特定的Activity的情况下才会报错. 06-26 09:45:16.971: E/AndroidRuntime(29733): java.lang.RuntimeException: Unable to instantiate application com.css.promotiontool.ui.CSSAppliction: java.lang.NullPointerException06-26 09:45:16.971:

Android Configuration横竖屏切换时Activity生命周期调用

问题:横竖屏切换时Activity的生命周期? 测试环境:华为mate7 package com.virglass.beyond.activity; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import com.virglass.beyond.utils.LogUtil; /** * 系统设置更改 * @author Administrator

Delphi XE5 for Android 启动无黑屏等待总结

Delphi XE5 for Android 启动无黑屏等待总结  从embarcadero官方技术论坛找了下参考资料,对黑屏处理应该来说有了相应的办法,并且这种办法具有很好的应用价值,因此做了个总结,Delphi XE5 无黑屏从本质上讲是使用Android 原生开发语言java ,编写的程序启动时首先加载java编写的SplashScreen的activity,然后在splashScreenActivity中启动delphi FireMonkey中的com.embarcadero.firem