Android系统启动升级流程
Android应用程序的自动更新升级
![Android应用程序的自动更新升级](https://img.taocdn.com/s3/m/0354547f1711cc7931b7164d.png)
Android应用程序的自动更新升级(自身升级、通过tomcat)刚入手android一个多月,因公司需要提交技术文档,才写了这个demo测试,想保存下来,以备后用!有什么不对的地方欢迎大家指正,这个示例也是参考了网上别人的demo自己做的。
Android应用程序的升级(自身升级)一、引言:很多的Android应用都具有版本检测和自动更新的功能,用户一键就可以完成软件的升级和更新。
Android应用程序的升级本质上是利用了Linux系统的软件包管理和安装机制,而对于上层这一功能的开发来说很容易,只需要我们开发人员利用Android自带的API就可以实现。
二、功能说明:1、本示例用来实现单个应用程序的自身升级2、程序启动时,连接tomcat7 web服务器进行版本的检测,若有新版本则提示更新3、将从web服务器下载的新版本的APK文件放到sdcard中4、监听新版本的APK应用是否安装完成,如果是,则将下载的apk文件从sdcard中删除三、程序框架流程:四、环境说明:1、服务器端:Ubuntu下的tomcat7web服务器,安装后默认端口是8080,Android模拟器访问时要将apk文件放到/var/lib/tomcat7/webapps/ROOT/目录下,Android模拟器的访问方式是http://10.0.2.2/NewAppSample.apk2、Android模拟器端的开发环境:Ubuntu+eclipse+ADT五、流程详解及关键点说明:(一) 新版本的应用程序(NewAppSample)准备:a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1b) 编辑应用程序对应的版本信息文件version.json说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。
MOTO刷android系统简明教程
![MOTO刷android系统简明教程](https://img.taocdn.com/s3/m/1021fb05a6c30c2259019e47.png)
简明教程:按音量下键+电源键开机,按几秒后放手,会自动进入BP tools模式,插上数据线,启动RSDlite,把ROM包(zip文件,不要再解压了)选好,开刷。
这个不会的,自己放狗找教程。
为了方便大家刷机,特分享XT883进入刷机模式的方法,里程碑3进入刷机模式的方法给大家。
希望对大家有所帮助!XT883进入刷机模式的方法,里程碑3进入刷机模式的方法如下:1、将手机处于关机状态下。
2、同时按住音量下键和开机键不松。
3、手机将直接进入升级模式中(即刷机模式)为大家分享一下XT883的刷机教程,里程碑3刷机教程。
由于XT883的刷机包和原来其它的刷机包有些不一样,并不是一个整包,而是分成多个文件,所以刷机的方法有一点不一样。
具体方法如下:1、保证数据线性能良好和手机电量充足。
2、将XT883进入刷机模式(详情查看XT883进入刷机模式的方法,里程碑3进入刷机模式的方法)3、在电脑上打开RSD 5.4.4或以上的版本(切记,旧版本可能无法使用)附:RSD 5.4.4下载4、使用数据线将手机连接到电脑上。
安装好必须的驱动(驱动至少需要使用Motorola Driver Installer5.1.1 或以上版本下载地址/thread-2128-1-1.html)5、点击RSD上的“。
”按钮,选择xml或zip文件,然后点Start就可以开始刷机了6、如果是zip格式的文件,也可以直接选择,然后再点Uncompress And Start Flashing开始刷机。
如下图:7、刷机中,如下图:8、等到升级完成后,手机将重启动,再wipe一下即可。
(附:XT883 wipe的方法:/thread-2650-1-1.html)9、如果刷机完成后,总是卡在启动画面或不停的重启动,只需要WIPE即可。
还可以将手机进入刷机模式(附:XT883进入刷机模式的方法,里程碑3进入刷机模式的方法),然后在电脑左下角点击开始--->运行--->输入:cmd然后点击确定,然后将下面的指令依次输入即可。
android2.2刷机教程
![android2.2刷机教程](https://img.taocdn.com/s3/m/e820472abcd126fff7050bb2.png)
Htc desire 制作金卡、root、升级2.2系统的一条龙教程声明:1、此贴非本人原创,而是综合许多作者成果并结合自己升级过程中解决所遇到问题经验而成的(本人已成功升级),希望对想升级2.2的机友有帮助。
2、让我们对那些辛勤付出的原创高手们表示崇高的敬意和衷心的感谢。
3、刷机有风险,此贴仅供学习交流之用,不提倡按此刷机,刷机过程有很多意外因素,如按此教程刷机出现不良后果自负。
入门:1、请先安装ANDROID驱动,可以用通用驱动或HTC Sync(内含驱动的)。
保证你的手机能被电脑识别。
下载地址:/hk-tc/SupportDownload.aspx?p_id= 312&cat=3&dl_id=9332、请使用安装了WINDOWS XP的电脑(其他系统我没试过,不知道怎么用。
)3、有个金士顿、SANDISK的原装TF卡。
4、网络连接,有些要上网找资源、下载软件的。
5、耐心加细心。
正式开始第一步:制作金卡。
关于什么是金卡,坛子里有很多介绍,希望朋友们善用搜索引擎,在搜索引擎里搜索一下“制作金卡教程” 等即可查到。
我这里简单地解释一下流程,其中某些步骤比网上的教程要简单,容易多了。
1、将TF卡插入你的G7中,注意,TF卡最好为金士顿、SANDISK等名牌非假货TF卡。
2、在Market里下载Estrongs或类似的资源管理器,以文本形式打开/sys/class/mmc_host/mmc*/mmc*:*/cid 文件。
这个* 可能是数字或字母(网上教程说这里都是1或0,比如/sys/class/mmc_host/mmc0/mmc0:1/cid,这个是不准确的),这个文件打开来是一个32位的字符,中英混合的,记下这一串字符。
(这个文件可能不好找,大家多找找)找到以后就把卡拔下,用读卡器插入电脑中,或者直接用手机以磁盘管理器模式连接电脑。
并拔下电脑上除了你的TF卡以外的其他U盘、移动硬盘,方便后面的辨认。
android-recovery
![android-recovery](https://img.taocdn.com/s3/m/e94358d585868762caaedd3383c4bb4cf7ecb7c9.png)
#设置环境变量 #建立etc连接 #新建目录 #挂载/tmp为内存文件系统tmpfs #开启recovery(/sbin/recovery)服务 #开启adbd服务(用于调试)
三、Recovery
2. recovery服务
recovery服务是Recovery开启模式中最关键旳部分。它完毕 Recovery模式全部旳工作。
1.ui_init():Recovery服务使用了一种基于framebuffer旳简朴ui。 2.get_arg():获取Main system 传递给Recovery服务参数 3.parserargc/argv:解析我们取得参数。 4.根据参数分析旳成果,进一步分析是否升级,是否wipe等。 5.假如安装失败执行: prompt_and_wait()待顾客处理。 6.安装成功执行: finish_recovery(),清除参数,以及备份升级log
规避措施成为砖头措施:
1.在升级包中不包括uboot,recovery镜像,使在升级过程断电旳 情况下,也不会损坏uboot,和recovery。能够使用双备份升级 和一键恢复升级方式,进行恢复升级。
2.在升级包中不包括uboot,使在升级过程断电旳情况下,也不会 损坏uboot,。能够使用一键恢复升级方式从外部存储设备加载 recovery,进行恢复升级。
四、全包升级与差分升级
全包升级与差分升级包旳升级过程都是zip文件旳升级过 程。所以升级旳流程是一样旳,唯一不同旳地方就是从 升级包中提取升级脚本旳不同,执行不同旳升级过程。
#如: 全包升级脚本中包括格式化system分区旳语句,差分升级则没有
RK系统启动流程
![RK系统启动流程](https://img.taocdn.com/s3/m/e980c863561252d380eb6e77.png)
RK29机型之Android系统启动流程分类:瑞芯微RK 2012-02-12 14:50 4439人阅读评论(0) 收藏举报/********************************************************************************************* author:conowen@大钟* E-mail:conowen@* /conowen* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/第一步:系统引导bootloader,即RK29xxLoaderXXX.bin文件加电后,CPU将先执行 bootloader程序,然后bootloader首先会读寄存器地址base + APP_DATA1的内容,根据这个地址的值决定是否进入recovery模式或者其它模式。
bootloader还会读取MISC分区第一块的内容,决定进入recovery模式还是升级基带Baseband Processor(BP)或做其它事情而上述寄存器与分区的值是有按键触发或者软件触发的。
a) 开机按reset+返回键,系统进入recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写b) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动机器(以下只分析正常启动的情况)第二步:启动内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载第三步:文件系统(rootfs)及应用初始化(init)1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能第四步:重要的后台程序zygote1) 源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa) 建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动SystemServer第五步:系统服务system server1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)第六步:桌面launcher1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在 ActivityManagerService.systemReady()通知的过程中建立的,最终调用 ()启launcher第七步:解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用 PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个 Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置第八步:开机自启动的第三方应用程序1) 源码:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
android恢复出厂设置以及系统升级流程
![android恢复出厂设置以及系统升级流程](https://img.taocdn.com/s3/m/bcd2cc3702d8ce2f0066f5335a8102d276a261c1.png)
Android恢复出厂设置以及系统升级流程Android手机在使用一段时间后,可能会出现一些问题,例如系统卡顿,应用闪退等。
这时候,我们通常会考虑恢复出厂设置或系统升级。
本篇文档将介绍恢复出厂设置以及系统升级的流程。
恢复出厂设置恢复出厂设置是将手机恢复到出厂时的状态,即清空所有数据和设置。
在执行恢复出厂设置前,需要备份所有个人数据和设置,以免数据丢失。
以下是恢复出厂设置的具体步骤:1.打开手机设置应用,找到“系统”或“设备”选项。
2.在系统或设备选项中,选择“恢复出厂设置”。
3.在弹出的提示框中,选择“清除所有数据”或“恢复出厂设置”。
4.点击“重启”按钮,等待手机重启完成。
5.在重启完成后,手机将返回到出厂设置状态,需要重新设置语言、网络等参数。
注意事项:•恢复出厂设置会清除所有个人数据和设置,包括联系人、短信、通话记录、应用和账户信息等,请务必备份重要数据。
•在恢复出厂设置前,请确认设备已插上电源,并有足够的电量。
•恢复出厂设置可能需要一些时间,请耐心等待。
系统升级系统升级是将手机系统更新至最新版本,从而获得更好的性能和更好的用户体验。
在执行系统升级前,需要备份所有重要数据,以免数据丢失。
以下是系统升级的具体步骤:1.打开手机设置应用,找到“系统”或“设备”选项。
2.在系统或设备选项中,选择“软件更新”或“系统更新”。
3.点击“检查更新”按钮,等待系统检测是否有更新。
4.如果有更新,点击“立即更新”按钮。
5.等待下载完成后,点击“安装更新”按钮。
6.系统会自动重启,等待重启完成后,即完成系统升级。
注意事项:•在系统升级前,请确认设备已插上电源,并有足够的电量。
•系统升级过程需要一些时间,请耐心等待。
•虽然一般来说,系统升级不会影响个人数据,但仍建议备份重要数据。
•某些手机可能需要通过电脑连接进行系统升级,请参考手机说明书或官方网站。
Android OTA 简介
![Android OTA 简介](https://img.taocdn.com/s3/m/6a74416027d3240c8447ef02.png)
android OTA 简介OTA 全称 over the air , OTA 升级是 Android 系统提供的标准软件升级方式。
它功能强大,提供了完全升级、增量升级模式,可以通过 SD 卡升级,也可以通过网络升级。
这里,首先介绍SD卡升级,网络升级原理和SD卡大致一样.下面我们将介绍这一过程.在升级前,我们要准备升级包,所有编译好的包都命名为update.zip ,不管是增量升级还是完全升级.1.生成完全升级包../mk prj new./mk prj otapackage编译完成之后,将在\out\target\product\prj\目录下生成prj-ota-eng.root.zip ,这个zip将是我们升级用的包,我们要把他改名为update.zip ,然后copy 到SD卡的根目录下. 在运行上面指令的过程中,同时会在 out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip 这个文件非常重要,我们将他保存为old.zip它是我们做增量包的基础文件.2.生成增量包.当代码有更新时,我们更新新的代码.同样运行./mk prj otapackage 产生代码更改后的完全升级包. 这时同样会在out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip我们把它重命名为new.zip ,接下来我们完成生成增量包的最后一步.运行./build/tools/releasetools/ota_from_target_files -i old.zip new.zip diff.zip ,产生new.zip 到old.zip 的增量包diff.zip ,同样我们要把它命名为update.zip ,可以copy 到SD卡的更目录下,做增量式升级使用.(备注:如果升级有特殊的要求,比如格式化data 分区,更新uboot等分区,需要修改ota_from_target_files.py 这个脚本)上面的内容介绍了如何准备update.zip 升级文件.接下来介绍升级过程.先说一下正常开机过程, 按power 键开机,uboot 在运行完之后,将把boot 分区的内容boot.img 文件加载到内存,然后跳转到boot中linux内核的开始位置,运行linux 内核代码,在内核的最后执行正常启动时的init.rc 文件,挂载system分区到/system 目录下,挂载data 分区到 /data 目录下.启动虚拟机等相关的一下服务.要升级程序,开机的时候,需要按住power 和下vol 键,这样uboot 在运行完之后将加载recovery分区的recovery.img 文件到内存.现在我们看一下,recovery.img 这个镜像里面有什么内容.详细的内容我们可以查看build/core/makefile 文件,在这个文件里面我们查找 Recovery image ,从这里开始的内容,主要是打包recovery.img 的内容.关于recovery.img的具体内容,说的简单点,就是linux 内核和将\out\target\product\prj\recovery目录打包成ramdisk 的一个镜像的集合.对比正常开机的boot.img镜像,区别为boot.img 里面的ramdisk镜像是out\target\product\prj\root 打包来的.其内核文件是同一个文件. recovery.img 镜像里面的ramdisk 文件系统包含的用于数据升级相关的bin文件,比如gzip,recovery 等重要的程序.在机器加载recovery.img ,执行完内核后,运行recovery 模式下的init.rc 该文件在bootable\recovery\etc\目录下,我们拿它和正常开机的init.rc 文件相比.发现recovery 模式的init.rc 仅仅新建了几个目录,包括sdcard,用于SD卡的挂载点.启动了2个service,一个ueventd,一个recovery的主菜单程序recovery(该文件是bootable\recovery\recovery.c 编程而成),内容非常简单.在recovery 的主界面,选择更新程序后,recovery将会解压update.zip 文件,执行其中的\META-INF\com\google\android\updater-script ,recovery会对脚本进行解析.下面是这个脚本的部分摘录.show_progress(0.500000, 0);format("yaffs2", "MTD", "system");mount("yaffs2", "MTD", "system", "/system");package_extract_dir("recovery", "/system");package_extract_dir("system", "/system");symlink("toolbox", "/system/bin/cat", "/system/bin/chmod","/system/bin/chown", "/system/bin/cmp", "/system/bin/date",......."/system/bin/wipe");set_perm_recursive(0, 0, 0755, 0644, "/system");........show_progress(0.200000, 10);assert(package_extract_file("boot.img", "/tmp/boot.img"),write_raw_image("/tmp/boot.img", "boot"),delete("/tmp/boot.img"));show_progress(0.100000, 0);unmount("/system");(以上脚本为系统自动生成)从脚本可以看到,首先格式化system区分,然后把updata.zip 里面的system目录的内容解压到system 分区.接着修改system分区下文件的权限.最后将boot.img 镜像写回到boot 分区.从以上的介绍,可以看到android 的功能非常强大,在recovery 模式下,linux 已经已经完全跑了起来.除了apk,jar 不能运行之外,你可以做任何你想做的事情.上面的例子中,更新了system分区和boot分区,如果需要还可以更新 uboot分区,logo分区,格式化data 分区等等 .关于OTA的网络实现,实际上是检查网络上的更新,或者网络通知更新.把更新包(update.zip)下载到本地,在用户的选择下,重启机器自动进入recovery模式,执行上面的过程.。
台电双系统(Android+Windows8.1)安装教程
![台电双系统(Android+Windows8.1)安装教程](https://img.taocdn.com/s3/m/e159d3aafd0a79563c1e72ae.png)
注意事项:1、在系统安装之前,请仔细阅读本教程的详细步骤;2、安装系统会清空磁盘的所有数据,请预先把重要数据进行备份;3、安装过程大约需时30-40分钟,安装前务必保证机器电量充足,建议预先给机器充满电,再进行操作;4、以下刷机分为Android刷机和Windows刷机,可根据刷机需求分别单独进行,即需要更新Android固件时,进行Android刷机操作即可,需要更新Windows系统时,进行Windows 刷机操作即可;准备工作:1、在台电官网,输入机器背壳ID,下载对应的系统包和刷机工具并完成解压;2、准备两个8G容量以上的U盘;3、准备一台带外接供电的USB HUB设备;4、准备一套USB键盘;备注:若单刷Android固件,则不用准备2、3、4点所说明的工具;操作步骤:一、刷Android固件1、打开“Android系统升级工具”文件夹,按以下顺序安装:1) 首先安装iSocUSB-Driver-Setup-1.2.0.exe文件;2) 再安装IntelAndroidDrvSetup1.5.0.exe文件;3) 最后安装ManufacturingFlashTool_Setup_6.0.43.exe文件;4) 以上安装成功后,将“升级工具”文件夹中的CUSTOM_CONFIG.INI文件拷贝到C:\ProgramFiles\Intel\Manufacturing Flash T ool目录下。
特别注意事项:a、必须按以上顺序安装升级工具b、安装以上程序时请保持默认安装设置和路径c、以上三个程序按顺序安装成功后,在电脑桌面上会有升级工具快捷图标,如图1所示d、请务必按以上步骤操作,否则将导致升级不成功图12、安装完成后,运行“Manufacturing Flash T ool”后再点击左上角的File选择Settings选项,将SOC Devicds的VID/PID分别改为8087和0A65,将Android devices的VID/PID分别改为8087和09EF,如下图红色方框所示进行设置,保存后关闭量产工具。
N1升级Android 2.2.1最新系统固件教程
![N1升级Android 2.2.1最新系统固件教程](https://img.taocdn.com/s3/m/7396b5c2aa00b52acfc7ca5b.png)
N1升级Android 2.2.1最新系统固件教程
谷歌通过OTA的方式发布更新了Nexus One的固件,最新系统版本为Android 2.2.1 FRG83版,据称改善了以前版本经常遇到的Wi-Fi信号问题。
Google Nexus One升级最新的Android 2.2.1 FRG83固件
N1升级Android 2.2.1教程:
1、下载Nexus One 的Android 2.2.1版本ROM文件
2、将下载后的文件改名为update.zip并放到microSD卡的根目录
3、关闭Nexus One手机
4、按住音量减少键不放,然后选择开机
5、屏幕会出现一个搜索文件的界面,滚动到下面的Recovery选项,并且按下电源键
6、看到三角恢复界面后,同时按下电源键和音量增加键
7、在出现的菜单选项中选择Apply sdcard:update.zip
8、完成后,屏幕会提示Install from sdcard complete,这时候选择reboot system now,等待系统重启成功即可完成升级更新。
点评:以上更新升级过程非常简单,按照如上教程几乎不需要太多步骤即可简单实现。
另外,N1用户还可以通过OTA的方式直接进行升级,但前提是收到更新升级提醒后才行。
Android OTA升级原理和流程分析--update.zip包的制作
![Android OTA升级原理和流程分析--update.zip包的制作](https://img.taocdn.com/s3/m/867ac3c151e79b8968022661.png)
Android OTA升级原理和流程分析Android OTA升级原理和流程分析(一)--update.zip 包的制作这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理。
我们先从update.zip包的制作开始,然后是Android系统的启动模式分析,Recovery工作原理,如何从我们上层开始选择system update到重启到Recovery服务,以及在Recovery 服务中具体怎样处理update.zip包升级的,我们的安装脚本updater-script怎样被解析并执行的等一系列问题。
分析过程中所用的Android源码是gingerbread0919(tcc88xx开发板标配的),测试开发板是tcc88xx。
这是在工作中总结的文档,当然在网上参考了不少内容,如有雷同纯属巧合吧,在分析过程中也存在很多未解决的问题,也希望大家不吝指教。
一、 update.zip包的目录结构|----boot.img|----system/|----recovery/`|----recovery-from-boot.p`|----etc/`|----install-recovery.sh|---META-INF/`|CERT.RSA`|CERT.SF`|MANIFEST.MF`|----com/`|----google/`|----android/`|----update-binary`|----updater-script`|----android/`|----metadata二、 update.zip包目录结构详解以上是我们用命令make otapackage 制作的update.zip包的标准目录结构。
1、boot.img是更新boot分区所需要的文件。
这个boot.img主要包括kernel+ramdisk。
手机推出更新需要经历哪些流程
![手机推出更新需要经历哪些流程](https://img.taocdn.com/s3/m/bb334e4ef46527d3250ce01e.png)
手机推出更新需要经历哪些流程
如果你和多数的Android 用户一样,使用着厂商们定制化的操作系统,那幺你应该也仍在痴痴等待Android 9.0 更新的到来。
你是否有想过,为什幺Pixel 或是Essential 手机总是可以早早升级,而其它品牌的手机却要等那幺久?日前Sony 在官方博客中为我们带来了它的解释。
该篇文章除了列出将会升级到Android 9.0 的手机型号,也提供了一张图文并茂的插画,简要解释了新的操作系统自Google 发布后,直到旗下手机推出更新需经历的作业流程。
首先,手机厂商需要做的绝不只是在Google 提供的系统嫁接上一些代码这幺单纯。
每次新版本Android 推出前,厂商会先收到来自Google 的PDK,以进行前期测试,接着像索尼这类不只使用高通现成方案的公司,便
须着手于正式版本系统与自家软件、功能兼容性的相关开发,包括自己的硬
件抽象层(HAL)。
此外,索尼近来也将通话和数据传输列为优先开发的部分,完成后再转往自家的专属功能,例如相机和Smart Stamina 省电功能。
接着当然就是一连串的测试,从内而外地,确保更新后的手机符合Sony 的技术标准。
不论喜欢与否,只要拥有定制化操作系统和独家功能的手机,
势必都需要经历相似的流程,才能提供消费者下一代的系统更新。
adb升级原理
![adb升级原理](https://img.taocdn.com/s3/m/03c8e5e3d0f34693daef5ef7ba0d4a7302766c3e.png)
adb升级原理ADB(Android Debug Bridge)是一种用于与Android设备通信的工具。
它可以通过USB连接电脑与Android设备,并提供命令行界面,用于向设备发送命令、安装、调试和卸载应用程序等操作。
ADB升级原理是指使用ADB工具来升级Android设备的操作系统或应用程序。
在进行ADB升级之前,首先需要连接Android设备和电脑,并确保设备已经启用了USB调试模式。
然后,在电脑上打开命令行窗口,输入ADB命令来进行升级操作。
具体的升级过程如下:1. 检查设备连接:输入adb devices命令,查看设备是否成功连接到电脑。
如果设备成功连接,将显示设备的序列号。
2. 下载升级文件:从官方网站或其他可信来源下载Android系统或应用程序的升级文件。
确保下载的文件与设备型号和系统版本相匹配。
3. 将升级文件移动到电脑中的ADB目录:将下载的升级文件移动到电脑上ADB工具的目录中,以便在命令行中可以直接访问。
4. 进入设备的恢复模式:在命令行中输入adb reboot recovery命令,使设备进入恢复模式。
恢复模式是一种特殊的模式,可以在此模式下进行系统和应用程序的升级。
5. 选择升级文件:在设备进入恢复模式后,使用设备上的音量键和电源键来选择升级文件。
找到并选择已经移动到ADB目录中的升级文件。
6. 开始升级:确认选择的升级文件后,点击设备上的电源键来开始升级过程。
设备将会自动安装升级文件,并在完成后重新启动。
通过以上步骤,就可以使用ADB工具来升级Android设备的操作系统或应用程序。
ADB升级原理简单实用,为Android设备的升级提供了便利。
它不仅可以在开发者调试应用程序时使用,还可以在用户需要升级设备时进行操作。
通过ADB工具,用户可以及时获得最新的系统和应用程序更新,提升设备的性能和功能。
总的来说,ADB升级原理是通过ADB工具连接Android设备和电脑,使用命令行界面来发送升级命令和安装文件,实现设备的操作系统和应用程序的升级。
安卓系统手机刷机方法
![安卓系统手机刷机方法](https://img.taocdn.com/s3/m/4e0d0d12a8114431b90dd80f.png)
首先我们来解释一下安卓系统里面刷机需要用到的几个名词,以及他们所起到的作用,当然也是刷机的关键步骤和要点所在,下边我给大家一一解释。
步骤/方法1. 固件、刷固件固件是指固化的软件,中文为固件,它是把某个系统程序写入到特定的硬件系统中的flashROM。
手机固件相当于手机的系统,刷新固件就相当于刷系统。
不同的手机对应不同的固件,在刷固件前应该充2. ROM(包)智能手机配置中的ROM指的是擦除(电擦除可写只读存储器)类似于计算机的硬盘,手机里能存多少东西3. 固件版本固件版本是指官方发布的固件的版本号!里面包含了应用部分的更新和基带部分的更新,官方新固件的推4. Recovery(恢复模式)笼统的说,就是一个刷机的工程界面。
如果你装过系统,你可能知道dos界面或者winPE,安装了Recovery相当于给系统安了一个dos界面。
在recovery界面可以选择安装系统,清空数据,ghost备份系统,恢复系统等等。
刷recovery与刷rom不冲突5. RootRoot权限跟我们在Windows系统下的Administrator权限可以理解成一个概念。
Root是Android系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权利,所有对象他都可以操作。
只有拥有了这个权限我们才可以将原版系统刷新为改版的各种系统,比如简体中文系统。
6. RADIORadio简单的说是无线通信模块的驱动程序。
ROM是系统程序,Radio负责网络通信,ROM和Radio可以分开刷,互不影响。
如果你的手机刷新了ROM后有通讯方面的问题可以刷新RADIO试一试。
7. SPL(这个是关键)SPL,“第二次装系统”,就是负责装载OS操作系统到RAM中。
另外SPL还包括许多系统命令,如mtty中使用的命令等。
SPL损坏了还可以用烧录器重写。
最后说说金卡(这个有很大作用的)很多朋友第一时间下载了官方的系统,然后就开始升级,不是台版的机器都会提示客户ID错误,这是因为更新程序会检测你机器的出货地,也就是销售地区,如果和升级程序不一致,就会中断升级,造成升级失败。
安卓系统各类手机刷机教程
![安卓系统各类手机刷机教程](https://img.taocdn.com/s3/m/9bbbc6d5af45b307e97197cd.png)
安卓系统各类手机刷机教程(总7页)-CAL-FENGHAI.-(YICAI)-Company One 1■CAL•本页仅作为文档封面,使用请直接删除安卓手机刷机教程刷机:简单的说,android 手机的刷机,就相当于给它重装一下系统,这和我们常见的电脑重装系统类似。
通过刷机,给手机装入全新的手机系统。
Recovery :翻译过来的意思就是恢复,不明思议,这是手机上的一个恢复模式。
通过这个recovery用户可以实现安装系统(就是所谓的刷机),清空手机各种数据,为内存卡分区,备份和还原等等很多功能。
它类似于电脑上的Ghost —键恢复。
ROM : ROM是英文Read Only Memory简写,通俗的来讲ROM就是an droid手机的操作系统,类似于电脑的操作系统Windows xp, Windows7等等。
平时说给电脑重装系统,拿个系统光盘或是镜像文件重新安装一下就好了。
而android 手机上刷机也是这个道理,将ROM 包通过刷机,重新写入到手机中,ROM 就是an droid手机上的系统包。
Wipe : Wipe翻译过来的意思就是抹去,擦除等,在recovery模式下有个wipe 选项,它的功能就是清除手机中的各种数据. 这和恢复出厂值差不多。
我们最常用到wipe是在刷机之前,大家可能会看到需要WIPE的提示,是指刷机前清空数据,注意wipe前备份一下手机中重要的东西哦。
好了,看了这些名词解释,是不是对刷机的一些专业术语都有所了解了呢?下面我们就开始刷机过程吧。
刷机前先对自己手机中的一些重要内容进行备份吧,像名片,短信,曰历等重要信息,有需要的就先备份一下,否则刷机后就都没了。
备份好以后,我们需要先给我们的an droid手机下载一个适合该手机使用的rom包,这就像电脑上在重做系统前需要买张系统盘或是在网上下载一个系统镜像,这里要注意的是,手机毕竟不是电脑,大家在下载rom 时一定要下载适合自己手机的相应版本,其他型号手机的rom 是不通用的。
海思Android安全方案 使用指南
![海思Android安全方案 使用指南](https://img.taocdn.com/s3/m/c869fd315727a5e9856a6131.png)
文档版本 发布日期
02 2014-03-12
版权所有 © 深圳市海思半导体有限公司 2014。保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任 何形式传播。
商标声明
、
、海思和其他海思商标均为深圳市海思半导体有限公司的商标。
2013-09-29
2013-07-22 2013-03-29 2013-01-22
版本 02
01
00B05
00B04
00B03 00B02 00B01
修订说明
修改 1.3 编译配置章节,增加 4.7 维修方案章节,删除第 四章,修改第一章安全启动的描述。
增加 1.4 小节编译配置说明和 2.0 章节升级说明,修改安 全 boot 开发说明和补充中国电信开发提示。
文档版本 02 (2014-03-12)
海思 Android 安全方案 使用指南
目录
目录
前 言................................................................................................................................................iii 1 安全启动.......................................................................................................................................1-1
表示能帮助您解决某个问题或节省您的时间。
手机ROM开发教程工具-系统启动流程和刷机模式
![手机ROM开发教程工具-系统启动流程和刷机模式](https://img.taocdn.com/s3/m/227f33425fbfc77da369b112.png)
系统启动流程当按下电源键手机启动后,首先从bootloader 分区中一个固定的地址开始执行指令,bootloader 分区分成两个部分,分别叫做primary bootloader和secondary stage bootloader。
Primary bootloader主要执行硬件检测,确保硬件能正常工作后将secondary stage bootloader拷贝到内存 (RAM) 开始执行。
Secondary stage bootloader 会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式,比如大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot戒者选择启动模式的启动界面等。
我们在论坛上看到的 bootloader通常指的就是 secondarystage bootloader。
常规刷机模式Fastboot 模式:fastboot 是 android 定义的一种简单的刷机协议,用户可以通过fastboot 命令行工具进行刷机,比如fastboot flash boot boot.img这个命令就是把 boot.img 的内容刷写到 boot 分区中。
Recovery模式:当进入recovery 模式时,secondary stage bootloader 从recovery 分区开始启动,recovery 分区是一个独立的Linux 系统,当recovery 分区上的Linux 内核启动完毕后,开始执行第一个程序init。
Init 会启动一个叫recovery 的程序。
通过recovery 程序,用户可以执行清除数据,安装刷机包等操作。
手机除了普通的 CPU 芯片以外,还有 MODEM 处理器芯片。
该芯片的功能就是实现手机必需的通信功能,大家通常所刷的 RADIO 就是刷写 modem 分区。
MTK端口模式:MTK端口模式,全称MediaTek Preloader USB VCOM(Android),主要用于MTK芯片手机刷机救砖,写入分区镜像,升级系统常规进入模式方法:1.关机状态下,连接电脑2.关机状态下,按音量上键+电源键,连接电脑3.关机状态下,按音量下键+电源键,连接电脑高通9008端口模式:高通芯片的9008模式,这个模式全称Qualcomm HS-USB QDloader 9008 ,主要用于刷机救砖,其实就是利用高通芯片自带的9008端口,将手机系统内的所有分区的镜像文件,直接刷写手机。
直刷MIUI--Android刷机教程--从什么都不懂到MIUI完美,适合全部新手老手
![直刷MIUI--Android刷机教程--从什么都不懂到MIUI完美,适合全部新手老手](https://img.taocdn.com/s3/m/e5e5af214b35eefdc8d3333d.png)
【从什么都不懂到MIUI完美,全面直刷官方MIUI教程,请超级新手关注】《正文从这里开始》写在最前:任何超级新手都不要认为这个教程太长太复杂,因为我相信只要有耐心,你们都可以独立完成,其实我们更注重的是大家在这个过程中学习到很多新知识的乐趣。
挑战自我才会有更多成就感。
有机友提出过“我把刷机这个过程写复杂了”,首先非常感谢机友的建议,因此我将我的感受写在了9楼,并且将重要回复放在这里让大家理解:其实我并不想简单问题复杂化,但是如果没有人出来将这些复杂问题用一种简单的方式展示给大家,那么大家在遇到问题的时候就不知道如何去解决,我已经将各种环节掰开揉碎的告诉大家,也是告诉大家我们到底在做什么,一旦遇到中间的问题,应该会有可以分析地方法来解决问题。
否则对于新手来说刷机永远是黑盒子,其实并不利于大家在这个过程中的经历,希望大家体谅我的想法。
下面就直接入主题,在进入主题之前,我要说的是,我这个不是针对某个版本,而是告诉任何一个新手,我们要做什么,我们为什么要这么做,以及我们应该怎么做。
好!开始。
你,一个新手,不知道为什么买了HD2,可能是别人推荐,或者知道所谓什么电容屏,4.3寸屏幕,1GHz处理能力,很薄。
好的,这都没关系。
买来就是打电话的。
如果你是刚刚买来,而以前没用过Windows Mobile(WM)的手机系统,我建议你用一个月,在论坛转转,再考虑继续看这篇帖子。
不过我相信大家都足够聪明,所以请继续往下看。
HD2原生是Windows Mobile(简称WM)6.5的系统,原生的意思就是出厂的意思,6.5是WM的版本。
那么为什么HD能支持Android或者WP7呢?今天我主要介绍Android,尤其是MIUI。
是因为MIUI核心是Android系统,而Android系统也就是google公司在Linux内核基础上开发。
为什么HD2也可以运行Android 系统呢,这其实源于WM内核指令集与Linux内核指令集在硬件层面一致。
Recovery启动流程(1)---应用层到开机进入recovery详解
![Recovery启动流程(1)---应用层到开机进入recovery详解](https://img.taocdn.com/s3/m/e07acd3559fb770bf78a6529647d27284b733714.png)
Recovery启动流程(1)---应⽤层到开机进⼊recovery详解转载请注明来源: 进⼊recovery有两种⽅式,⼀种是通过组合键进⼊recovery,另⼀种是上层应⽤设置中执⾏安装/重置/清除缓存等操作进⾏recovery。
这篇⽂档主要讲解上层应⽤是如何进⼊到recovery的。
本⽂以⾼通平台为例。
1.app执⾏安装/重置/清楚缓存操作调⽤代码⽂件frameworks/base/core/java/android/os/RecoverySystem.java不同的操作使⽤不同的⽅法:安装升级包 -------- installPackage清除⽤户数据------ rebootWipeUserData清楚缓存 ----------- rebootWipeCache上⾯的所有操作都是往/cache/recovery/command⽂件中写⼊不同的命令,在进⼊recovery后(recovery.cpp)对command的关键字进⾏判断,执⾏相应的操作,下⽂会详细讲解,这⾥先简单提及。
bootable/recovery/recovery.appstatic const struct option OPTIONS[] = {{ "send_intent", required_argument, NULL, 'i' },{ "update_package", required_argument, NULL, 'u' },#ifdef TARGET_USE_REDBEND_FOTA{ "omadm_package", required_argument, NULL, 'o' },#endif{ "wipe_data", no_argument, NULL, 'w' },{ "wipe_cache", no_argument, NULL, 'c' },{ "show_text", no_argument, NULL, 't' },{ "sideload", no_argument, NULL, 's' },{ "sideload_auto_reboot", no_argument, NULL, 'a' },{ "just_exit", no_argument, NULL, 'x' },{ "locale", required_argument, NULL, 'l' },{ "stages", required_argument, NULL, 'g' },{ "shutdown_after", no_argument, NULL, 'p' },{ "reason", required_argument, NULL, 'r' },{ NULL, 0, NULL, 0 },};..................intmain(int argc, char **argv) {....get_args(&argc, &argv); //提取cache/recovery/command中的信息....while ((arg = getopt_long(argc, argv, "", OPTIONS, NULL)) != -1) { //解析cache/recovery/command⽂件中的信息printf("***** xiaolei 2\n");switch (arg) {case 'i': send_intent = optarg; break;case 'u': update_package = optarg; break;case 'w': should_wipe_data = true; break;case 'c': should_wipe_cache = true; break;case 't': show_text = true; break;case 's': sideload = true; break;case 'a': sideload = true; sideload_auto_reboot = true; break;case 'x': just_exit = true; break;case 'l': locale = optarg; break;case 'g': {if (stage == NULL || *stage == '\0') {char buffer[20] = "1/";strncat(buffer, optarg, sizeof(buffer)-3);stage = strdup(buffer);}break;}case 'p': shutdown_after = true; break;case 'r': reason = optarg; break;case '?':LOGE("Invalid command argument\n");continue;}}}本⽂以installPackage为例:frameworks/base/core/java/android/os/RecoverySystem.javapublic static void installPackage(Context context, File packageFile)throws IOException {String filename = packageFile.getCanonicalPath(); //获取升级包路径String internalPath = Environment.maybeTranslateEmulatedPathToInternal(new File(filename)).getPath();FileWriter uncryptFile = new FileWriter(UNCRYPT_FILE);try {uncryptFile.write(internalPath + "\n");} finally {uncryptFile.close();}Log.w(TAG, " REBOOTING TO INSTALL " + filename + " ");Log.w(TAG, " REBOOTING TO INSTALL REALPATH " + internalPath + " ");// If the package is on the /data partition, write the block map file// If the package is on internal storage sdcard,write the block map file// into COMMAND_FILE instead.if (filename.startsWith("/data/") //加密处理,block.map是解密的映射⽂件||filename.startsWith("/storage/emulated/0/")) {filename = "@/cache/recovery/block.map";}final String filenameArg = "--update_package=" + filename; //把“--update_package=path” 通过bootCommand⽅法写⼊到cache/recovery/command⽂件中final String localeArg = "--locale=" + Locale.getDefault().toString(); //recovery显⽰语⾔bootCommand(context, filenameArg, localeArg);}installPackage⽅法会嗲⽤bootCommand()⽅法,此时参数为(context,向cache/recovery/command⽂件中写⼊的信息,语⾔信息)private static void bootCommand(Context context, String... args) throws IOException {RECOVERY_DIR.mkdirs(); // In case we need itCOMMAND_FILE.delete(); // In case it's not writableLOG_FILE.delete();FileWriter command = new FileWriter(COMMAND_FILE); //向/cache/recovery/command中写⼊--update_package=path try {for (String arg : args) {if (!TextUtils.isEmpty(arg)) {command.write(arg);command.write("\n");}}} finally {command.close();}// Having written the command file, go ahead and rebootPowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);pm.reboot(PowerManager.REBOOT_RECOVERY); //PowerManager.REBOOT_RECOVERY的值为字符串"recovery"throw new IOException("Reboot failed (no permissions?)");}pm.reboot(PowerManager.REBOOT_RECOVERY); 参数为字符串("recovery")frameworks/base/core/java/android/os/PowerMangager.javapublic void reboot(String reason) {try {mService.reboot(false, reason, true);} catch (RemoteException e) {}}mService.reboot(false, reason, true); 参数为(false,"recovery",true)frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javapublic void reboot(boolean confirm, String reason, boolean wait) {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);if (PowerManager.REBOOT_RECOVERY.equals(reason)) {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);}final long ident = Binder.clearCallingIdentity();try {shutdownOrRebootInternal(false, confirm, reason, wait);} finally {Binder.restoreCallingIdentity(ident);}}shutdownOrRebootInternal(false, confirm, reason, wait); 参数为(false,false,"recovery",true)frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javaprivate void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,final String reason, boolean wait) {if (mHandler == null || !mSystemReady) {throw new IllegalStateException("Too early to call shutdown() or reboot()");}Runnable runnable = new Runnable() {@Overridepublic void run() {synchronized (this) {if (shutdown) { //此处shutdown=falseShutdownThread.shutdown(mContext, confirm);} else {ShutdownThread.reboot(mContext, reason, confirm); //执⾏此处代码}}}};// ShutdownThread must run on a looper capable of displaying the UI.Message msg = Message.obtain(mHandler, runnable);msg.setAsynchronous(true);mHandler.sendMessage(msg);// PowerManager.reboot() is documented not to return so just wait for the inevitable.if (wait) {synchronized (runnable) {while (true) {try {runnable.wait();} catch (InterruptedException e) {}}}}}ShutdownThread.reboot(mContext, reason, confirm); 参数为(mContex,"recovery",false)此处开了⼀个线程处理rebootframeworks/base/services/core/java/com/android/server/power/ShutdownThread.javapublic static void reboot(final Context context, String reason, boolean confirm) { //⽅法中的变量为全局变量mReboot = true;mRebootSafeMode = false;mRebootUpdate = false;mRebootReason = reason;shutdownInner(context, confirm); //此⽅法是在⼿机界⾯上弹出⼀个确认框,是否重启,此处的代码不再追了}//程序⼀定会执⾏run()⽅法/***********************mReboot = true;mRebootSafeMode = false;mRebootUpdate = false;mRebootReason = "recovery";***********************/public void run() {BroadcastReceiver br = new BroadcastReceiver() {@Override public void onReceive(Context context, Intent intent) {// We don't allow apps to cancel this, so ignore the result.actionDone();}};/** Write a system property in case the system_server reboots before we* get to the actual hardware restart. If that happens, we'll retry at* the beginning of the SystemServer startup.*/{String reason = (mReboot ? "1" : "0") + (mRebootReason != null ? mRebootReason : ""); //reason的值为"recovery"SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); //设置系统属性sys.shutdown.requested = "recovery" }/** If we are rebooting into safe mode, write a system property* indicating so.*/if (mRebootSafeMode) {SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1");}Log.i(TAG, "Sending shutdown broadcast...");setBootValue("silent_mode",mAudioManager.isSilentMode() ? "1" : "0");if(checkAnimationFileExist() && mContext.getResources().getBoolean(com.android.internal.R.bool.feature_tctfw_shutdown_animation_on) &&!mRebootUpdate) {lockDevice();showShutdownAnimation();}// First send the high-level shut down broadcast.mActionDone = false;Intent intent = new Intent(Intent.ACTION_SHUTDOWN);intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);mContext.sendOrderedBroadcastAsUser(intent,UserHandle.ALL, null, br, mHandler, 0, null, null);final long endTime = SystemClock.elapsedRealtime() + MAX_BROADCAST_TIME;synchronized (mActionDoneSync) {while (!mActionDone) {long delay = endTime - SystemClock.elapsedRealtime();if (delay <= 0) {Log.w(TAG, "Shutdown broadcast timed out");break;} else if (mRebootUpdate) {int status = (int)((MAX_BROADCAST_TIME - delay) * 1.0 *BROADCAST_STOP_PERCENT / MAX_BROADCAST_TIME);sInstance.setRebootProgress(status, null);}try {mActionDoneSync.wait(Math.min(delay, PHONE_STATE_POLL_SLEEP_MSEC));} catch (InterruptedException e) {}}}if (mRebootUpdate) {sInstance.setRebootProgress(BROADCAST_STOP_PERCENT, null);}Log.i(TAG, "Shutting down activity manager...");final IActivityManager am =ActivityManagerNative.asInterface(ServiceManager.checkService("activity"));if (am != null) {try {am.shutdown(MAX_BROADCAST_TIME);} catch (RemoteException e) {}}if (mRebootUpdate) {sInstance.setRebootProgress(ACTIVITY_MANAGER_STOP_PERCENT, null);}Log.i(TAG, "Shutting down package manager...");final PackageManagerService pm = (PackageManagerService)ServiceManager.getService("package");if (pm != null) {pm.shutdown();}if (mRebootUpdate) {sInstance.setRebootProgress(PACKAGE_MANAGER_STOP_PERCENT, null);}// Shutdown radios.shutdownRadios(MAX_RADIO_WAIT_TIME);if (mRebootUpdate) {sInstance.setRebootProgress(RADIO_STOP_PERCENT, null);// Mod-by-yanxi.liu, for sdcard upgrade uncrypt, Defect-1357392if (mRebootUpdate) {sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null);// If it's to reboot to install update, invoke uncrypt via init service.uncrypt();}// Mod-by-yanxi.liu, for sdcard upgrade uncrypt, Defect-1357392// Shutdown MountService to ensure media is in a safe stateIMountShutdownObserver observer = new IMountShutdownObserver.Stub() {public void onShutDownComplete(int statusCode) throws RemoteException {Log.w(TAG, "Result code " + statusCode + " from MountService.shutdown");actionDone();}};Log.i(TAG, "Shutting down MountService");// Set initial variables and time out time.mActionDone = false;final long endShutTime = SystemClock.elapsedRealtime() + MAX_SHUTDOWN_WAIT_TIME;synchronized (mActionDoneSync) {try {final IMountService mount = IMountService.Stub.asInterface(ServiceManager.checkService("mount"));if (mount != null) {mount.shutdown(observer);} else {Log.w(TAG, "MountService unavailable for shutdown");}} catch (Exception e) {Log.e(TAG, "Exception during MountService shutdown", e);}while (!mActionDone) {long delay = endShutTime - SystemClock.elapsedRealtime();if (delay <= 0) {Log.w(TAG, "Shutdown wait timed out");break;} else if (mRebootUpdate) {int status = (int)((MAX_SHUTDOWN_WAIT_TIME - delay) * 1.0 *(MOUNT_SERVICE_STOP_PERCENT - RADIO_STOP_PERCENT) /MAX_SHUTDOWN_WAIT_TIME);status += RADIO_STOP_PERCENT;sInstance.setRebootProgress(status, null);}try {mActionDoneSync.wait(Math.min(delay, PHONE_STATE_POLL_SLEEP_MSEC));} catch (InterruptedException e) {}}}// add by feikuang for defect 1453123 startisVibrate = mContext.getResources().getBoolean(com.android.internal.R.bool.config_isVibrate); Log.i(TAG,"isVibrate " + isVibrate);// add by feikuang for defect 1453123 endwaitShutDownAnimationCompleted();rebootOrShutdown(mContext, mReboot, mRebootReason); //程序执⾏到这⾥}rebootOrShutdown(mContext, mReboot, mRebootReason); 参数为(mContext,true,"recovery") frameworks/base/services/core/java/com/android/server/power/ShutdownThread.javapublic static void rebootOrShutdown(final Context context, boolean reboot, String reason) {deviceRebootOrShutdown(reboot, reason);//[FEATURE]-Add-BEGIN by TSNJ.shu.wang,11/06/2015,TASK-871146String bootAlarms = SystemProperties.get("sys.boot.alarm");boolean isBootAlarms = bootAlarms != null && bootAlarms.equals("1");if (reboot) {Log.i(TAG, "Rebooting, reason: " + reason);PowerManagerService.lowLevelReboot(reason); //程序执⾏到这⾥Log.e(TAG, "Reboot failed, will attempt shutdown instead");} else if (SHUTDOWN_VIBRATE_MS > 0 && context != null && !isBootAlarms && isVibrate) { //[FEATURE]-Add-END by TSNJ.shu.wang,11/06/2015,TASK-871146// vibrate before shutting downVibrator vibrator = new SystemVibrator(context);try {vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES);} catch (Exception e) {// Failure to vibrate shouldn't interrupt shutdown. Just log it.Log.w(TAG, "Failed to vibrate during shutdown.", e);}// vibrator is asynchronous so we need to wait to avoid shutting down too soon.try {Thread.sleep(SHUTDOWN_VIBRATE_MS);} catch (InterruptedException unused) {}}// Shutdown powerLog.i(TAG, "Performing low-level shutdown...");PowerManagerService.lowLevelShutdown();}PowerManagerService.lowLevelReboot(reason); 参数为"recovery"frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javapublic static void lowLevelReboot(String reason) {if (reason == null) {reason = "";}if (reason.equals(PowerManager.REBOOT_RECOVERY)) {// If we are rebooting to go into recovery, instead of// setting sys.powerctl directly we'll start the// pre-recovery service which will do some preparation for// recovery and then reboot for us.SystemProperties.set("ctl.start", "pre-recovery"); //到这⾥可以知道,⼀个新的进程会被enable } else {SystemProperties.set("sys.powerctl", "reboot," + reason);try {Thread.sleep(20 * 1000L);} catch (InterruptedException e) {Thread.currentThread().interrupt();}Slog.wtf(TAG, "Unexpected return from lowLevelReboot!");}SystemProperties.set("ctl.start", "pre-recovery"); //到这⾥可以知道,⼀个新的进程会被enablesystem/core/rootdir/init.rcservice pre-recovery /system/bin/uncrypt --rebootclass maindisabledoneshotservice pre-recovery /system/bin/uncrypt --reboot system/bin/uncrypt 这个程序会被执⾏,传⼊的参数是--reboot uncrypt的源码位于bootable/recovery/uncrypt/uncrypt.cpp,下⾯对uncrypt进⾏分析bootable/recovery/uncrypt/uncrypt.cppint main(int argc, char** argv) { //此处argc为2 argv[1]="--reboot"const char* input_path;const char* map_file;if (argc != 3 && argc != 1 && (argc == 2 && strcmp(argv[1], "--reboot") != 0)) {fprintf(stderr, "usage: %s [--reboot] [<transform_path> <map_file>]\n", argv[0]);return 2;}// When uncrypt is started with "--reboot", it wipes misc and reboots.// Otherwise it uncrypts the package and writes the block map.if (argc == 2) { //程序执⾏到此处if (read_fstab() == NULL) {return 1;}wipe_misc(); //擦出misc分区内容reboot_to_recovery(); //重启到recovery} else {// The pipe has been created by the system server.int status_fd = open(status_file.c_str(), O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR);if (status_fd == -1) {ALOGE("failed to open pipe \"%s\": %s\n", status_file.c_str(), strerror(errno));return 1;}std::string package;if (argc == 3) {// when command-line args are given this binary is being used// for debugging.input_path = argv[1];map_file = argv[2];} else {if (!find_uncrypt_package(package)) {android::base::WriteStringToFd("-1\n", status_fd);close(status_fd);return 1;}input_path = package.c_str();map_file = cache_block_map.c_str();}int status = uncrypt(input_path, map_file, status_fd);if (status != 0) {android::base::WriteStringToFd("-1\n", status_fd);close(status_fd);return 1;}android::base::WriteStringToFd("100\n", status_fd);close(status_fd);}return 0;}reboot_to_recovery();bootable/recovery/uncrpty/uncrpty.cppstatic void reboot_to_recovery() {ALOGI("rebooting to recovery");property_set("sys.powerctl", "reboot,recovery");sleep(10);ALOGE("reboot didn't succeed?");}property_set("sys.powerctl", "reboot,recovery"); sys.powerctl属性出发开关在init.rc中system/core/rootdir/init.rcon property:sys.powerctl=*powerctl ${sys.powerctl}system/core/init/keywords.hKEYWORD(powerctl, COMMAND, 1, do_powerctlsystem/core/init/builtins.cppint do_powerctl(int nargs, char **args) //传⼊的参数为字符串"reboot,recovery"{char command[PROP_VALUE_MAX];int res;int len = 0;int cmd = 0;const char *reboot_target;res = expand_props(command, args[1], sizeof(command));if (res) {ERROR("powerctl: cannot expand '%s'\n", args[1]);return -EINVAL;}if (strncmp(command, "shutdown", 8) == 0) {cmd = ANDROID_RB_POWEROFF;len = 8;} else if (strncmp(command, "reboot", 6) == 0) { //程序⾛到这,cmd=ANDROID_RB_RESTART2cmd = ANDROID_RB_RESTART2;len = 6;ERROR("powerctl: unrecognized command '%s'\n", command);return -EINVAL;}if (command[len] == ',') {char prop_value[PROP_VALUE_MAX] = {0};reboot_target = &command[len + 1]; //设置reboot_target = recoveryif ((property_get("init.svc.recovery", prop_value) == 0) &&(strncmp(reboot_target, "keys", 4) == 0)) {ERROR("powerctl: permission denied\n");return -EINVAL;}} else if (command[len] == '\0') {reboot_target = "";} else {ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]);return -EINVAL;}return android_reboot(cmd, 0, reboot_target);}android_reboot(cmd, 0, reboot_target); 参数为(ANDROID_RB_RESTART2, 0, "recovery")system/core/libcutils/android_reboot.cint android_reboot(int cmd, int flags UNUSED, const char *arg){int ret;sync();remount_ro();switch (cmd) {case ANDROID_RB_RESTART:ret = reboot(RB_AUTOBOOT);break;case ANDROID_RB_POWEROFF:ret = reboot(RB_POWER_OFF);break;case ANDROID_RB_RESTART2: //程序跑到这⾥其中arg="recovery"ret = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, arg);break;default:ret = -1;}return ret;}ret = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, arg);kernel/include/uapi/asm-generic/unistd.h#define __NR_reboot 142__SYSCALL(__NR_reboot, sys_reboot)__NR_reboot被映射到sys_reboot上,会执⾏SYSCALL_DEFINE4(),为什么会这么执⾏还不清楚。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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/meminfonand 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在内的所有系统模块。
recoveryrecovery系统包含了内核和类似于根文件系统两部分,启动时仍采用init进程和init.rc配置脚本,不同的是init.rc脚本比较简单,system目录中只存放了一些必备的工具。
recovery系统下,你能更新除uboot之外的所有Android系统模块。
recovery模式下,只有一个recovery服务,该服务对应于recovery进程,源码位置:bootable\recovery。
main systemmain system是正常运行的Android系统。
通信Android板子每个时刻只可以处于bootloader、recovery、main system 其中的一个模式中,烧写过程中,三个模式之间需要通信,比如:main system通知recovery烧写那个升级包。
大致有三种方式可以用来通信:BCB、寄存器和cache分区。
BCBBCB (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 recoveryreboot命令实际上是系统调用,最终会调用到内核的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.jarbuild/target/product/security/testkey.pk8build/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.zipupdate_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。