搜档网
当前位置:搜档网 › android恢复出厂设置以及系统升级流程

android恢复出厂设置以及系统升级流程

android恢复出厂设置以及系统升级流程
android恢复出厂设置以及系统升级流程

android恢复出厂设置以及系统升级流程

android恢复出厂设置以及系统升级流程2011-12-06 17:14

6654人阅读

评论(3)

收藏

举报

androidcachethreadnulluisystem

https://www.sodocs.net/doc/6e10136349.html,/simple/?t5938.html

复制代码

=========================

====================恢复出厂设

置流程概括:一. 设置模块中进行恢复出厂设置操作,系统一共做了两件事:1. 往/cache/recovery/command 文件中写入命令字段:2. 重启系统二. 重启系统会必须进入recovery 模式进入recovery 模式的几种方式1. 通过读取

/cache 分区中文件/cache/recovery/command 内容进入2. 通过按键操作进入(G1 通过同时按HOME 和挂断键)

以上两种方式进入都需要blob的支持三. 所以恢复出厂设置,进入recovery 模式,必须做以下几件事情:1. blob 必须能从recovery 分区中装载内核和文件系统2. flash 必须有cache 分区和recovery 分区3. 必须编译提供recovery.img 烧录到recovery 分区recovery.img 解析:1. 理解recovery.img在制作recovery 镜像之前,我们必须理解什么是recovery 以及它有哪些内容,这里省略,文章:<<recovery.img与boot.img简单对比分析>> 对recovery 做了很好的解释,地址:

https://www.sodocs.net/doc/6e10136349.html,/bbs/thread-6391-1-1.html2. 制作recovery.img因为在文

件: ./vendor/marvell/littleton/BoardConfig.mk 中有:TARGET_NO_KERNEL := true导致我们目前在编译cupcake 的时候,默认没有生成recovery.img,要生成recovery.img 必须屏蔽TARGET_NO_KERNEL := true创建目录:vendor/marvell/littleton/recovery/res拷贝编译好的内核到目录:vendor/marvell/littletoncp

/tftpboot/zImage20100202 vendor/marvell/littleton/kernel 如果不创建res目录和拷贝内核将会出现以下错误:No private recovery resources for TARGET_DEVICE littletonmake: *** 没有规则可以创建

“out/target/product/littleton/kernel”需要的目标

“vendor/marvell/littleton/kernel”命令: make recoveryimage 单独生成recovery.imgout/host/linux-x86/bin/mkbootimg

--kernel out/target/product/littleton/kernel \\--ramdisk

out/target/product/littleton/ramdisk-recovery.img

\\--output out/target/product/littleton/recovery.img恢复出厂设置,内核相关部分:2009年12 月23 日falsh 分区情况0x00000000-0x00100000 : \"Bootloader\"

--1M0x00100000-0x00500000 : \"Kernel\"

--4M 0x4000000x00500000-0x06500000 : \"system\"

--96M 0x60000000x06500000-0x09500000 : \"userdata\" --48M 0x3000000 0x09500000-0x0f500000 : \"systembackup\" --96M

0x0f500000-0x0fd00000 : \"massstorage\"

--8M 0x0fd00000-0x0ff00000 : \"massstorage2\"

--2M 0x0ff00000-0x10000000 : \"massstorage3\"

--1M 在目前的内核中我们还没有使用cache 分区和recovery 分区,所以修改内核配置文件:

arch/arm/mach-pxa/include/mach/part_table.h把以下分区:0x09500000-0x0f500000 : \"systembackup\"

--96M 0x0f500000-0x0fd00000 : \"massstorage\"

--8M 改为:0x09500000-0x0f500000 : \"cache\"

--96M 0x0f500000-0x0fd00000 : \"recovery\"

--8M 让android 系统能正常挂载和使用cache recovery 分区。烧写编译好的recovery.img 到recovery 分区;烧写地址已经更新,具体参考文件:

