简单说说刷机脚本的相关知识
,
以及简单的语句说明
.
目的不是让你通过本帖学会如何做刷机脚本
,
那不是一下子可以做到的事情
.
但是至少可以通过本帖子
,
让你对刷机脚本有一个初步的了解
,
并且可以初步动手修改相对简单
的内容
,
例如制作升级包
.
以下说明
,
都以我的
Reflex S Data2Ext 2.0.2c
整包
ROM
为例子说明
,
把
update
的过程流程化
,
更加有助于理解
.
首先说明刷机脚本的路径
,
其实很多人
,
包括部分
ROM
作者
,
都不知道这个文件的存在
.
位于刷
机包的如下路径
:
1.
META-INF\com\google\
android
\updater-script
复制代码
刷机过程其实很简单
,
只要你理解了流程
,
和相关的语句
.
一般来说
,
刷机就是如下的步骤
:
1.
开始
.
2.
清理
userdata, system, cache, dalvik-cache
等
(
这是一个可选的步骤
,
由
ROM
作者依据
ROM
的特性去决定是否要采用
)
3.
挂载
userdata, system, sdext (
其中
sdext
为可选挂载
,
依据
ROM
特性决定
)
4.
释放对应的文件
/
文件夹到对应的区域
,
例如刷机包内的目录
data
对应的释放到
手机
的
userdata
区域
5.
Symlink,
这个是必须的动作
,
这个有问题
,
会导致
ROM
出现一些问题
,
特别是错误的链
接或者不存在的链接
,
很容易引发问题
.
6.
设置权限
,
这一个步骤也很重要
,
关系到
ROM
能否正常使用
, Android
是
base
在
linux
基
础上的
,
对于文件的权限非常重要
,
没有权限
,
一个应用程序是无法被执行或者读写的
.
7.
刷入内核引导文件
boot.img
8.
取消挂载的各个分区
,
刷机结束
.
复制代码
大概步骤就这样
,
这个过程非常明了和直接
,
下面我具体举例说明各个步骤的做法
.
1.
开始准备刷机
.
开始最简单
,
实际上就是就是检测硬件
,
打印相关信息
,
提示开始刷机
.
其中可能用到的部分函数做个简单介绍
:
ui_print:
就是在
recovery
下打印文字给用户阅览
.
getprop:
获取手机对应的属性
assert:
你可以理解为辅助执行多行脚本命令
例如如下我的部分开始代码
:
1.
ui_print(” “);
2.
assert(getprop(“ro.product.device”) == “bravo” || getprop(“ro.build.product”) ==
“bravo” || getprop(“ro.product.board”)
3.
== “bravo”)
;
4.
ui_print(“. Reflex S Data2Ext Installation .”);
5.
ui_print(” “);
6.
ui_print(“Installing Gingerbread 2.3.3 –
Sense 2.1…”);
7.
ui_print(” “);
复制代码
首先开始答应一行空行
,
编译和之前的文字区别开来
.
然后用
assert
完成对手机的产品设备型号的检测
最后打印
,
开始安装该
ROM.
2.
清理
这个过程是可选的
,
有的
rom
不需要
wipe
直接升级
,
就无需这个过程
,
有的
ROM
必须完全
wipe
才
可以刷机
,
否则会出问题
,
那么
rom
作者为了担心
你因为没有
wipe
而导致出了问题
,
就在脚本里面处理了
,
尽量帮助你避免产生问题
.
例如我这个
data2ext
的
ROM,
如果不
wipe,
会产生一些问题
,
例如
FC, UID
错误等
,
就必须
wipe,
但是为了不让用户的懒惰成为找我问问题的麻烦
,
我就主动帮他们
”wipe”
了所有必须
wipe
的内容
.
其中可能用到的部分函数做个简单介绍
:
fromat:
格式化相关区域的函数
delete_recursive:
可以直接删除一个目录
.
如下我的部分代码摘抄如下
:
1.
ui_print(” Clean up cache…”);
2.
format(“MTD”, “cache”);
3.
delete_recursive(“/data/dalvik
-
cache”);
4.
delete_recursive(“/sdext/dalvik
-
cache”);
复制代码
首先打印我要开始清理
cache
了
然后格式化
cache,
删除
userdata
下的
dalvik-cache,
删除
sd
卡
ext
分区的
dalvik-cache.
其实我这里代码还是有一些问题的
,
可能
sdext
都还没有挂载我就试图删除了
.
这个就属于脚本的
隐患
bug
了
.
3
挂载和
4
释放文件
,
我是按照区域来组合做的
,
如下分别是
userdata
的处理和
system
的处理
.
其中可能用到的部分函数做个简单介绍
:
umount/mount:
分别是取消挂载和挂载相关的区域函数
.
package_extract_dir:
你可以理解为复制刷机包内的指定目录到手机的指定区域
.
1.
ui_print(” Unpacking DATA files…”);
2.
unmount(“/data”);
3.
format(“MTD”, “userdata”);
4.
mount(“MTD”, “userdata”, “/data”);
5.
package_extract_dir(“data”, “/data”);
6.
ui_print(” Unpacking SYSTEM files…”);
7.
unmount(“/system”);
8.
format(“MTD”, “system”);
9.
mount(“MTD”, “system”, “/system”);
10.
package_extract_dir(“system”, “/system”);
复制代码
为了避免出问题
,
首先取消挂载
,
然后格式化该区域
,
然后再挂载
,
确保挂载没有问题
.
然后复制需要的文件
.
5
和
6
相比前面的一些内容
,
属于比较难懂一点的
,
需要有
linux
相关的知识
,
不再更多阐述
,
贴些
代码
,
简单说下
.
其中可能用上的部分函数介绍
:
symlink:
所谓的符号链接
,
当然
, windows
的用户不怎么容易了解
,
建议多熟悉下
Linux
相关内
容
.
set_perm_recursive:
你可以理解为设置目录权限
如下代码
,
连接
../xbin/su
到
/system/bin/su
这个程序
.
1.
ui_print(” Symlinking now…”);
2.
symlink(“../xbin/su”, “/system/bin/su”);
复制代码
如下代码
,
设置相关的权限
.
1.
ui_print(” Setup permissions now…”);
2.
set_perm_recursive(0, 0, 0755, 0644, “/system”);
3.
set_perm_recursive(0, 2000, 0755, 0755, “/system/bin”);
4.
set_perm_recursive(0, 2000, 0755, 0
755, “/system/app”);
复制代码
至于刷入内核引导文件
boot.img,
如下
,
用
assert
函数实现了
,
解压内核到临时区域
,
写入内核文件
,
删除临时文件的过程
.
1.
ui_print(” Writing Boot.img…”);
2.
assert(package_extract_file(“boot.img”, “/tmp/boot.img”),
write_raw_image(“/tmp/boot.img”, “boot”), delete(“/tmp/boot.img”));
复制代码
最后
,
结束
,
取消挂载所有区域
,
提示结束
.
如下代码
:
1.
ui_print(” “);
2.
ui_print(” Flash finished…Enjoy it!”);
3.
unmount(“/system”);
4.
unmount(“/data”);
复制代码
可能大家看了还是模模糊糊的
,
没关系
,
没有相关的知识
,
确实不容易一下子看明白
,
但是饭一
口口吃
,
知识也是一点点懂的
,
抛砖引玉
,
希望给与大家一点点帮助