`
quanminchaoren
  • 浏览: 924564 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android Recovery 复制大量预装apk方法

阅读更多

要求在产品中预装大量的第三方app,apk文件有600M多,加上相关资源文件,共计4G。

如何把如此多的文件在安装时内置到系统成了问题。解决方法有三:
 
1 在update.zip中实现复制。写updater-script 通过使用script 复制。见我的另一篇自定义updater-script的文章。
  缺点:script脚本需要自己写,不能随make生成。
 
2 在update.zip中实现复制。在recovery.c中实现。
  缺点:SDCARD fat对zip文件有大小限制。
 
3 在第一次系统启动后实现自动安装。缺点:太慢,大概需要30分。
 
方法二的实现:
 
 

 

  1. 方法二的实现: 
  2.  
  3. 实现的位置在流程中见图片。 
  4. 在install_package()的结尾的try_update_binary函数结尾(); 在src/bootable/recovery/install.c 
  5.  
  6. 下面是具体实现: 
  7.  
  8. //copy some res file to /data/  
  9.  
  10. static   char  *res_list[] = {  "/sdcard/ res1.zip" "/sdcard/ res2.zip" }; 
  11.  
  12. static   void  unzip_res_to_data( void
  13.     int  i = 0; 
  14.  
  15.     for (i = 0; i <  sizeof ( res_list)/ sizeof ( char  *); ++i) 
  16.     { 
  17.         ZipArchive zip_res; 
  18.         int  err = mzOpenZipArchive( res_list[i], &zip_res); 
  19.         if  (err != 0) { 
  20.             LOGI("Can't open %s\n" ,  res_list[i]); 
  21.         } 
  22.         else  { 
  23.             LOGI("start update %s\n" , res_list[i]); 
  24.             // To create a consistent system image, never use the clock for timestamps.  
  25.             struct  utimbuf timestamp = { 1217592000, 1217592000 };   // 8/1/2008 default  
  26.             bool  success = mzExtractRecursive(&zip_res,  "res-private" "/data/res-private"
  27.                     MZ_EXTRACT_FILES_ONLY, &timestamp, 
  28.                     NULL, NULL); 
  29.             LOGI("update %s %s\n" , res_list[i], ((success== true )? "success" : "failed" )); 
  30.             mzCloseZipArchive(&zip_res); 
  31.         } 
  32.     } 
  33.  
  34.     dirSetHierarchyPermissions("/data/res-private" , 1000, 1000, 0777, 0666); 
  35.  
  36. //copy some app file to /data/app  
  37. void  cpfiles(){ 
  38.  
  39.     ZipArchive zip_apps; 
  40.     int  err = mzOpenZipArchive( "/sdcard/myapps.zip" , &zip_apps); 
  41.     if  (err != 0) { 
  42.         LOGI("Can't open %s\n" "/sdcard/myapps.zip" ); 
  43.     } 
  44.     else  { 
  45.         //here need fix mount for your device  
  46.         if  (mount( "/dev/block/mmcblk0p13" "/data" "ext4"
  47.                     MS_NOATIME | MS_NODEV | MS_NODIRATIME, "" ) < 0) { 
  48.             fprintf(stderr, "%s: failed to mount" , strerror(errno)); 
  49.         } 
  50.  
  51.         LOGI("start update 3rd-apps\n" ); 
  52.         // To create a consistent system image, never use the clock for timestamps.  
  53.         struct  utimbuf timestamp = { 1217592000, 1217592000 };   // 8/1/2008 default  
  54.         bool  success = mzExtractRecursive(&zip_appss,  "app" "/data/app"
  55.                 MZ_EXTRACT_FILES_ONLY, &timestamp, 
  56.                 NULL, NULL); 
  57.         dirSetHierarchyPermissions("/data/app" , 1000, 1000, 0771, 0644); 
  58.         LOGI("update myapps %s\n" , ((success== true )? "success" : "failed" )); 
  59.         mzCloseZipArchive(&zip_apps); 
  60.  
  61. //cp res to /data/  
  62.         unzip_res_to_data(); 
  63.  
  64.         scan_mounted_volumes(); 
  65.         const  MountedVolume* vol = find_mounted_volume_by_mount_point( "/data" ); 
  66.         if  (vol == NULL) { 
  67.             fprintf(stderr, "unmount of %s failed; no such volume\n" "/data" ); 
  68.         } else  { 
  69.             unmount_mounted_volume(vol); 
  70.         } 
  71.     } 
  72.  
  73.  
  74.  
  75. // If the package contains an update binary, extract it and run it.  
  76. static   int  
  77. try_update_binary(const   char  *path, ZipArchive *zip) { 
  78.   
  79. ....... 
  80.  
  81.     cpfiles(); 
  82.     return  INSTALL_SUCCESS; 
  83. }
分享到:
评论

相关推荐

    Android 9.0 GMS刷机服务包及使用说明

    在非谷歌认证或者定制版的Android设备上,可能预装的系统并未包含完整的GMS。因此,为了使用Google应用和享受完整的Android体验,用户需要手动进行刷机。这个过程通常涉及到下载GMS服务包,并通过特定的工具或方法将...

    A33_Android快速移植指南

    预装APK是将应用软件预装到设备中,文档描述了默认预装APK以及将其预装到system/app和system/preinstall目录的过程。 #### 2.3 配置data分区 这一部分讲述了如何配置Android系统的data分区,这对于设备的数据存储和...

    三星I9300 NOTE等系列自带的电子邮件APK

    这款APK是三星原厂预装的一部分,旨在优化用户体验,尤其对于经常处理邮件的用户来说,它具有较高的实用价值。 首先,我们要了解的是“APK”是什么。APK是Android应用程序包(Android Package)的缩写,是Google ...

    COSHIP F2 中文Recovery v6.0.5.1

    1. **Flashify.apk**:这是一个应用,用于在Android设备上方便地安装和管理Recovery。Flashify可以让你轻松地刷入新的Recovery映像,而无需通过电脑或其他复杂方法。用户只需在手机上安装此应用,按照指示操作,就能...

    Android系统专有名词介绍

    - ROM在Android设备中通常指的是预装的操作系统或者自定义的系统版本。 - 用户可以通过刷入不同的ROM来升级或自定义自己的设备。 4. **Recovery Mode(恢复模式)** - Recovery Mode是一种特殊的系统模式,可以...

    SuperSU-v2.82 卡刷包和apk

    在Android系统中,root权限类似于Windows系统的管理员权限,它允许用户对系统进行深度修改,包括删除预装应用、优化性能、自定义界面等。然而,这也意味着可能会影响设备的稳定性和保修政策,因此需谨慎操作。 ...

    A83T Android快速移植指南

    - **默认预装APK**: 在`build.prop`文件中指定预装的APK。 - **预装位置**: - `system/app`: 一般用于预装系统级应用。 - `system/preinstall`: 用于预装第三方应用。 - `system/precopy`: 类似于预安装,但这些...

    Z3V RECOVERY

    ROOT是Android操作系统中的一个术语,指通过特殊方法绕过系统安全限制,使用户能够完全控制设备。这通常涉及到利用系统漏洞或利用特定软件来获取权限。ROOT后,用户可以安装各种需要超级用户权限的应用,或者进行...

    H3 Android定制化文档

    - **Preinstall预装**:使用preinstall工具预装APK。 - **如何控制GPIO**: - **定义需要控制的GPIO**:定义需要控制的GPIO引脚。 - **配置boot阶段初始化的gpio功能**:配置启动阶段的GPIO初始化。 - **控制...

    android获取手机root权限比较方便的方法.pdf

    Android 获取手机 Root 权限的简便方法 Android 操作系统是一款流行的移动操作系统,具有开放式的架构设计,因此允许用户获取 Root 权限,以获得更高的权限来访问系统资源。但是,获取 Root 权限却是一件复杂的...

    android root工具

    - 使用TWRP,将su文件和superuser.apk复制到设备的相应目录。 - 重启设备,此时su文件应该已经可供系统使用,而superuser.apk将负责管理root权限的请求。 - 安装完成后,你可能需要通过运行一些root验证应用来...

    Android filesystem 3 image解釋

    system.img则包含了Android系统的大部分核心组件和预装应用程序。它驻留在虚拟内存系统(VMS)中,通常映射到设备上的/system分区。这个分区存储了系统库、默认的系统应用包(.apk文件)、系统设置和其他关键系统...

    红米NOTE_4.5.14更新_第三方中文recovery_root工具

    在IT领域,特别是Android系统定制和优化中,"红米NOTE_4.5.14更新_第三方中文recovery_root工具"是一个与设备修改和增强有关的主题。这个标题表明了一个针对红米Note设备的更新,涉及到两个关键的概念:第三方中文...

    宏碁AcerLiquidA1使用Recovery获取Root权限.pdf

    2. 或者,如果你已经取得了Root权限,可以安装Quick Boot 4.0.apk,通过该应用快速进入Recovery。 在Recovery界面中,操作方式如下: - 菜单键:进入当前选择的菜单。 - 返回键:返回上一级菜单。 - 方块键(OK键...

    获取root权限和刷recovery.rar

    在Android操作系统中,"获取root权限"和"刷recovery"是两个高级用户经常进行的操作,主要用于深度定制和优化手机。下面将详细解释这两个概念及其重要性。 首先,根权限(Root Access)是指用户获得了Android系统的...

    Magisk-v25.2.apk

    3. **Root权限**:Magisk-v25.2.apk提供root权限,意味着用户可以访问Android系统的底层,对系统文件进行修改,实现更多高级操作,如禁用预装应用、优化性能等。然而,获取root权限也增加了设备的安全风险,因此在...

    android ROM分解定制签名教程

    在Android系统中,ROM(Read-Only Memory)是包含了操作系统、预装应用和其他必要软件的固件部分。对其进行分解和定制签名是Android开发者和爱好者为了实现个性化或优化系统性能的常见操作。本教程将深入探讨Android...

    a10_android内容定制说明文档

    预装的应用程序(APK 文件)可以让设备在首次启动时就具备一定的功能性和用户体验。预装 APK 的步骤通常包括选择合适的应用程序、打包以及安装至系统分区。预装的应用可以是基础应用,也可以是特定的服务应用,具体...

    Android底层开发平台

    - **/system**:包含Android系统文件和预装应用。 - **/data**:存储用户数据和应用数据。 - **/vendor**:厂商定制的部分,如驱动程序、库文件等。 - **/etc**:配置文件和其他设置信息。 - **/dev**:设备节点和...

Global site tag (gtag.js) - Google Analytics