http://192.168.2.148/smartphone/td0901/release/p_w_picp ath/readme.txt=====================================烧写cache 分区nanderase -z 0x09500000 0x6000000tftp

recovery.imgnandwrite -y 0x80800000 0x09500000

<cache.img actual length>烧写recovery 分区nanderase -z 0xf500000 0x800000tftp

recovery.imgnandwrite -y 0x80800000 0xf500000

<recovery.img actual length>====================================

==恢复模式流程分析完成了以上准备工作,当我们按特定的组合键或者恢复出厂设置,那么就会进入recovery 模式:从recovery 模式的init.rc 文件可以看出,它仅仅启动了几个服务service recovery /sbin/recoveryservice adbd

/sbin/adbd recovery以下是recovery 流程分析,主函数在文件:bootable/recovery/recovery.c int main(int argc, char **argv) ... ui_init(); //初始化ui get_args(&argc,

&argv); ...void ui_init(void){ gr_init();

ev_init(); ... pthread_create(&t, NULL,

progress_thread, NULL); pthread_create(&t, NULL, input_thread, NULL);}recovery 模式有简单的交互式界面,它是通过ui_init(),ev_init()等一些列操作,完成字符ui界面和按键事件等初始化。input_thread 线程里面处理按键事件。函数get_args 会读取/cache/recovery/command 文件,并根据命令字段进行相应操作,因为进行恢复出厂设置的时候/cache/recovery/command 的内容为

--wipe-data所以它会擦除data 和cache 分区:

erase_root(\"DATA:\")erase_root(\"CACHE:\")分区擦除后,系统重启,然后进入正常开机流程,重新使用system 分区的内容完成开机初始化,此过程跟我们第一次烧写软件过程一致。如果是按home 键和挂机键开机,那么进入字符选择界面,函数为:static void prompt_and_wait(){ char** headers = prepend_title(MENU_HEADERS); for (;;) { finish_recovery(NULL);

ui_reset_progress(); int chosen_item =

get_menu_selection(headers, MENU_ITEMS, 0);

// device-specific code may take some action here. It may // return one of the core actions handled in the switch

// statement below. chosen_item =

device_perform_action(chosen_item); switch (chosen_item) { case ITEM_REBOOT:

//系统重启return; case ITEM_WIPE_DATA: //擦除数据分区

break; case ITEM_WIPE_CACHE: //擦除cache 分区break; case ITEM_APPLY_SDCARD: //通过防止update.zip 包到sdcard 根目录实现系统升级

break; } }}======================================

一、应用层流程分析

设置模块中恢复出厂设置,不管是否删除SD卡,最终都会执行如下两步:

1、往/cache/recovery/command文件中写入命令字段

2、重启系统,进入recovery模式

具体可参考

framework/base/core/java/android/os/RecoverySystem.jav a文件,代码片段如下:

在rebootWipeUserData方法中,会调用bootCommand方法,并传入参数--wipe_data命令字段,重启进入recovery 模式后,recovery服务会通过读取此参数来擦除data和cache分区,详细流程见下文。

二、恢复模式流程分析

重启后,从recovery模式的init.rc文件中可以看到启动recovery服务,具体可参考bootable/recovery/etc/init.rc文件,代码片段如下:

recovery服务的主函数在bootable/recovery/recovery.c文件中,main函数的分析如下:

ui_init()

说明:初始化ui,recovery模式的交互界面

get_args(&argc, &argv);

说明:读取/cache/recovery/command文件,并根据命令字段进行相应操作,因为恢复出厂设置的时候

/cache/recovery/command的内--wipe_data,所以它会擦除data和cache分区,代码片段如下:

分区擦除后,系统重启,然后进正常开机流程,重新使用system分区的内容完成开机初始化,代码片段如下:

至此,恢复出厂设置流程完毕。

================================

[开发经验] recovery.img与boot.img简单对比分析recovery,

boot

今天对比分析了一下recovery.img和boot.img的结构,从中粗略知道了Android手机中的恢复模式是怎么回事。

