Android系统启动升级流程

Android系统启动升级流程
Android系统启动升级流程

A n d r o i d系统启动升级

流程

TTA standardization office【TTA 5AB- TTAK 08- TTA 2C】

摘要

本文首先介绍了Android系统更新要用到的一些概念:硬件、三种模式及相互之间的通信。然后介绍了Android系统的启动和升级流程。

概述

通常,Android系统的升级包名称为update.zip。Android系统内部自带了烧写升级包的工具,我们可以手动烧写,也可以通过某些机制自动更新系统。同时,我们可以手动修改和制作升级包。本文主要阐述在Android系统升级中用到的一些概念,本文只是作为索引,并不涉及到具体的烧写工作。本文基于Android系统的版本:4.0.4。

硬件

Android系统的烧写,是非常贴近硬件的。一是,烧写是在实实在在的硬件上操作的。二则,有时在翻阅源码的时候,需要知道硬件的类型,以便找到和硬件相对应的源码。

烧写相关的硬件主要有三部分:CPU、内存和nand flash。当然,只是相对本文而言。CPU用来执行程序中的指令。内存只是在运行中,将需要运行的程序加载其中并运行,关机后即消失。nandflash用来存储程序的数据,它会一直存在。系统启动时,会将nand flash上的操作系统加载到内存,然后运行在CPU 中,对于非系统程序,按需加载到内存中运行。了解这些,有助于了解整个烧写的过程。

在板子上,可以通过下面的命令,查看CPU的信息:

[plain]

cat /proc/cpuinfo

通过如下命令查看内存的信息:

[plain]

cat /proc/meminfo

nand flash是需要分区的,每个分区中对应了Android系统烧写包中不同的image,比如:boot、system分区等。可以通过如下命令来查看nand flash 的分区情况:

[plain]

cat /proc/mtd # 查看分区状况

通常,nand flash包含了以下分区:

开机动画:用于在开机或者升级过程中显示在屏幕上的内容。

boot:用于Android系统的正常启动

recovery:用于Android系统进入recovery模式下,参见本文后续介绍。

misc:用于保存BCB的内容,参见本文后续介绍。

system:对应于Android系统的正常模式下的/system目录。

cache:用于不同模式之间的通信,参见本文后续介绍。

user-data:用于Android应用数据的存放。

nand flash上的分区可以按需要增减,这取决于不同的Android系统配置。不过它有可能在Android不同的模块中都有定义。同时,这些分区的可能在Android不同的模块中都有配置,比如:内核、bootloader。

通过下面的命令查看nand flash的总大小:

[plain]

dmesg | grep NAND

三种模式

烧写的过程中,需要在三种模式下互相切换。确切的说,应该是三个操作环境:bootloader、recovery和main system。

bootloader主要用来屏蔽硬件的差异,类似于PC中的BIOS,它的功能相对比较简单,内部提供了一些命令,比如:可以将nand flash分区加载到内存、运行内存中的程序、操作SD卡等。Android中的booloader是uboot,位于源码的uboot目录下。

main system就是正常运行的Android操作系统,而recovery则是一个mini的Android系统,顾名思义,就是用来进行系统恢复相关的操作的,它的运行规则和main system一样,只是,它在启动时只加载recovery服务,此服务用于烧写Android系统。

三者之间的关系如下图所示:

系统先启动到bootloader模式下,然后根据情况,启动到recovery或者main system模式下。

bootloader

板子启动时,在Putty控制台中按回车,可以进入uboot,输入help可以查看其可用的命令。uboot的命令是可以自定义的,需要在uboot源码中进行设置。uboot下可以使用fastboot命令,进入fastboot模式下,可以使用PC与之连接(此时,使用fastboot协议通信),进行Android系统的烧写工作。

在uboot中,你可以更新uboot在内的所有系统模块。

recovery

recovery系统包含了内核和类似于根文件系统两部分,启动时仍采用

