Android ROM 刷机脚本 updater-script 的基本流程和初级语句说明

简单说说刷机脚本的相关知识

以及简单的语句说明

目的不是让你通过本帖学会如何做刷机脚本

,

那不是一下子可以做到的事情

.

 

但是至少可以通过本帖子

,

让你对刷机脚本有一个初步的了解

并且可以初步动手修改相对简单

的内容

例如制作升级包

 

以下说明

,

都以我的

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”);

 

复制代码

 

可能大家看了还是模模糊糊的

没关系

没有相关的知识

确实不容易一下子看明白

但是饭一

口口吃

知识也是一点点懂的

抛砖引玉

,

希望给与大家一点点帮助


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值