以下是文件结构的对比图:从中我们知道:

(1)recovery.img其实已经是进入了Linux系统。(2)recovery.img为了具有恢复系统的能力,比普通的boot.img 目录结构中:

1、多了/res/images目录,在这个目录下的图片都是恢复时我们看到的背景画面。

2、多了/sbin/recovery二进制程序,这个就是恢复用的程序。

3、/sbin/adbd不一样,应该和恢复有关。(3)Android 系统中的初始化程序(init)和初始化配置文件(default.prop、init.trout.rc、init.rc、init.goldfish.rc、)都不一样。这就是系统没有进入图形界面而进入了类似文本界面,并可以通过简单的组合

键进行恢复的原因。通过查阅相关资料,对android的recovery模式有了一定的了解:Android可以通过Recovery模式,实现恢复出厂设置、OTA升级、patch 升级及firmware升级。在关机后,同时按下home

+ power键可以进入recovery模式。

大部分升级(包括刷机)都可以通过一个SD卡中的"updata.zip"文件升级包进行傻瓜式升级(步骤简单的升级)。而这一过程就是在系统进入Recovery模式后,通过升级程序运行升级包中

“META-INF/com/google/android/update-script脚本来执行各种不同的自定义升级,脚本中是一组recovery模式下系统能识别的UI控制命令和文件系统操作命令,例如

write_raw_image(烧写FLASH分区)、copy_dir(复制目录)等等。

具体的Recovery模式执行过程,有空看了源码再细说。上一篇蓝牙(Bluetooth)系统的无线接入下一篇Android高手必看的十个建议

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的开机流程 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,这是只是向特定层上绘图,其代码了存放在特殊的位置

基于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

语音芯片的音量控制方法

语音芯片音量控制方法及各行业语音芯片选型方法 很多语音芯片有带音量控制,有些则不带音量控制。语音芯片的音量控制一般分为两种,一种是硬件音量控制,另外一种是软件音量控制。 一、硬件音量控制:语音芯片的音量控制一般分为8级音量控制和16级音量控制。但是语音芯片一般有两种音频输出方式,一种是PWM音频输出,一种是DAC音频输出,哪语音芯片的硬件音量控制是怎么控制两种音频输出的音量的呢?一般是采用调整电流的方式来控制音量的输出。控制PWM电流就可以控制输出到喇叭上的电流强度,从而控制喇叭振幅的大小,从而控制我们人感知的音量大小。DAC音频输出方式,同样也是控制电流形式,因为语音芯片大多数一般都是电流型DAC只要控制DAC的电流就可以控制外部三极管的基极电流,从而控制喇叭上的电流强度达到音量调节的目的。 二、软件音量控制:由于软件调节音量不能直接控制PWM和DAC上的电流,所以软件音量控制一般是直接调整输送到音频合成器的数值,达到音量控制的目的。所以只要通过一定的数学运算,就可以对输送到音频合成器的数值进行调制。理论上软件音量控制可以任意级数。但是由于受到CPU运算能力的影响和实际应用的需求一般也是做16级音量控制。如果运算能力有限也可以做2级或者4级音量控制。 各行业语音芯片如何选型? 目前各行用的最多的是8脚语音芯片,因为电路体积小、应用方便,而且价格比较低,一般为OTP类型的较为多,各行业均会优先考虑该类型。8脚语音芯片主要是指软封装为八个引脚,硬封装为DIP8或者SOP8的语音芯片,常见的八脚语音芯片有WTH040系列、WTH080系列、WTN3系列、WTN4系列、WTN5系列、WTH040系列、WTH080系列……,不同的芯片行业领域应用可选择不同的型号。一般的语音集成电路的封装形式大部分是双列直插式塑料封装集成电路(DIP),俗称硬封装电路,按引脚数分为8脚、14脚、16脚等,每个引脚的功能是不同的。通常引脚多,集成电路芯片的体积越大,电路功能强,价格较八脚的高,八脚语音芯片也是小体积语音IC,空间占用小。 常用的8脚语音ic用途很多,目前很多行业青睐8脚语音芯片,行业常用的语音芯片有哪些呢?分别用在什么用途,语音芯片的选型,除了考虑管脚外,也要考虑价格、语音长度等,以下为您详解WTN3。 WTN3语音芯片在芯片应用范围上,几乎可以涉及到所有需要低成本,但不更改语音的

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 小项目之--使用【AudioManager】类控制音量

