首先简单说下OTA包这个东西,OTA包就是在线下载的ROM包。ROM包分二种,增量包和全量包。市面上推送的补丁包为增量包,用来解决个别或少数漏洞。全量包是整个android源码编译之后,所有文件镜像的集合。
这边我们主要介绍OTA增量包的新做法,制作一个成功的OTA包,分为3部分。1.制作好包的内容。2.制作好对应的升级脚本。3.对制作好的东西,进行打包,签名。
第一步:仿照全量包的文件目录,制作一个满足自己需求的文件目录,比如只对system分区作用的包,我仅保system(android系统支持ROM包中是文件夹形式也支持.img)
第二步:制作合适的升级脚本update_scrpit
show_progress(0.950000, 60);
mount("ext4", "EMMC", "/dev/block/platform/mstar_mci.0/by-name/system", "/system");
package_extract_dir("system", "/system");
show_progress(0.050000, 2);
show_progress(0.000000, 0);
unmount("/system");
此处对system分区重新mount,替换新的system。比起全量包大篇幅的update_script,我们仅删减剩可用部分。
以上函数请自行查阅update_script的常用函数。
第三部:进行打包签名。
献上核心代码make_ota.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
char *compresszip();
int startWith(char s1[],char s2[]);
char * signaturezip(char *zipname);
int main(int argc,char *argv[])
{
char *compresspath = "otapackage";
char cmd[1024];
char StrLine[1024];
char zipname[100];
if(argc!=2)
{
printf("Error:Please enter the corresponding platform directory as a parameter.\nFor example: ./makeotafile plus Rk3128\n");
exit(-1);
}
chdir(argv[1]);
chdir("ota_update");
system("mv META-INF/com/google/android/updater-script META-INF/com/google/android/updater-script-old");
FILE * newfile = fopen("META-INF/com/google/android/updater-script","w+");
FILE * oldfile = fopen("META-INF/com/google/android/updater-script-old","r");
while(!feof(oldfile))
{
memset(StrLine,0,sizeof(StrLine));
fgets(StrLine,1024,oldfile);
if(!((!startWith(StrLine,"format"))||
(!startWith(StrLine,"write_raw_image"))||
(!startWith(StrLine,"package_extract_dir(\"recovery"))||
(!startWith(StrLine,"ui_print"))||
(!startWith(StrLine,"package_extract_file"))||
(!startWith(StrLine,"\"/system"))||
(!startWith(StrLine,"symlink"))))
{
fputs(StrLine,newfile);
printf("%s\n",StrLine);
}
fflush(newfile);
fflush(oldfile);
}
system("rm META-INF/com/google/android/updater-script-old");
strcpy(zipname,compresszip());
signaturezip(zipname);
system("rm update.zip");
return 0;
}
char * signaturezip(char *zipname)
{
char cmd[1024];
memset(cmd,0,sizeof(cmd));
sprintf(cmd,"java -jar key/signapk.jar -w key/testkey.x509.pem key/testkey.pk8 %s update_signed.zip",zipname);
printf("cmd---%s\n",cmd);
system(cmd);
return "update_signed.zip";
}
char *compresszip()
{
// system("rm ../update.zip");
system("zip -r ../update.zip *");
chdir("..");
return "update.zip";
}
int startWith(char s1[],char s2[])
{
char *src = s1;
char *dst = s2;
int lens2 = strlen(dst);
while(1)
{
if((*src == ' ')||(*src == '\t'))
src++;
else
break;
}
return strncmp(src, dst, lens2);
}
代码核心工作即为一个处理好文件目录,进行打包,期间也附带了自行删除update_script中不必要代码的删减。
当然了.c代码需要编译后才能执行,我个人在linux下使用make make_ota形成.o文件 win下也可以使用gcc命令。
最后说下使用方式(以linux为例)
一、新建目录:
mkdir New_test;cd New_test/;mkdir key;mkdir ota_update
二、存放rom签名key
key放的是签名rom的签名文件,在以下地方,在Android源码取出来放到key目录
out/host/linux-x86/framework/signapk.jar
build/target/product/security/testkey.x509.pem
build/target/product/security/testkey.pk8
三、存放完整rom的升级脚本等关键文件
1、使用脚本./build.sh ota 之后在out下产生的asop_xxxx.zip 解压此zip 取出该目录 META-INF/ 存放到 ota_update/
2、创建想要替换文件的目录
3、拷贝想要替换的文件进去system/app/ cp xxx.apk system/app/xxx.apk
4、回到该工具顶层目录,制作ota升级./makeotafile_plus 工程名(例如:./makeotafile_plus New_test)
5、在makeotatools/New_test目录下就会生成一个update_signed.zip的ota增量升级包。