首页 > 编程知识 正文

android如何升级版本,安卓系统制作教程

时间:2023-05-04 16:38:02 阅读:61359 作者:4217

(一)安卓升级包介绍:

OTA (OTA )升级是Android提供的标准升级方法。 其原理是在OTAPackage中创建需要升级的部分,用户手动或通过网络下载后,在恢复模式下运行Package中的升级脚本,并筛选需要升级的文件

OTAPackage可以是完整升级包或增量升级包。 完整升级包包含所有系统文件和images,但增量升级包只包含与指定版本不同的部分。 其中不同的部分将更新为patch文件。

OTApackage是zip格式的压缩包,下表显示了升级包的配置示例。

update.zip

|--boot.img

|--标识. img

|--META-INF

||--CERT.RSA

||--CERT.SF

||--com

|||--android

||| `--元数据

||`--谷歌

||`--android

|||--update-zjdygary

||`--更新器-脚本

|`--MANIFEST.MF

|--元

`--系统

`-APP

`--xxx.apk

主要组成部分包括:

(1)更新器脚本是升级脚本。 在恢复模式下,执行此脚本中的语句以完成指定的操作。 update-zjdygary是从bootablerecoveryupdater中的代码编译的升级程序,用于分析和运行升级脚本。

)2) CERT.RSA、CERT.SF、MANIFEST.MF是签名的验证文件,Android系统在进行升级包验证时需要。

)3)其他部分,如boot.img、logo.img、system等是需要具体升级的内容。 其中,recovery部分通过patch方式进行了更新。

综上所述,OTA包的核心是updater-script。

2 )手动创建升级包

也可以手动创建升级包。 按规定格式打包签名就可以了。 具体步骤如下。

(1)准备升级所需的文件和脚本,按照规定的目录结构创建并保存。 假设需要更新/system/app中的apk,则目录结构应该如下所示:

|--META-INF

|`--com

| `--谷歌

|`--android

||--update-zjdygary

| `--更新器-脚本

`--系统

`-APP