Android 小项目之--使用【AudioManager】类控制音量 一个好的 Android 应用免不了会自带背景音乐,比如游戏或者一款比较不错的书本阅读器。一些好的应用在自带音乐的时候会多添加一款小功能即可以帮助用户设置声音大小或者改变应用的声音模式。 本篇基于 Android API 中的 AudioManager 作讲述,使看过本篇的读者可以迅速的掌握这个类的实现过程。下面是本篇大纲: ?1、认识 AudioManager ?2、AudioManager 主要方法介绍 ?3、程序逻辑实现过程 1、认识 AudioManager AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作。2、AudioManager 主要方法介绍 邮于 AudioManager 该类方法过多,这里只讲述几个比较常用到的方法:?方法:adjustVolume(int direction, int flags) 解释:这个方法用来控制手机音量大小,当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。 ?方法:getMode() 解释:返回当前音频模式。 ?方法:getRingerMode() 解释:返回当前的铃声模式。 ?方法:getStreamVolume(int streamType) 解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。 ?方法:setRingerMode(int ringerMode) 解释:改变铃声模式 3、程序逻辑实现过程 界面上设置了一个图片,表示当前铃声状态,一个进度条表示当前音量大小,五个图片按钮,用来表示增加/减小音量、普通模式、静音模式和震动模式。下面是界面的 XML 布局代码:

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之声音管理器AudioManager的使用

Android声音管理AudioManager使用 手机都有声音模式,声音、静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能。在Android手机中,我们同样可以通过Android的SDK提供的声音管理接口来管理手机声音模式以及调整声音大小,这就是Android中AudioManager的使用。 以下分别是AudioManager设置声音模式和调整声音大小的方法。 如何获取声音管理器: AudioManager audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE); 里面主要的方法: A、设置声音模式 //声音模式 AudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); //静音模式 AudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

//震动模式 AudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); B、调整声音大小 //减少声音音量 AudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0); //调大声音音量 AudioManager.adjustVolume(AudioManager.ADJUST_RAISE, 0); getMode()获取音频模式 getRingerMode()获取铃声震动模式 ---------------------------------------------------------------- 这里如果使用了和手机震动有关的模式,记得添加权限。 android.permission.VIBRATE哦! 参考:https://www.sodocs.net/doc/6e10136349.html,/blog/1125304

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进程注册服务中,该服务启动时主要功能是初始化整个显

8CH音量控制

8-CHANNEL ELECTRONIC VOLUME WITH INPUT SELECTOR The NJW1298 is a 8-channel electronic volume with Input Selector. It includes 13-in 4-out stereo audio selector , REC Output and Multi-channel inputs. The NJW1298performs low noise and low distortion characteristics with resistance ladder circuit. All of functions are controlled via three-wired serial bus. Selectable 2-Chip address is available for using two chips on same serial bus line. The NJW1298 is suitable for multi-channel audio system, such as AV amplifier, DVD receiver, and others. Operating Voltage ±4.5 to ±7.5V 3-Wired Serial Control Chip Address Select Function 13-input 4-output stereo selector Multi-Channel input (8ch x 2) Input Selector Gain Control Gain : 0 to -21dB / 3dB step Volume +31.5 to –95dB / 0.5dB step, Mute SWch, Cch, LS/RSch output addition to L/R ch output LB/RBch output addition to LS/RS ch output Zero Cross Detection Bi-CMOS T echnology Package Outline QFP100-U1 NJW1298FU1 E C A E C C R E C A R E C C E C B R E C B

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 相关的启动脚本如下图:

