要求在产品中预装大量的第三方app,apk文件有600M多,加上相关资源文件,共计4G。
如何把如此多的文件在安装时内置到系统成了问题。解决方法有三:
1 在update.zip中实现复制。写updater-script 通过使用script 复制。见我的另一篇自定义updater-script的文章。
缺点:script脚本需要自己写,不能随make生成。
2 在update.zip中实现复制。在recovery.c中实现。
缺点:SDCARD fat对zip文件有大小限制。
3 在第一次系统启动后实现自动安装。缺点:太慢,大概需要30分。
方法二的实现:
-
方法二的实现:
-
-
实现的位置在流程中见图片。
-
在install_package()的结尾的try_update_binary函数结尾(); 在src/bootable/recovery/install.c
-
-
下面是具体实现:
-
-
-
-
static
char
*res_list[] = {
"/sdcard/ res1.zip"
,
"/sdcard/ res2.zip"
};
-
-
static
void
unzip_res_to_data(
void
)
-
{
-
int
i = 0;
-
-
for
(i = 0; i <
sizeof
( res_list)/
sizeof
(
char
*); ++i)
-
{
-
ZipArchive zip_res;
-
int
err = mzOpenZipArchive( res_list[i], &zip_res);
-
if
(err != 0) {
-
LOGI("Can't open %s\n"
, res_list[i]);
-
}
-
else
{
-
LOGI("start update %s\n"
, res_list[i]);
-
-
struct
utimbuf timestamp = { 1217592000, 1217592000 };
-
bool
success = mzExtractRecursive(&zip_res,
"res-private"
,
"/data/res-private"
,
-
MZ_EXTRACT_FILES_ONLY, ×tamp,
-
NULL, NULL);
-
LOGI("update %s %s\n"
, res_list[i], ((success==
true
)?
"success"
:
"failed"
));
-
mzCloseZipArchive(&zip_res);
-
}
-
}
-
-
dirSetHierarchyPermissions("/data/res-private"
, 1000, 1000, 0777, 0666);
-
}
-
-
-
void
cpfiles(){
-
-
ZipArchive zip_apps;
-
int
err = mzOpenZipArchive(
"/sdcard/myapps.zip"
, &zip_apps);
-
if
(err != 0) {
-
LOGI("Can't open %s\n"
,
"/sdcard/myapps.zip"
);
-
}
-
else
{
-
-
if
(mount(
"/dev/block/mmcblk0p13"
,
"/data"
,
"ext4"
,
-
MS_NOATIME | MS_NODEV | MS_NODIRATIME, ""
) < 0) {
-
fprintf(stderr, "%s: failed to mount"
, strerror(errno));
-
}
-
-
LOGI("start update 3rd-apps\n"
);
-
-
struct
utimbuf timestamp = { 1217592000, 1217592000 };
-
bool
success = mzExtractRecursive(&zip_appss,
"app"
,
"/data/app"
,
-
MZ_EXTRACT_FILES_ONLY, ×tamp,
-
NULL, NULL);
-
dirSetHierarchyPermissions("/data/app"
, 1000, 1000, 0771, 0644);
-
LOGI("update myapps %s\n"
, ((success==
true
)?
"success"
:
"failed"
));
-
mzCloseZipArchive(&zip_apps);
-
-
-
unzip_res_to_data();
-
-
scan_mounted_volumes();
-
const
MountedVolume* vol = find_mounted_volume_by_mount_point(
"/data"
);
-
if
(vol == NULL) {
-
fprintf(stderr, "unmount of %s failed; no such volume\n"
,
"/data"
);
-
} else
{
-
unmount_mounted_volume(vol);
-
}
-
}
-
-
}
-
-
-
-
static
int
-
try_update_binary(const
char
*path, ZipArchive *zip) {
-
-
.......
-
-
cpfiles();
-
return
INSTALL_SUCCESS;
-
}
分享到:
相关推荐
Android recovery原理讲解,讲解Android recovery启动模式的解析及升级过程。
android recovery升级教程
android recovery代码分析
7-Data Android Recovery 是由 SharpNight LLC 出品的一款安卓数据恢复软件。7-Data Android Recovery 是 7-Data 文件恢复系列中的一员。大眼仔介绍过很多针对 Android 的数据恢复软件,其实大眼仔一款都没有用过,...
Recovery 5.0.2.0.apk
Android recovery资料大全---网上找了很久
android-recovery移植汉化
解决android7.1 ota差分升级没有install-recovery.sh的方法 这是个patch, 解决了升级时提示没有install-recovery.sh的报错的问题 为不浪费你的分数, 请确定你是android7和高通平台才可以.
android recovery模式下可用的较大的字体,直接将此头文件放到bootable\recovery\minui目录下,修改graphics.cpp中对原字体头文件的引用为本文件即可。
关于Android Recovery模式的介绍,包括流程图,对于了解OTA升级应该是很有用的
刷永久RECOVERY
分析Android应用的利器,容易使用的APK反编译工具,命令行: java -jar apkRecovery <path to your apk file> 执行后得到的res资源文件以及jar包,然后用自带的JD-gui软件查看java源代码即可!
Android系统Recovery模式的工作原理,摘录自网页
android-recovery-code.rar android-recovery-code.rar
androidrecovery翻译.pdf
android recovery运行流程,这个是本人总结的。
使用这个安卓apk软件 就可以在手机上刷入第三方recovery 不用电脑 非常方便 需要root
声明我不是作者,从网上copy的资料,感觉很有用。Android系统Recovery工作原理之使用update.zip升级过程分析
AndroidRecovery2.8.7.1.exe
通过按下某个按键,使android进入recovery模式,是很好的参考资料