init进程和init.rc配置脚本,不同的是init.rc脚本比较简单,system目录中只存放了一些必备的工具。

recovery系统下,你能更新除uboot之外的所有Android系统模块。

recovery模式下,只有一个recovery服务,该服务对应于recovery进程,源码位置:bootable\recovery。

main system

main system是正常运行的Android系统。

通信

Android板子每个时刻只可以处于bootloader、recovery、main system 其中的一个模式中,烧写过程中,三个模式之间需要通信,比如:main system通知recovery烧写那个升级包。大致有三种方式可以用来通信:BCB、寄存器和cache分区。

BCB

BCB (bootloader control block)可以用于main system传递数据给bootloader和recovery模式。BCB的内容存在于nand flash的一个独立的分区,可以在nand flash分区表中看到,分区的名称为misc。

通过BCB,main system可以通知bootloader启动到recovery模式下,同时也可以传递命令给recovery,比如烧写哪个文件。

recovery在烧写的过程中,会设置BCB,以确保烧写成功前,一直会开机启动到recovery模式下,这样可以防止烧写过程中断电的情况。

寄存器

main system模式下,运行如下命令会重启,并进入recovery模式:(也可调用android_reboot函数)

[plain]

reboot recovery

reboot命令实际上是系统调用,最终会调用到内核的kernel_restart函数,该函数最终会设置某个寄存器的位置,然后执行重启操作。

重启后,bootloader会检测到该寄存器的值,并根据其值,启动到recovery模式下。

cache分区

recovery和main system模式下,都会将nand flash的cache分区挂载到cache目录从而实现这两种模式下的通信。比如:main system模式下,下载升级包update.zip,并将其路径设置到文件/cache/recovery/command中,然后重启到recovery模式下,recovery进程会读取到文件/cache/recovery/command中的值,并执行系统升级工作。

升级包

通常升级包的名称为update.zip,它包含了要升级的内容和升级脚本,也就是说,整个升级的过程都由升级包本省控制。

升级脚本解析对应的源码:META-INF\com\google\android\updater-script。可用的命令列表可以参见bootable\recovery\updater\install.c的函数RegisterInstallFunctions()。

解析升级脚本采用语言Edify,源码位置:bootable\recovery\updater 和bootable\recovery\edify。

若想自己制作update.zip包,需要使用的以下三个文件:

out/host/linux-x86/framework/signapk.jar

build/target/product/security/testkey.pk8

build/target/product/security/testkey.x509.pem

制作的过程:

解压从源码中编译出来的update.zip。

修改解压后的文件。

重新压成包update.zip

使用命令处理update.zip,该命令主要是最zip执行签名操作:java -Xmx1024m -jar signapk.jar -w testkey.x509.pem testkey.pk8 update.zip update_unsigned.zip

update_unsigned.zip就是最终的升级包。

启动流程

启动流程大致如下:

1.开机后,启动到bootloader下,bootloader会作一些初始化的操作,然后会从三个地方确定后面的动作:

查找SD卡上指定的文件:此种情况,主要用于,通过SD卡,升级系统。只要在SD卡中按照规则放置升级文件和相关的脚本,即可实现系统的升级。

查找按键的状态:此种情况主要用于开机后进入bootloader或者recovery模式,按键也通常是硬件上的几个键按下的状态。

获取BCB的内容:需要根据BCB的内容,来执行具体的操作,通常是进入recovery模式。

若没有发现上述的三种信息,则会按照正常的启动流程,进入main system模式。

2.若需要通过SD卡升级,则会显示升级提示界面,并开始系统升级,完成后,重启进入main system。

3.若需要进入recovery模式,在bootloader模式下,会加载recovery 分区到内存,然后进入recovery模式下。

recovery会启动recovery进程,该进程会读取/cache/recovery分区中的内容,决定具体的操作。若没有相关的配置,则进入控制台模式。