基于android平台的音乐播放器的设计与实现

嵌入式系统综合设计说明书 题 目:基于Android 的音乐播放器设计与实现 姓 名: 学 院:信息工程学院 班 级: 指导教师: 2012 年9 月24 日

摘要 Android是一种以Linux为基础的开放源代码操作系统,本文就android平台下设计和实现音乐播放器,利用java语言和Eclipse编程工具实现。通过设计能够实现音乐的播放、暂停、上一曲、下一曲、音乐列表、声音控制、帮助菜单等功能,通过对基于android平台下的播放器的设计,了解音乐播放器的设计的原理和实现的相关技术,掌握了android编程思想以及基本的应用组件,对以后从事android开发有很大的帮助。 关键词:android;音乐播放器;嵌入式;java

Abstract Android is a Linux-based open-source operating system, this article on the android platform design and realization of the music player, the use of the Java language and the Eclipse programming tools. Can be achieved through the design of the music playback, pause, previous song, next song, music list, sound control, the Help menu and other functions through the principle player in android platform-based design, and to understand the design of the music player realization of the related technology, to master the android programming ideas, as well as basic application components, great help later in the android development. Keywords: android; music player; embedded; java

音量控制器配置方案

音量控制器配置方案 1.音量控制器:控制该区域的广播放音时的声压,一般通过电阻或变压器分压式来实现;一般音量控制器有三种。 一、背景音乐音量控制器,它是二线制的,不需要消防广播的地方使用; 二、带消防广播强切的音量控制器(而这种带强切的音量控制器按它的强切方式分三线制与四线制);何为强切,当区域使用都将此音量控制器的音量调节到很少,甚至在关闭,当有紧急通知或消防时,控制机房通过发出一个紧急控制信号送到音量控制器上,强迫音量控制器进入广播,不受音量控制器的状态影响,进入广播状态。 三、选台音量控制器,顾名思义该音量控制器在可以控制音量的同时也可以选择不同的音乐,它也分消防与不需要消防强切二种,而这种选台音量控制器只能使用四线制方式进行强切。 1)、二线制音量控制器:不需要消防广播的区域则可以使用二线制音量控制器。机房到音量控制器是二芯广播线,音量控制器到喇叭也是二芯广播线,连接示意图如下: 2)、三线制强切音量控制器:需要消防广播的区域则可以使用三线制音量控制器。机房到音量控制器是三芯广播线(一根是公共线COM,一根是背景广播信号线N,一根是紧急广播信号线R),音量控制器到喇叭也是二芯广播线,中讯的PA系列功放与PA-B系列

功放可以直接三线输出,而中讯智能分区矩阵器PAS-316也是三线输出的,连接示意图如下:(注,三线制强切音量控制器比四线制的音量控制器稳定性要好。且布线也少) 3)、四线制强切音量控制器:需要消防广播的区域则可以使用四线制音量控制器。机房到音量控制器是二芯广播线(一根是公共线COM,一根是背景广播信号线)和二芯控制信号线(紧急控制信号24V),音量控制器到喇叭也是二芯广播线,中讯的PA系列功放可以直接四线输出,连接示意图如下:

Android ninja 编译启动过程分析

