首先簡單說下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增量升級包。