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增量升级包。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值