4.若需要进入main system模式,则会加载boot分区中的内容,然后进入正常的启动流程。

升级流程

升级的流程大致如下:

1.main system模式下,下载update.zip到/cache目录。

2.设置/cache/recovery/command目录的内容为:--

update_package=/cache/update.zip。

3.调用函数android_reboot,并设置进入recovery模式的代码。

4.系统重启,进入recovery模式,并启动recovery进程,该进程会检测/cache/recovery/command的内容,然后升级update.zip。

android系统开机启动流程分析

一,系统引导bootloader 加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。还有ramdisk】 二,内核kernel bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。 内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space) 内核zImage解压缩 head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系 统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init 会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。 三,Init进程启动 【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】 init进程启动后,根据init.rc 和init. .rc脚本文件建立几个基本 服务(servicemanager zygote),然后担当property service 的功能 打开.rc文件,解析文件内容。【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。 建立service进程。【service_start(…) execve(…)】 在init.c中,完成以下工作 1、初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个 文件解析步骤2时执行“early-init”行动】 2、初始化设备【在/dev下创建所有设备节点,下载firmwares】 3、初始化属性服务器【在两个文件解析步骤2时执行“init”行动】

Android布局属性大全

Android布局属性大全 布局: AbsoluteLayout(绝对布局): xmlns:android="https://www.360docs.net/doc/4110272269.html,/apk/res/android" style="@..." android:clipChildren="true|false" android:clipToPadding="true|false" android:layoutAnimation="@---" android:animationCache="true|false" android:persistentDrawingCache="none|animation|scrolling|all":持续高速缓存绘图 android:alwaysDrawnWithCache="true|false" android:andStatesFromChildre="true|false" android:descendantFocusability="beforeDescendants|afterDescendants|bl ocksDescendants":后裔可聚焦 android:id="@+id/absoluteLayout" android:tag="@---" android:android:scrollX="---" android:android:scrollY="---" android:background="@---" android:padding="----" android:paddingLeft="----" android:paddingTop="----" android:paddingRight="----" android:paddingBotton="---" android:focusable="true|false" android:focusableInTouchMode="true|false" android:visibility="visible|invisible|gone" android:fitsSystemWindows="true|false":适合系统窗口 android:scrollbars="none|horizontal|vertical" android:scrollbarStyle="insideOverlay(内覆盖)|insideInset(内插 图)|outsideOverlay(外覆盖)|outsideInset(外插图)" android:isScrollContainer="true|false":是一个滚动集合 android:fadeScrollbars="true|false":褪色的滚动条 android:scrollbarFadeDuration="---":卷轴淡出 android:scrollDefaultDelayBeforeFade="---":滚动前默认延迟 android:scrollbarSize="---" android:scrollbarThumbHorizontal="@----":拇指水平滚动条 android:scrollbarThumbVertical="@----":拇指垂直滚动条 android:scrollbarTrackVertical="@---":垂直滚动条轨道 android:scrollbarTrackHorizontal="@---":水平滚动条轨道 android:scrollbarAlwaysDrawHorizontalTrack="true|false":水平滚动条总是吸引轨道

Android 开机启动流程