`--xxx.apk

如上所述,update-zjdygary是从可引导/恢复/更新器/编译的,out/target/product/god box/system/zjdyg /更新器

)2)将上述文件打包到update.zip中。 指令大致如下。

zip-r update.zip meta-INF系统……

)3)在升级包中添加签名。 命令如下:

jvajarout/host/Linux-x86/framework/sign apk.jar-w build/target/product/security/test key.x509.pembubuu

这里的签名工具和安全证书是Android附带的示例,您可以修改命令以指定自己的证书。

)4)生成的update_signed.zip是必需的升级包。

三、定制升级脚本

升级脚本update-script是纯文本文件,必须按照Android中规定的语法规则编写。 以下是一个示例:

set_progress('1);

sh

ow_progress("1","100");

ui_print("update fastboot......");

package_extract_file("fastboot.zjdyg", "/dev/block/platform/hi_mci.1/by-name/fastboot");

ui_print("update baseparam......");

package_extract_file("baseparam.img", "/dev/block/platform/hi_mci.1/by-name/baseparam");

ui_print("update recovery......");

package_extract_file("recovery.img", "/dev/block/platform/hi_mci.1/by-name/recovery");

ui_print("update logo......");

package_extract_file("logo.img", "/dev/block/platform/hi_mci.1/by-name/logo");

ui_print("update boot......");

package_extract_file("boot.img", "/dev/block/platform/hi_mci.1/by-name/kernel");

ui_print("update system......");

format("ext4", "EMMC", "/dev/block/platform/hi_mci.1/by-name/system", "0", "/system");

mount("ext4", "EMMC", "/dev/block/platform/hi_mci.1/by-name/system", "/system");

package_extract_dir("system", "/system");

symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");

symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");

symlink("mksh", "/system/zjdyg/sh");

symlink("toolbox", "/system/zjdyg/cat", "/system/zjdyg/chmod",

        "/system/zjdyg/chown", "/system/zjdyg/cmp", "/system/zjdyg/cp",

        "/system/zjdyg/date", "/system/zjdyg/dd", "/system/zjdyg/df",

        "/system/zjdyg/dmesg", "/system/zjdyg/du", "/system/zjdyg/getevent",

        "/system/zjdyg/getprop", "/system/zjdyg/grep", "/system/zjdyg/hd",

        "/system/zjdyg/id", "/system/zjdyg/ifconfig", "/system/zjdyg/iftop",

        "/system/zjdyg/insmod", "/system/zjdyg/ioctl", "/system/zjdyg/ionice",

        "/system/zjdyg/kill", "/system/zjdyg/ln", "/system/zjdyg/log",

        "/system/zjdyg/ls", "/system/zjdyg/lsmod", "/system/zjdyg/lsof",

        "/system/zjdyg/md5", "/system/zjdyg/mkdir", "/system/zjdyg/mount",

        "/system/zjdyg/mv", "/system/zjdyg/nandread", "/system/zjdyg/netstat",

        "/system/zjdyg/newfs_msdos", "/system/zjdyg/notify", "/system/zjdyg/printenv",

        "/system/zjdyg/ps", "/system/zjdyg/r", "/system/zjdyg/reboot",

        "/system/zjdyg/renice", "/system/zjdyg/rm", "/system/zjdyg/rmdir",

        "/system/zjdyg/rmmod", "/system/zjdyg/route", "/system/zjdyg/schedtop",

        "/system/zjdyg/sendevent", "/system/zjdyg/setconsole",

        "/system/zjdyg/setprop", "/system/zjdyg/sleep", "/system/zjdyg/smd",

        "/system/zjdyg/start", "/system/zjdyg/stop", "/system/zjdyg/sync",

        "/system/zjdyg/top", "/system/zjdyg/touch", "/system/zjdyg/umount",

        "/system/zjdyg/uptime", "/system/zjdyg/vmstat", "/system/zjdyg/watchprops",

        "/system/zjdyg/wipe");

set_perm_recursive(0, 2000, 0755, 0755, "/system/zjdyg");

set_perm_recursive(0, 2000, 0755, 0755, "/system/xzjdyg");

set_perm_recursive(0, 2000, 0755, 0755, "/system/etc");

unmount("/system");

ui_print("update ok ...");

升级脚本的生成根据升级包的制程也作过分两种情况,自动和手动。


3.1 自动生成升级脚本

         自动模式下,执行ota_from_target_files时,制作升级包的函数会调用edify_generator.py脚本里的函数去自动编写updater-script。而edify_generator.py里的函数和updater-

script的语法规则是一一对应的。例如:Mount函数对应于mount(fs_type, partition_type, location, mount_point);Print函数对应于ui_print (“str”);

         如果想定制updater-script,只需要修改ota_from_target_files(ota_from_target_files1)里自动编写脚本的那些代码,具体见WriteFullOTAPackage 或

WriteIncrementalOTAPackage里的script类,这两个方法分别为制作作全量包和差分包使用。


3.2 手动定制化升级脚本

    手动模式就需要客户自行编写updater-script。由于是纯文本文件,所以可以用任意的文本编辑器去编写,只需要遵照Android里规定好的语法规则即可。在ICS里,updater-

script的编写使用的是被称为Edify的一套语法规则,其支持的指令见下表(只列举部分):

   

序号

命令

功能说明

1

mount(fs_type, partition_type, location, mount_point)

挂载指定的分区或设备

2

unmount (mount_point)

卸载指定的分区或设备

3

format(fs_type, partition_type, location, fs_size)

格式化指定的分区

4

show_progress (fraction, duration)

进度显示

5

set_progress (fraction)

设置进度条步进长度

6

delete (paths)

删除指定路径的文件

7

package_extract_file(zip_path, dest_path)

将升级包内特定的文件释放到指定的目录。如果是emmc版本,可以直接将image文件更新到指定partition。

8

symlink(target src1 src2 ...)

建立指向target的符号链接src1,src2,……

9

package_extract_dir(zip_path, dest_path)

将升级包内特定的目录释放到指定的目录

10

set_perm_recursive (uid, gid, dir-mode, file-mode, path)

设置文件夹和文件夹内文件的权限

11

ui_print (“str”)

用于在recovery界面中输出指定信息

     如前所述,updater-script的解释执行是由update-zjdygary来完成的。如果需要扩充语法规则,则可以修改update-zjdygary的source code,涉及的具体文件如下:

     bootablerecoveryupdaterintall.h

     bootablerecoveryupdaterintall.c








版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。