android 底层怎么用shell获取系统ota如何升级金税盘底层是否成功状态

后使用快捷导航没有帐号?
查看: 7728|回复: 15
在线时间 小时
立即注册,加入爱黑武论坛的大家庭!爱黑武,爱上搞机生活!
才可以下载或查看,没有帐号?
你只需要打开一个PC端的手机辅助工具,比如:腾讯手机管家(应用宝),豌豆荚,等。让他们连接到手机,不要关闭这些软件。
这里提供一个豌豆荚,下载:
如果91手机助手不行,请卸载91手机助手,重启电脑,推荐用腾讯手机管家(应用宝),这个不会占用adb进程。
然后用adb shell命令来对手机进行操作即可。
爱黑武,爱上搞机生活!
在线时间 小时
貌似还是不行啊,今天RP不行,失败啊
爱黑武,爱上搞机生活!
在线时间 小时
今天人品爆发,一次完成,轻松
爱黑武,爱上搞机生活!
在线时间 小时
太好了,找到了
爱黑武,爱上搞机生活!
在线时间 小时
fd,kghjdbfjgbkdjsb
爱黑武,爱上搞机生活!
在线时间 小时
这个是因为你的adb 版本太旧了,不支持设备认证,新版的adb在连接的时候手机上会有一个RSA的认证
爱黑武,爱上搞机生活!
在线时间 小时
这问题的本质原因是你的adb版本太低了,不支持4.4的系统,新版的adb 有RSA验证的,你PC端adb shell,手机上就会有一个框跳出来提示你是否接受连接. 自己去找一个最新的adb就可以了,churchmice.tk/adb.zip
这个才是正解!谢谢!&
爱黑武,爱上搞机生活!
在线时间 小时
爱黑武,爱上搞机生活!
爱黑武,爱上搞机生活!
在线时间 小时
看看能不能起作用
爱黑武,爱上搞机生活!
在线时间 小时
请问 如何使用adb shell命令来对手机进行操作即可
爱黑武,爱上搞机生活!
站长推荐 /1
最新手机新闻资讯尽在爱黑武!爱黑武,为了我们共同的热爱而热爱。
Powered by Discuz &
湘ICP备号 | 京公网安备号Android编译(18)
Android OTA&升级之三:生成recovery.img
作者: 宋立新
&&&&&&&得到了ota升级包后,我们就可以用它来升级系统了。Android&手机开机后,会先运行&bootloader。&Bootloader&会根据某些判定条件(比如按某个特殊键)决定是否进入&recovery&模式。Recovery&模式会装载&recovery&分区,&该分区包含recovery.img。recovery.img&包含了标准内核(和boot.img中的内核相同)以及recovery&根文件系统。下面我们看一下它是如何生成的。
recovery.img生成过程
L630-L637&依赖关系
(From: build/core/Makefile)
$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) /
&&&&&&&&&&&&&&&& $(INSTALLED_RAMDISK_TARGET) /
&&&&&&&&&&&&&&&& $(INSTALLED_BOOTIMAGE_TARGET) /
&&&&&&&&&&&&&&&& $(recovery_binary) /
&&&&&&&&&&&&&&&& $(recovery_initrc) $(recovery_kernel) /
&&&&&&&&&&&&&&&& $(INSTALLED_2NDBOOTLOADER_TARGET) /
&&&&&&&&&&&&&&&& $(recovery_build_prop) $(recovery_resource_deps) /
&&&&&&&&&&&&&&&& $(RECOVERY_INSTALL_OTA_KEYS)
INSTALLED_RECOVERYIMAGE_TARGET&为我们的编译目标:
INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
它依赖很多其它目标:
1.MKBOOTFS, MINIGZIP, MKBOOTIMG,PC端工具软件:
(From build/core/config.mk)
MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)
MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
2.INSTALLED_RAMDISK_TARGET,标准根文件系统&ramdisk.img:
BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
# We just build this directly to the install location.
INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
3.INSTALLED_BOOTIMAGE_TARGET, 即boot.img,标准内核及标准根文件系统:
INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
4. recovery_binary, Recovery可执行程序,源码位于:bootable/recovery
recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery
5. recovery_initrc,recovery模式的init.rc,&位于&bootable/recovery/etc/init.rc
recovery_initrc := $(call include-path-for, recovery)/etc/init.rc
6. recovery_kernel, recovery&模式的kernel,&同标准内核
recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system
7.INSTALLED_2NDBOOTLOADER_TARGET,我们不用。
8. recovery_build_prop, recovery 模式的build.prop, 同标准模式。
recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
9. recovery_resource_deps,&recovery&模式使用的res,&位于:recovery/custom/{product_name}/res,&以及设备自定义部分(我们没用到)
recovery_resources_common := $(call include-path-for, recovery)/custom/$(TARGET_PRODUCT)/res
recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res))
recovery_resource_deps := $(shell find $(recovery_resources_common)
&& $(recovery_resources_private) -type f)
10.&&RECOVERY_INSTALL_OTA_KEYS, ota&密钥:
# Generate a file containing the keys that will be read by the
# recovery binary.
RECOVERY_INSTALL_OTA_KEYS := /
&&&&&&&& $(call intermediates-dir-for,PACKAGING,ota_keys)/keys
L638-L655&准备内容
&&&&&&&& @echo ----- Making recovery image ------
&&&&&&&& rm -rf $(TARGET_RECOVERY_OUT)
&&&&&&&& mkdir -p $(TARGET_RECOVERY_OUT)
&&&&&&&& mkdir -p $(TARGET_RECOVERY_ROOT_OUT)
&&&&&&&& mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc
&&&&&&&& mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/tmp
准备recovery目录:out/target/product/{product_name}/recovery&及其子目录:
./root/etc
./root/tmp
&&&&&&&& echo Copying baseline ramdisk...
&&&&&&&& cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)
&&&&&&&& echo Modifying ramdisk contents...
&&&&&&&& rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res
从标准根文件系统拷贝所有文件,&删除其res&目录。
&&&&&&&& cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/
&&&&&&&& cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/
拷贝recovery 模式的核心文件 init.rc 及 recovery
&&&&&&&& cp -rf $(recovery_resources_common) $(TARGET_RECOVERY_ROOT_OUT)/
&&&&&&&& $(foreach item,$(recovery_resources_private), /
&&&&&&&&&& cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/)
&&&&&&&& cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys
拷贝资源文件及密钥文件。
&&&&&&&& cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) /
&&&&&&&&&&&&&&&& & $(TARGET_RECOVERY_ROOT_OUT)/default.prop
生成属性文件 default.prop, 它包含了标准根文件系统的default.prop (out/target/product/{product_name}/root/default.prop)以及system分区的build.prop (out/target/product/{product_name}/system/build.prop)
L656-L661&最终生成recovery.img
&&&&&&&& $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) & $(recovery_ramdisk)
压缩recovery根文件系统
&&&&&&&& build/quacomm/mkimage $(PRODUCT_OUT)/ramdisk-recovery.img RECOVERY & $(PRODUCT_OUT)/ramdisk_recovery.img
加一个标识头(RECOVERY)
&&&&&&&& mv $(PRODUCT_OUT)/ramdisk_recovery.img $(PRODUCT_OUT)/ramdisk-recovery.img
&&&&&&&& $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) --output $@
&&&&&&&& @echo ----- Made recovery image -------- $@
&&&&&&&& $(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE),raw)
和内核一起,生成recovery.img
附:Recovery&根文件系统目录结构
├──&advanced_meta_init.rc
├──&data
├──&default.prop
├──&dev
├──&etc
├──&init
├──&init.factory.rc
├──&init.goldfish.rc
├──&init.quacomm.rc
├──&init.rc
├──&meta_init.rc
├──&proc
├──&res
│&&&├──&images
│&&&│&&&├──&icon_error.png
│&&&│&&&├──&icon_installing.png
│&&&│&&&├──&indeterminate1.png
│&&&│&&&├──&indeterminate2.png
│&&&│&&&├──&indeterminate3.png
│&&&│&&&├──&indeterminate4.png
│&&&│&&&├──&indeterminate5.png
│&&&│&&&├──&indeterminate6.png
│&&&│&&&├──&progress_empty.png
│&&&│&&&└──&progress_fill.png
│&&&└──&keys
├──&sbin
│&&&├──&adbd
│&&&├──&advanced_meta_init
│&&&├──&meta_init
│&&&├──&meta_tst
│&&&└──&recovery
├──&sys
├──&system
└──&tmp
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1283950次
积分:17573
积分:17573
排名:第338名
原创:388篇
转载:455篇
评论:472条
阅读:2335
文章:87篇
阅读:180049
(20)(22)(20)(13)(26)(22)(8)(11)(13)(28)(1)(10)(25)(9)(4)(7)(1)(13)(28)(16)(36)(18)(11)(39)(28)(19)(23)(12)(6)(14)(5)(16)(9)(9)(5)(14)(14)(14)(7)(1)(7)(1)(9)(7)(5)(3)(8)(24)(9)(5)(7)(4)(4)(5)(3)(4)(5)(6)(4)(5)(8)(7)(4)(3)(13)(8)(10)(15)(15)(40)
<a eoe="" android2184人阅读
Android(21)
Programming(17)
1 mkbootfs
mkbootfs的源代码在system/core/cpio中。
mkbootfs -f boot_filesystem_config.txt targetfiles/BOOT/RAMDISK | minigzip & ramdisk.img
2 mkbootimg
mkbootimg的源代码在system/core/mkbootimg中。
mkbootimg --kernel kernel --ramdisk ramdisk.img --output /tmp/boot.img
3 minigzip
minigzip的源代码在external/zlib中。
4 fs_config
源码位于:build/tools/fs_config。
其中的fs_config.c包含了system/core/include/private/android_filesystem_config.h,真正权限配置和fs_config的实现都在这个头文件中。
static const struct fs_path_config android_dirs[] = {
{ 00770, AID_SYSTEM, AID_CACHE, 0, &cache& },
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, &data/app& },
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, &data/app-private& },
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, &data/dalvik-cache& },
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, &data/data& },
{ 00771, AID_SHELL, AID_SHELL, 0, &data/local/tmp& },
{ 00771, AID_SHELL, AID_SHELL, 0, &data/local& },
{ 01771, AID_SYSTEM, AID_MISC, 0, &data/misc& },
{ 00770, AID_DHCP, AID_DHCP, 0, &data/misc/dhcp& },
{ 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, &data/media& },
{ 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, &data/media/Music& },
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, &data& },
{ 00750, AID_ROOT, AID_SHELL, 0, &sbin& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/bin& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/vendor& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/xbin& },
{ 00755, AID_ROOT, AID_ROOT, 0, &system/etc/ppp& },
{ 00755, AID_ROOT, AID_SHELL, 0, &vendor& },
{ 00777, AID_ROOT, AID_ROOT, 0, &sdcard& },
{ 00755, AID_ROOT, AID_ROOT, 0, 0 },
static const struct fs_path_config android_files[] = {
{ 00440, AID_ROOT, AID_SHELL, 0, &system/etc/init.goldfish.rc& },
{ 00550, AID_ROOT, AID_SHELL, 0, &system/etc/init.goldfish.sh& },
{ 00440, AID_ROOT, AID_SHELL, 0, &system/etc/init.trout.rc& },
{ 00550, AID_ROOT, AID_SHELL, 0, &system/etc/init.ril& },
{ 00550, AID_ROOT, AID_SHELL, 0, &system/etc/init.testmenu& },
{ 00550, AID_DHCP, AID_SHELL, 0, &system/etc/dhcpcd/dhcpcd-run-hooks& },
{ 00444, AID_RADIO, AID_AUDIO, 0, &system/etc/AudioPara4.csv& },
{ 00555, AID_ROOT, AID_ROOT, 0, &system/etc/ppp/*& },
{ 00555, AID_ROOT, AID_ROOT, 0, &system/etc/rc.*& },
{ 00644, AID_SYSTEM, AID_SYSTEM, 0, &data/app/*& },
{ 00644, AID_MEDIA_RW, AID_MEDIA_RW, 0, &data/media/*& },
{ 00644, AID_SYSTEM, AID_SYSTEM, 0, &data/app-private/*& },
{ 00644, AID_APP, AID_APP, 0, &data/data/*& },
{ 00755, AID_ROOT, AID_ROOT, 0, &system/bin/ping& },
/* the following file is INTENTIONALLY set-gid and not set-uid.
* Do not change. */
{ 02750, AID_ROOT, AID_INET, 0, &system/bin/netcfg& },
/* the following five files are INTENTIONALLY set-uid, but they
* are NOT included on user builds. */
{ 06755, AID_ROOT, AID_ROOT, 0, &system/xbin/su& },
{ 06755, AID_ROOT, AID_ROOT, 0, &system/xbin/librank& },
{ 06755, AID_ROOT, AID_ROOT, 0, &system/xbin/procrank& },
{ 06755, AID_ROOT, AID_ROOT, 0, &system/xbin/procmem& },
{ 06755, AID_ROOT, AID_ROOT, 0, &system/xbin/tcpdump& },
{ 04770, AID_ROOT, AID_RADIO, 0, &system/bin/pppd-ril& },
/* the following files have enhanced capabilities and ARE included in user builds. */
{ 00750, AID_ROOT, AID_SHELL, (1 && CAP_SETUID) | (1 && CAP_SETGID), &system/bin/run-as& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/bin/*& },
{ 00755, AID_ROOT, AID_ROOT, 0, &system/lib/valgrind/*& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/xbin/*& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/xbin/*& },
{ 00755, AID_ROOT, AID_SHELL, 0, &system/vendor/bin/*& },
{ 00755, AID_ROOT, AID_SHELL, 0, &vendor/bin/*& },
{ 00750, AID_ROOT, AID_SHELL, 0, &sbin/*& },
{ 00755, AID_ROOT, AID_ROOT, 0, &bin/*& },
{ 00750, AID_ROOT, AID_SHELL, 0, &init*& },
{ 00750, AID_ROOT, AID_SHELL, 0, &charger*& },
{ 00750, AID_ROOT, AID_SHELL, 0, &sbin/fs_mgr& },
{ 00640, AID_ROOT, AID_SHELL, 0, &fstab.*& },
{ 00644, AID_ROOT, AID_ROOT, 0, 0 },
工具imgdiff的源码位于:recovery/applypatch。对应的应用补丁的工具为imgpatch。imgdiff用来处理*.gz,*.zip,*.apk,*.jar,*.img。
imgpatch以及下面的bspatch都存在于applypatch工具中。与官方的bspatch在输入输出以及错误处理上有一些不同。根据diff文件的开头几个字节可以判断应该使用哪个补丁工具。开头为“BSDIFF40”的用bspatch处理,开头为“IMGDIFF2”用imgpatch处理。
工具bsdiff的源码位于:external/bsdiff。对应的应用补丁的工具为bspatch。bsdiff能够更高效地处理可执行文件。
signapk的源码位于:build/tools/signapk。
使用方法:
signapk.jar -w &公钥& &私钥& &输入文件& &输出文件&
其中:-w表示对整个文件进行签名。
签名算法:
1. 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。
2. 如果-w整包签,则将 证书.x509.pem 复制到 META-INF/com/android/otacert;
并在manifest对象中增加META-INF/com/android/otacert的SHA1摘要
3. 之后将生成的签名写入MANIFEST.MF文件。
4. 对前一步生成的Manifest,使用SHA1-RSA算法,用私钥进行签名。
5. 在CERT.RSA文件中保存公钥、所采用的加密算法等信息。
签名后,apk(zip)文件中多了下列文件
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:219171次
积分:3270
积分:3270
排名:第7233名
原创:97篇
转载:26篇
评论:34条
(13)(6)(1)(4)(1)(3)(2)(14)(2)(3)(2)(1)(4)(18)(14)(6)(1)(13)(2)(13)(1)Android OTA 的功能实现和修改_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android OTA 的功能实现和修改
来源:Linux社区&
作者:lhc180
OTA空中升级的文档不少。但是多是介绍原理的和分析代码的。原理我就不说了。这里记录一下我在项目中实现的工作,和问题总结。
工作流程:
650) this.width=650;">
update.xml文件放在服务器上,当客户端请求的参数正确时,返回相应的信息。
update.xml的内容,根据需要可以添加;Md5需要校验下载后包的完整性。updatepath为实际的下载地址
至少需要如下字段:
&ver&android3.2&/ver&
&md5&xxx&/md5&
&updatepath&http://xxxx/update.zip&/updatepath&
下面是我们工作用到的一个配置文件。
&&xsi:noNamespaceSchemaLocation="firmware.xsd"&-&&1&firmware&name&&简体中文描述&繁體中文描述&firmware&release&Description&c61ce360a734c018685fbf5e1662c0fd&16787&3&1&http://123.123.123.123/firmware/update.zip&&&
下载方法可以自己用socket,3.2版本后也可以用downloadmanager,用downloadmanager支持断点续传。
下载后一定要放在/sdcard/update.zip 文件。
OTA的功能实现可以单独做一个APK,也可以作为一个service放入系统中。
相关资讯 & & &
& (03/23/:55)
& (02/17/:44)
& (02/17/:53)
& (02/17/:45)
& (02/17/:52)
& (02/17/:45)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款4911人阅读
Android(56)
目前update-script脚本&#26684;式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制。
一、update-script脚本语法简介:
& & & & 我们顺着所生成的脚本来看其中主要涉及的语法。
& & & & 1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本。
& & & & 2.show_progress(frac,sec):frac表示进度完成的数&#20540;,sec表示整个过程的总秒数。主要用与显示UI上的进度条。
& & & & 3.format(fs_type,partition_type,location):fs_type,文件系统类型,取&#20540;一般为“yaffs2”或“ext4”。Partition_type,分区类型,一般取&#20540;为“MTD”或则“EMMC”。主要用于&#26684;式化为指定的文件系统。事例如下:format(”yaffs2”,”MTD”,”system”)。
& & & & 4.mount(fs_type,partition_type,location,mount_point):前两个参数同上,location要挂载的设备,mount_point挂载点。作用:挂载一个文件系统到指定的挂载点。
& & & & 5.package_extract_dir(src_path,destination_path):src_path,要提取的目录,destination_path目标目录。作用:从升级包内,提取目录到指定的位置。示例:package_extract_dir(“system”,”/system”)。
& & & & 6.symlink(target,src1,src2,……,srcN):target,字符串类型,是符号连接的目标。SrcX代表要创建的符号连接的目标点。示例:symlink(“toolbox”,”/system/bin/ps”),建立指向toolbox符号连接/system/bin/ps,&#20540;得注意的是,在建立新的符号连接之前,要断开已经存在的符号连接。
& & & & 7.set_perm(uid,gid,mode,file1,file2,……,fileN):作用是设置单个文件或则一系列文件的权限,最少要指定一个文件。
& & & & 8.set_perm_recursive(uid,gid,mode,dir1,dir2,……,dirN):作用同上,但是这里同时改变的是一个或多个目录及其文件的权限。
& & & & 9.package_extract_file(srcfile_path,desfile_paht):srcfile_path,要提取的文件,desfile_path,提取文件的目标位置。示例:package_extract_file(“boot.img”,”/tmp/boot.img”)将升级包中的boot.img文件拷贝到内存文件系统的/tmp下。
& & & 10.write_raw_image(src-image,partition):src-image源镜像文件,partition,目标分区。作用:将镜像写入目标分区。示例:write_raw_image(“/tmp/boot.img”,”boot”)将boot.img镜像写入到系统的boot分区。
& & & 11.getprop(key):通过指定key的&#20540;来获取对应的属性信息。示例:getprop(“ro.product.device”)获取ro.product.device的属性&#20540;。
&&&& 12. ui_print(String): 用于在Flash Mode要显示的内容
&&&& 13. delete(FilePath): 用于删除文件的命令
&&&& 14. run_program(Shell, ScriptPath): 例如:run_program(&/sbin/sh&, &/system/bin/install.sh&);
&&&& 15. umount(Path): 卸载文件系统
&&&& 16. cmdlist:
is_mounted
show_progress
set_progress
delete_recursive
package_extract_dir
package_extract_file
retouch_binaries
undo_retouch_binaries
set_perm_recursive
file_getprop
write_raw_image
apply_patch
apply_patch_check
apply_patch_space
sha1_check
wipe_cache
run_program
set_bootloader_env
二、updater-script脚本执行流程分析:
& & & & & 先看一下在测试过程中用命令make otapackage生成的升级脚本如下:
assert(!less_than_int(, getprop(&ro.build.date.utc&)));
assert(getprop(&ro.product.device&) == &tcc8800& ||
getprop(&ro.build.product&) == &tcc8800&);
show_progress(0.);
format(&yaffs2&, &MTD&, &system&);
mount(&yaffs2&, &MTD&, &system&, &/system&);
package_extract_dir(&recovery&, &/system&);
package_extract_dir(&system&, &/system&);
symlink(&busybox&, &/system/bin/cp&, &/system/bin/grep&,
&/system/bin/tar&, &/system/bin/unzip&,
&/system/bin/vi&);
symlink(&toolbox&, &/system/bin/cat&, &/system/bin/chmod&,
&/system/bin/chown&, &/system/bin/cmp&, &/system/bin/date&,
&/system/bin/dd&, &/system/bin/df&, &/system/bin/dmesg&,
&/system/bin/getevent&, &/system/bin/getprop&, &/system/bin/hd&,
&/system/bin/id&, &/system/bin/ifconfig&, &/system/bin/iftop&,
&/system/bin/insmod&, &/system/bin/ioctl&, &/system/bin/ionice&,
&/system/bin/kill&, &/system/bin/ln&, &/system/bin/log&,
&/system/bin/ls&, &/system/bin/lsmod&, &/system/bin/lsof&,
&/system/bin/mkdir&, &/system/bin/mount&, &/system/bin/mv&,
&/system/bin/nandread&, &/system/bin/netstat&,
&/system/bin/newfs_msdos&, &/system/bin/notify&, &/system/bin/printenv&,
&/system/bin/ps&, &/system/bin/reboot&, &/system/bin/renice&,
&/system/bin/rm&, &/system/bin/rmdir&, &/system/bin/rmmod&,
&/system/bin/route&, &/system/bin/schedtop&, &/system/bin/sendevent&,
&/system/bin/setconsole&, &/system/bin/setprop&, &/system/bin/sleep&,
&/system/bin/smd&, &/system/bin/start&, &/system/bin/stop&,
&/system/bin/sync&, &/system/bin/top&, &/system/bin/umount&,
&/system/bin/uptime&, &/system/bin/vmstat&, &/system/bin/watchprops&,
&/system/bin/wipe&);
set_perm_recursive(0, 0, , &/system&);
set_perm_recursive(0, , 0755, &/system/bin&);
set_perm(0, , &/system/bin/netcfg&);
set_perm(0, , &/system/bin/ping&);
set_perm(0, , &/system/bin/run-as&);
set_perm_recursive(, , &/system/etc/bluetooth&);
set_perm(0, 0, 0755, &/system/etc/bluetooth&);
set_perm(, 0640, &/system/etc/bluetooth/auto_pairing.conf&);
set_perm(, 0444, &/system/etc/bluetooth/blacklist.conf&);
set_perm(, 0440, &/system/etc/dbus.conf&);
set_perm(, 0550, &/system/etc/dhcpcd/dhcpcd-run-hooks&);
set_perm(0, , &/system/etc/init.goldfish.sh&);
set_perm(0, 0, 0544, &/system/etc/install-recovery.sh&);
set_perm_recursive(0, 0, , &/system/etc/ppp&);
set_perm_recursive(0, , 0755, &/system/xbin&);
set_perm(0, 0, 06755, &/system/xbin/librank&);
set_perm(0, 0, 06755, &/system/xbin/procmem&);
set_perm(0, 0, 06755, &/system/xbin/procrank&);
set_perm(0, 0, 06755, &/system/xbin/su&);
set_perm(0, 0, 06755, &/system/xbin/tcpdump&);
show_progress(0.);
show_progress(0.);
assert(package_extract_file(&boot.img&, &/tmp/boot.img&),
write_raw_image(&/tmp/boot.img&, &boot&),
delete(&/tmp/boot.img&));
show_progress(0.);
unmount(&/system&);
& & & & & 下面分析下这个脚本的执行过程:
& & & & &①比较时间戳:如果升级包较旧则终止脚本的执行。
& & & & &②匹配设备信息:如果和当前的设备信息不一致,则停止脚本的执行。
& & & & &③显示进度条:如果以上两步匹配则开始显示升级进度条。
& & & & &④&#26684;式化system分区并挂载。
& & & & &⑤提取包中的recovery以及system目录下的内容到系统的/system下。
& & & & &⑥为/system/bin/下的命令文件建立符号连接。
& & & & &⑦设置/system/下目录以及文件的属性。
& & & & &⑧将包中的boot.img提取到/tmp/boot.img。
& & & & &⑨将/tmp/boot.img镜像文件写入到boot分区。
& & & & &⑩完成后卸载/system。
& & & & &以上就是updater-script脚本中的语法,及其执行的具体过程。通过分析其执行流程,我们可以发现在执行过程中,并未将升级包另外解压到一个地方,而是需要什么提取什么。&#20540;得主要的是在提取recovery和system目录中的内容时,一并放在了/system/下。在操作的过程中,并未删除或改变update.zip包中的任何内容。在实际的更新完成后,我们的update.zip包确实还存在于原来的位置。
& & & & 以上的九篇着重分析了Android系统中Recovery模式中的一种,即我们做好的update.zip包在系统更新时所走过的流程。其核心部分就是Recovery服务的工作原理。其他两种FACTORY RESET、ENCRYPTED FILE SYSTEM ENABLE/DISABLE与OTA INSTALL是相通的。重点是要理解Recovery服务的工作原理。另外详细分析其升级过程,对于我们在实际升级时,可以根据我们的需要做出相应的修改。
& & & & &不足之处,请大家不吝指正!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:659182次
积分:8089
积分:8089
排名:第1670名
原创:165篇
转载:82篇
评论:72条
(1)(1)(1)(1)(1)(1)(1)(1)(2)(1)(4)(3)(5)(5)(7)(1)(1)(3)(3)(3)(9)(6)(2)(1)(1)(3)(4)(4)(2)(2)(3)(4)(6)(8)(5)(1)(13)(12)(33)(13)(1)(2)(3)(5)(6)(1)(2)(3)(7)(5)(7)(11)(1)(13)(8)

我要回帖

更多关于 android ota升级流程 的文章

 

随机推荐