Android的开机流程 1. 系统引导bootloader 1) 源码:bootable/bootloader/* 2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写 c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况) 2. 内核kernel 1) 源码:kernel/* 2) 说明:kernel由bootloader加载 3. 文件系统及应用init 1) 源码:system/core/init/* 2) 配置文件:system/rootdir/init.rc, 3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1)源码:frameworks/base/cmds/app_main.cpp等 2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process a)建立Java Runtime,建立虚拟机 b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序 c) 启动System Server 5. 系统服务system server 1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a 2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等) 6. 桌面launcher 1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher 7. 解锁 1) 源码: frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置

Android之TextView属性大全

Android之TextView属性大全 发现TextView有一个比较大的问题,就是文字排版的问题,遇到数字,字母,符号等就会有问题,目前还没有什么解决方法。 android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。 android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符, 也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式. android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。 android:cursorVisible设定光标为显示/隐藏,默认显示。 android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()” android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。 android:drawableLeft在text的左边输出一个drawable 。 android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。 android:drawableRight在text的右边输出一个drawable。

分析Android 开机启动慢的原因

开机启动花了40多秒,正常开机只需要28秒就能开机起来。 内核的启动我没有去分析,另一个同事分析的。我主要是分析从SystemServer启来到开机动画结束显示解锁界面的这段时间,也就是开机动画的第三个动画开始到结束这段时间,这是个比较耗时阶段,一般都在17秒左右(见过牛B的手机,只需5秒)。 SystemServer分两步执行:init1和init2。init1主要是初始化native的服务,代码在sy stem_init.cpp的system_init,初始化了SurfaceFlinger和SensorService这两个native的服务。init2启动的是java的服务,比如ActivityManagerService、WindowManagerService、PackageManagerService等,在这个过程中PackageManagerService用的时间最长,因为PackageManagerService会去扫描特定目录下的jar包和apk文件。 在开机时间需要40多秒的时,从Log上可以看到,从SurfaceFlinger初始化到动画结束,要27秒左右的时间,即从SurfaceFlinger::init的LOGI("SurfaceFlinger is starting")这句Log到void SurfaceFlinger::bootFinished()的LOGI("Boot is finished (%ld ms)", long(ns 2ms(duration)) ),需要27秒左右的时间,这显然是太长了,但到底是慢在哪了呢?应该在个中间的点,二分一下,于是想到了以启动服务前后作为分隔:是服务启动慢了,还是在服务启动后的这段时间慢?以ActivityManagerService的Slog.i(TAG, "System now ready")的这句Log为分割点,对比了一下,在从SurfaceFlinger is starting到System now read y多了7秒左右的时间,这说明SystemServer在init1和init2过程中启动慢了,通过排查,发现在init1启动的时候,花了7秒多的时间,也就是system_init的LOGI("Entered system _init()")到LOGI("System server: starting Android runtime.\n")这段时间用了7秒多,而正常情况是400毫秒便可以初始化完,通过添加Log看到,在SensorService启动时,用了比较长的时间。 不断的添加Log发现,在启动SensorService时候,关闭设备文件变慢了,每次关闭一个/dev/input/下的设备文件需要100ms左右,而SensorService有60~70次的关闭文件,大概有7s左右的时间。 调用流程是: frameworks/base/cmds/system_server/library/system_init.cpp: system_init->SensorServi ce::instantiate frameworks/native/services/sensorservice/SensorService.cpp: void SensorService::onFi rstRef()->SensorDevice& dev(SensorDevice::getInstance()) hardware/libsensors/SensorDevice.cpp: SensorDevice::SensorDevice()->sensors_open hardware/libsensors/sensors.cpp: open_sensors->sensors_poll_context_t sensors_poll_context_t执行打开每个传感器设备时,遍历/dev/input/目录下的设备文件,以匹配当前需要打开的设备,遍历文件是在 hardware/libsensors/SensorBase.cpp的openInput下实现,如果打开的设备文件不是正在打开的设备文件,会执行下面语句的else部分: if (!strcmp(name, inputName)) { strcpy(input_name, filename); break;

基于MT6752的 android 系统启动流程分析报告

基于MT6752的Android系统启动流程分析报告 1、Bootloader引导 (2) 2、Linux内核启动 (23) 3、Android系统启动 (23) 报告人: 日期:2016.09.03

对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。但根据芯片架构和平台的不同,在启动的Bootloader阶段会有所差异。 本文以MTK的MT6752平台为例,分析一下基于该平台的Android系统启动流程。 1、Bootloader引导 1.1、Bootloader基本介绍 BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备,目的就是引导linux操作系统及Android框架(framework)。 它的主要功能包括设置处理器和内存的频率、调试信息端口、可引导的存储设备等等。在可执行环境创建好之后,接下来把software装载到内存并执行。除了装载software,一个外部工具也能和bootloader握手(handshake),可指示设备进入不同的操作模式,比如USB下载模式和META模式。就算没有外部工具的握手,通过外部任何组合或是客户自定义按键,bootloader也能够进入这些模式。 由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。 下面是几个arm平台的bootloader方案: marvell(pxa935) : bootROM + OBM + BLOB informax(im9815) : bootROM + barbox + U-boot mediatek(mt6517) : bootROM + pre-loader + U-boot broadcom(bcm2157) : bootROM + boot1/boot2 + U-boot 而对MT6752平台,MTK对bootloader引导方案又进行了调整,它将bootloader分为以下两个部分: (1) 第1部分bootloader,是MTK内部(in-house)的pre-loader,这部分依赖平台。 (2) 第2部分bootloader,是LK(little kernel的缩写,作用同常见的u-boot差不多),这部分依赖操作系统,负责引导linux操作系统和Android框架。 1.2、bootloader的工作流程 1.2.1 bootloader正常的启动流程 先来看启动流程图:

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Android应用开发基础习题集

任务一 Android开发环境的搭建 第一部分知识回顾与思考 1.Android的四层架构分别包括哪几层分别起到什么作用 答:Linux内核层(Linux Kernel):基于Linux内核,内核为上层系统提供了系统服务。 系统库层(Libraries):系统库基于C/C++语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework):为开发者提供了一系列的Java API,包括图形用户界面组件View、SQLite数据库相关的API、Service组件等。 应用程序层(Applications):包含了Android平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android四层架构中,应用框架层使用的是什么语法( C ) A.C B.C++ C.Java D.Android 2.Android四层架构中,系统库层使用的是什么语法( B ) A.VB B.C /C++ C.Java D.Android 3.应用程序员编写的Android应用程序,主要是调用( B )提供的接口进行实现。 A.应用程序层 B.应用框架层 C.应用视图层 D.系统库层 二、填空题(请在括号内填空) 1.在Android智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android的(应用程序)层。 2.为了让程序员更加方便的运行调试程序,Android提供了(模拟器),可以方便的将程序运行其上,而不要实际的移动终端。 3.为了支持Java程序运行,我们需要安装(JDK)。 三、简答题 1.简述Android开发环境安装的步骤。 答:下载并安装JDK,配置JDK的环境变量; 从Anroid官网上下载Android开发组件(包含Eclipse和Android SDK、ADT); 安装Android开发环境(包括配置Android SDK的环境变量、打开Eclipse通过菜单设定Android SDK 路径)。 2.简述Android应用程序创建和运行的步骤。 答:通过菜单创建Android应用程序,设置应用程序名、Android版本等基本信息。

Android开机启动流程样本

Android的开机流程 1. 系统引导bootloader 1) 源码: bootable/bootloader/* 2) 说明: 加电后, CPU将先执行bootloader程序, 此处有三种选择 a) 开机按Camera+Power启动到fastboot, 即命令或SD卡烧写模式, 不加载内核及文件系统, 此处能够进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式, 加载recovery.img, recovery.img包含内核, 基本的文件系统, 用于工程模式的烧写 c) 开机按Power, 正常启动系统, 加载boot.img, boot.img包含内核, 基本文件系统, 用于正常启动手机( 以下只分析正常启动的情况) 2. 内核kernel 1) 源码: kernel/* 2) 说明: kernel由bootloader加载 3. 文件系统及应用init 1) 源码: system/core/init/* 2) 配置文件: system/rootdir/init.rc, 3) 说明: init是一个由内核启动的用户级进程, 它按照init.rc中的设置执行: 启动服务( 这里的服务指linux底层服务, 如adbd提供adb支持, vold提供SD卡挂载等) , 执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1) 源码: frameworks/base/cmds/app_main.cpp等 2) 说明: zygote是一个在init.rc中被指定启动的服务, 该服务对应的命令是/system/bin/app_process

Android开发-UI属性

android:fadingEdgeLength 设置淡入淡出边缘的长度,可以接受大小值的单位是:px、dp、sp、in、mm,也可以参考大小值资源 android:fitsSystemWindows 是否适合系统窗体,取值为true或false。该属性只对不是子组件的组件有效 android:focusable 是否可以获取焦点,取值true或false android:focusableInTouchMode 是否可以在触摸模式下获取焦点,true或false android:hapticFeedbackEnabled 是否允许触摸反馈效果,true或false android:id 提供该组件的标识名,可以借助Activity或View实例的findViewById方法通过id获取对应的组件实例对象,其属性值的形式为:android:id=”@+id/id” android:isScrollContainer 设置该组件是否设置为滚动条容器,true或false android:keepScreenOn 控制该组件在显示的时候保持在屏幕显示,true或false android:longClickable 是否响应长时间点击事件,true或false android:minHeight 组件的最小高度,取值同android:fadingEdgeLength android:minWidth 组件的最小宽度,取值同android:fadingEdgeLength android:nextFocusDown 设置下一个向下获取焦点的组件,取值为id android:nextFocusLeft 设置下一个向左获取焦点的组件,取值为id android:nextFocusRight 设置下一个向右获取焦点的组件,取值为id android:nextFocusUp 设置下一个向上获取焦点的组件,取值为id android:padding 设置上、下、左、右4个边缘的填充距离,必须是一个大小值,取值同android:fadingEdgeLength android:paddingBottom 设置下端边缘的填充距离,取值同android:padding android:paddingLeft 设置左端边缘的填充距离,取值同android:padding android:paddingRight 设置右端边缘的填充距离,取值同android:padding android:paddingTop 设置上端边缘的填充距离,取值同android:padding android:saveEnabled 是否允许保存状态,取值为true或false android:scrollX 设置垂直滚动条的位移量,必须是一个大小值,取值同android:padding android:scrollY 设置水平滚动条的位移量,必须是一个大小值,取值同android:padding android:scrollbarAlwaysDrawHorizontalTrack 是否总是设置水平滚动条滑块,true或false android:scrollbarAlwaysDrawVerticalTrack 是否总是设置垂直滚动条滑块,true或false android:scrollbarSize 设置垂直滚动条的宽度和水平滚动条的长度,必须是一个大小值,取值同android:padding android:scrollbarStyle 设置滚动条的样式,取值为下列之一:insideOverlay在填充区域内,覆盖形式insideInset在填充区域内,插进形式(凹进)outsideOverly在绑定组件边缘,覆盖形式outsideInset在绑定组件边缘,插进形似 android:scrollbarThumbHorizontal 设置水平滚动条按钮的绘制资源,必须引用可绘制资源 android:scrollbarThumbVertical 设置垂直滚动条按钮的绘制资源,必须引用可绘制资源

Android系统启动过程详解

Android系统启动过程详解 Android系统启动过程 首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。 启动的过程如下图所示:(图片来自网上,后面有地址)

下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结, 以下学习过程中代码片段中均有省略不完整,请参照源码。

一Init进程的启动 init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行, 并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。 启动过程就是代码init.c中main函数执行过程:system\core\init\init. c 在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听…… 下面看两个重要的过程:rc文件解析和服务启动。 1 rc文件解析 .rc文件是Android使用的初始化脚本文件(System/Core/Init/readm e.txt中有描述: four broad classes of statements which are Actions, Commands, Services, and Options.) 其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是linux 命令, 还有一些是android 添加的,如:class_start :启动服务,class_stop :关闭服务,等等。 其中Options是针对Service 的选项的。 系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。具体看一下启动脚本:\system\core\rootdir\init.rc 在解析rc脚本文件时,将相应的类型放入各自的List中: \system\core\init\Init_parser.c :init_parse_config_file( )存入到 action_queue、action_list、service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。 这其中包含了服务:adbd、servicemanager、vold、ril-daemon、deb uggerd、surfaceflinger、zygote、media…… 2 服务启动 文件解析完成之后将service放入到service_list中。 文件解析完成之后将service放入到service_list中。 \system\core\init\builtins.c

Android属性服务

Android属性服务 Windows平台上有有一个叫注册表的东西。注册表可以存储一些键值对。一般而言,系统或某些应用程序会把自己的一些属性存储在注册表中,即使系统重启或应用程序重启,它还能够根据之前在注册表中设置的属性,进行相应的初始化工作。Android平台也提供了一个类似的机制,称之为属性服务(property service)。应用程序可通过这个属性机制,查询或设置属性。 可以通过adb shell登陆到真机,使用getprop命令查看当前系统中有哪些属性。 如下是登陆到FTS920查看到的相关属性值: [localhost@/]# getprop getprop [ro.secure]: [0] [ro.allow.mock.location]: [1] [ro.debuggable]: [1] [persist.service.adb.enable]: [1] [ro.factorytest]: [0] [ro.serialno]: [] [ro.bootmode]: [unknown] [ro.baseband]: [unknown] [ro.carrier]: [unknown] [ro.bootloader]: [unknown] [ro.hardware]: [pxa910-based] [ro.revision]: [0] [ro.product.model]: [FTS920] [https://www.360docs.net/doc/4110272269.html,]: [FTS920] [ro.product.device]: [FTS920] [ro.product.board]: [FTS920] [dalvik.vm.heapsize]: [36m] [dalvik.vm.jniopts]: [warnonly] [ro.opengles.version]: [131072] …… 在init.c文件的main函数中,先后调用了3处跟属性服务相关的操作: 1. 2. 3.

Android SystemBar启动流程分析

Android SystemBar启动流程分析 SystemBars的服务被start时,最终会调用该类的onNoService()方法。 @Override public void start() { if (DEBUG) Log.d(TAG, "start"); ServiceMonitor mServiceMonitor = new ServiceMonitor(TAG, DEBUG, mContext, Settings.Secure.BAR_SERVICE_COMPONENT, this); mServiceMonitor.start(); // will call onNoService if no remote service is found } @Override public void onNoService() { if (DEBUG) Log.d(TAG, "onNoService"); createStatusBarFromConfig(); // fallback to using an in-process implementation } private void createStatusBarFromConfig() { … mStatusBar = (BaseStatusBar) cls.newInstance(); … mStatusBar.start(); } BaseStatusBar是一个抽象类,故调用其子类的PhoneStatusBar的start 函数。 @Override public void start() { … super.start(); … } 子类的start又调用了父类的start public void start() { … createAndAddWindows(); … }

AndroidL系统启动及加载流程分析

Android L系统启动及加载流程分析 1、概述 Android L的启动可以分为几个步骤:Linux内核启动、init进程启动、native系统服务及java系统服务启动、Home启动,主要过程如下图: 图1 整个启动流程跟4.4及之前的版本相差不多,只是有个别不同之处,本文我们主要分析Linux内核启动之后的过程。

2、启动过程分析 2.1 init进程启动 当系统内核加载完成之后,会启动init守护进程,它是内核启动的第一个用户级进程,是Android的一个进程,进程号为1,init进程启动后执行入口函数main(),主要操作为: 图2 AndroidL上将selinux的安全等级提高了,设为了enforcing模式,4.4上是permissive模式。 解析rc脚本文件,即init.rc脚本,该文件是Android初始化脚本,定义了一系列的动作和执行这些动作的时间阶段e aryl-init、init、early-boot、boot、post-fs等阶段。init进程main 函数中会根据这些阶段进行解析执行。AndroidL上为了流程更清晰,增加了charger(充电开机)、ffbm(工厂模式)、以及late-init阶段,实际上这些阶段是对其他阶段的组合执行,比如late-init:

2.2 ServiceManager的启动 servicemanager的启动就是init进程通过init.rc脚本启动的: 源码在frameworks/native/cmds/servicemanager/service_manager.c中,servicemanager是服务管理器,它本身也是一个服务(handle=0),通过binder调用,为native和Java系统服务提供注册和查询服务的,即某个服务启动后,需要将自己注册到servicemanager中,供其他服务或者应用查询使用。AndroidL上servicemanger中在处理注册和查询动作之前添加了selinux安全检测相关的处理。 2.3 SurfaceFinger、MediaServer进程启动 Android4.4以前,surfacefinger的启动根据属性system_init.startsurfaceflinger,决定是通过init.rc启动还是systemserver进程启动,之后的版本包括AndoridL都是通过init.rc启动的: 启动后会向servicemanager进程注册服务中,该服务启动时主要功能是初始化整个显

Android手机开发环境配置详细说明书(doc 10页)

一,配置前需要下载的文件 1,jdk 6:https://www.360docs.net/doc/4110272269.html,/javase/downloads/index.jsp 说明:原则上下载最新的。本阶段下载的是第一个:JDK 6 Update 16 with Java EE Eclipse 3.5(galileo):https://www.360docs.net/doc/4110272269.html,/downloads/数量间的联系。 说明:原则上下载最新的。本阶段下载的是第一个:Eclipse IDE for Java EE Developers (189 MB) Android SDK:https://www.360docs.net/doc/4110272269.html,/bbs/viewthread.php?tid=10147&highlight=sdk冲钻然 说明:只需安装SDK,ADT不用下。 二,软件安装 jdk 6的安装:下载下来后,解压缩,安装exe文件。按步骤进行。 Eclipse 3.5:解压缩后即可。假设解压缩路径为e盘根目录即:E:\eclipse Android SDK:解压缩即可。假设解压缩路径为e盘根目录即:E:\ android-sdk-windows-1.5_r2 三,环境变量 设置Android SDK环境变量:我的电脑右键->属性->高级->环境变量。在其中找到Path并进行编辑。在变量值最后增加如下代码 ; E:\ android-sdk-windows-1.5_r2\tools 说明:前面的”;”为英文状态下的”;”另外,E:\ android-sdk-windows-1.5_r2\tools不一定是你自己的tools路径。实际而言可能是这个路径E:\ android-sdk-windows-1.5_r2\ android-sdk-windows-1.5_r2\tools 四,安装Android Development Tools plug-in 1,打开Eclipse 3.5,选择Help->Install New Software 之后在work with的文本框输入https://https://www.360docs.net/doc/4110272269.html,/android/eclipse/并回车,会在其下显示出Developer Tools,全部选择后,next。

android开机启动流程简单分析

android开机启动流程简单分析 android启动 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下: int main(int argc, char** argv) { ..... //创建文件夹,挂载 // Get the basic filesystem setup we need put together in the initramdisk // on / and then we'll let the rc file figure out the rest. if (is_first_stage) { mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mount("devpts", "/dev/pts", "devpts", 0, NULL); #define MAKE_STR(x) __STRING(x) mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC)); mount("sysfs", "/sys", "sysfs", 0, NULL); } ..... //打印日志,设置log的级别 klog_init(); klog_set_level(KLOG_NOTICE_LEVEL); ..... Parser& parser = Parser::GetInstance(); parser.AddSectionParser("service",std::make_unique()); parser.AddSectionParser("on", std::make_unique()); parser.AddSectionParser("import", std::make_unique()); // 加载init.rc配置文件 parser.ParseConfig("/init.rc"); } 加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码: 从Android L开始,在/system/core/rootdir 目录中有4 个zygote 相关的启动脚本如下图:

相关文档
最新文档