Android ninja编译启动过程分析 ---make是如何转换到到ninja编译的 1.首先你的得对make的工作机制有个大概的了解: 运行的命令在要编译的目录下运行make,或者make target_name a.分析处理保存阶段(没有实际编译动作):它首先对当前目录下的Makefile文件的做一次扫描,语法分析,还有处理,主要是变量的保存,目标依赖列表生成,目标下的action列表的生成,然后记住 b.然后按记住的目标执行action列表动作(有实际编译动作). 编译启动的入口方式还是运行make: 2开始make-jxxx方式进入.....(xxx是本机cpu的数量) make开始做进行第一次扫描.... 目前USE_NINJA还是没有定义,估计以后很久很久才能启用的了! BUILDING_WITH_NINJA开始也是没定义的 看make扫描入口文件: Makefile: include build/core/main.mk 在build/core/main.mk: 在ninia之前都有include help.mk和config.mk 97include$(BUILD_SYSTEM)/help.mk 98 99#Set up various standard variables based on configuration 100#and host information. 101include$(BUILD_SYSTEM)/config.mk 说明make help//显示make帮助make config//当前显示配置 103relaunch_with_ninja:= 104ifneq($(USE_NINJA),false) 105ifndef BUILDING_WITH_NINJA<==第二次扫描不会到这里了 106relaunch_with_ninja:=true 107endif 108endif 116ifeq($(relaunch_with_ninja),true)<===第一次扫描入这里了 117#Mark this is a ninja build. 118$(shell mkdir-p$(OUT_DIR)&&touch$(OUT_DIR)/ninja_build) 119include build/core/ninja.mk//---进入ninja.mk 第一次扫描到此为止就结束掉了,因为在当前ifeq else endif后面没有代码了 120else#///!relaunch_with_ninja<===第二次扫描入这里了

Android audioManager解决MediaPlayer AudioTrack 调节音量问题

在听筒模式下 am.setSpeakerphoneOn(false); setV olumeControlStream(AudioManager.STREAM_VOICE_CALL); am.setMode(AudioManager.MODE_IN_CALL); 我用Mediaplayer AudioTrack调节音量总是失败 at.setStereoV olume(vol, vol); player.setV olume(vol,vol); 后来决定用AudioManager来调节音量 AudioManager可以修改系统Android系统的音量 下面介绍几个AudioManager的几个音量调整方面的方法. 首先是得到AudioManager实例: AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 调整音量方法有两种,一种是渐进式,即像手动按音量键一样,一步一步增加或减少,另一种是直接设置音量值. 1、渐进式 public void adjustStreamV olume (int streamType, int direction, int flags) am.adjustStreamV olume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); 解释一下三个参数 第一个streamType是需要调整音量的类型,这里设的是媒体音量,可以是: STREAM_ALARM 警报 STREAM_MUSIC 音乐回放即媒体音量 STREAM_NOTIFICA TION 窗口顶部状态栏Notification, STREAM_RING 铃声 STREAM_SYSTEM 系统 STREAM_VOICE_CALL 通话 STREAM_DTMF 双音多频,不是很明白什么东西 第二个direction,是调整的方向,增加或减少,可以是: ADJUST_LOWER 降低音量 ADJUST_RAISE 升高音量 ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量 第三个flags是一些附加参数,只介绍两个常用的 FLAG_PLAY_SOUND 调整音量时播放声音 FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个 2、直接设置音量值的方法: public void setStreamV olume (int streamType, int index, int flags) am.setStreamV olume(AudioManager.STREAM_MUSIC, am.getStreamMaxV olume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND);

android开机过程

一、Android开机启动流程简介 1、OS-level: 由bootloader载入linux kernel后kernel开始初始化, 并载入built-in 的驱动程序。Kernel完成开机后,载入init process,切换至user-space。 Init进程是第一个在user-space启动的进程。 2、Android-level: 由init process读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server等。 由 init process 根据硬件类型读取init.xxx.rc。由init.xxx.rc加载init.xxx.sh。 由 init.xxx.sh 加载特定的硬件驱动。如hi_tuner.ko、hi_demux.ko等。 3、Zygote-Mode: Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。 随后,使用者将看到一个桌面环境(Home Screen)。桌面环境由一个名为[Launcher]的应用程序负责提供。 本文档重点研究Android-level中的启动流程。 启动流程如下图所示:

二、init process流程分析 init进程简介 init进程是第一个在user-space启动的进程。由内核启动参数[init]传递给内核,如果该项没有设置,内核会按 /etc/init,/bin/init,/sbin/init,/bin/sh的顺序进行尝试,如果都有的都没找到,内核会抛出 kernel panic:的错误。

相关主题