android源码分析2--5.0 PackageExtractFileFn
来源:互联网 发布:淘宝店铺街在哪里 编辑:程序博客网 时间:2024/06/14 08:46
// package_extract_file(package_path, destination_path)
// or
// package_extract_file(package_path)
// to return the entire contents of the file as the result of this
// function (the char* returned is actually a FileContents*).
package_extract_file("system.transfer.list")
package_extract_file("patch/boot.img.p")
package_extract_file("META-INF/com/miui/miui_update", "/cache/miui_update");
run_program("/cache/miui_update")
Value* PackageExtractFileFn(const char* name, State* state,
int argc, Expr* argv[]) {
// argc就代表脚本中package_extract_file函数的参数个数
if (argc < 1 || argc > 2) {
return ErrorAbort(state, "%s() expects 1 or 2 args, got %d",
name, argc);
}
bool success = false;
// 在updater开始将updater_info保存到了state->cookie中
UpdaterInfo updater_info;
updater_info.cmd_pipe = cmd_pipe;
updater_info.package_zip = &za;
updater_info.version = atoi(version);
updater_info.package_zip_addr = map.addr;
updater_info.package_zip_len = map.length;
State state;
state.cookie = &updater_info;
UpdaterInfo* ui = (UpdaterInfo*)(state->cookie);
if (argc == 2) {
// The two-argument version extracts to a file.
ZipArchive* za = ((UpdaterInfo*)(state->cookie))->package_zip;
char* zip_path;
char* dest_path;
if (ReadArgs(state, argv, 2, &zip_path, &dest_path) < 0) return NULL;
const ZipEntry* entry = mzFindZipEntry(za, zip_path);
if (entry == NULL) {
printf("%s: no %s in package\n", name, zip_path);
goto done2;
}
FILE* f = fopen(dest_path, "wb");
if (f == NULL) {
printf("%s: can't open %s for write: %s\n",
name, dest_path, strerror(errno));
goto done2;
}
success = mzExtractZipEntryToFile(za, entry, fileno(f));
fclose(f);
done2:
free(zip_path);
free(dest_path);
return StringValue(strdup(success ? "t" : ""));
} else {
// The one-argument version returns the contents of the file
// as the result.
char* zip_path;
Value* v = malloc(sizeof(Value));
v->type = VAL_BLOB;
v->size = -1;
v->data = NULL;
// 调用ReadArgs从 package_extract_file("system.transfer.list")中取出system.transfer.list作为zip_path
if (ReadArgs(state, argv, 1, &zip_path) < 0) return NULL;
ZipArchive* za = ((UpdaterInfo*)(state->cookie))->package_zip;
//从映射到内存中的zip压缩包中找到zip_path
const ZipEntry* entry = mzFindZipEntry(za, zip_path);
if (entry == NULL) {
printf("%s: no %s in package\n", name, zip_path);
goto done1;
}
v->size = mzGetZipEntryUncompLen(entry);
v->data = malloc(v->size);
if (v->data == NULL) {
printf("%s: failed to allocate %ld bytes for %s\n",
name, (long)v->size, zip_path);
goto done1;
}
//将zip_path(system.transfer.list)的内容从zip包中解压缩到v->data中
* Uncompress "pEntry" in "pArchive" to buffer, which must be large
* enough to hold mzGetZipEntryUncomplen(pEntry) bytes.
*/
boolmzExtractZipEntryToBuffer(const ZipArchive *pArchive,
const ZipEntry *pEntry, unsigned char *buffer)
success = mzExtractZipEntryToBuffer(za, entry,
(unsigned char *)v->data);
done1:
free(zip_path);
if (!success) {
free(v->data);
//如果mzExtractZipEntryToBuffer执行失败就将v->data重新设为空
v->data = NULL;
v->size = -1;
}
return v;
}
}
0 0
- android源码分析2--5.0 PackageExtractFileFn
- Android 5.0源码解析 ---Activity源码分析
- Android 5.0 Contacts源码分析
- Android 5.0 Contacts源码分析
- Android 5.0 Contacts源码分析
- Android 5.0 Contacts源码分析
- android adb源码分析(2)
- Android Volley源码分析(2)
- Android 5.0 Camera系统源码分析(2):Camera打开流程
- Android 5.0 Camera系统源码分析(2):Camera打开流程
- Android源码/框架源码分析
- Android 5.0源码分析---智能指针
- Android 5.0源码分析---startService的过程
- Android RIL源码分析(2)
- android源码系列:init分析2
- Android SQLiteOpenHelper (2)源码分析
- Android 消息处理源码分析(2)
- android /system/vold源码分析(2)
- poj3293(几何扫描线+并查集)
- qt designer设计的.ui文件转.py文件
- C语言itoa()函数和atoi()函数详解---整数与字符互相转换C函数
- ThinkPHP中的D函数中select方法查询
- 青蛙跳河
- android源码分析2--5.0 PackageExtractFileFn
- Java基础部分----面试题
- Qt 多线程探秘2--Qt Concurrent
- __FILE__与__DIR__与 getcwd()与$_SERVER['SCRIPT_FILENAME']之间的区别
- 课程学习归纳总结(0228)
- <18>python学习笔记——正则表达式
- Java动态代理 入门
- 51nod:1264 线段相交(数学几何)
- python中 __name__及__main()__