OTA包新做法

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章