免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1698 | 回复: 1
打印 上一主题 下一主题

Android Recovery 复制大量预装apk方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-13 15:33 |只看该作者 |倒序浏览
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. 在install_package()的结尾的try_update_binary函数结尾(); 在src/bootable/recovery/install.c





  2. 下面是具体实现:





  3. //copy some res file to /data/







  4. static

  5. char
  6. *res_list[] = {
  7. "/sdcard/ res1.zip"
  8. ,
  9. "/sdcard/ res2.zip"
  10. };






  11. static

  12. void
  13. unzip_res_to_data(
  14. void
  15. )



  16. {


  17.     int
  18. i = 0;






  19.     for
  20. (i = 0; i <
  21. sizeof
  22. ( res_list)/
  23. sizeof
  24. (
  25. char
  26. *); ++i)



  27.     {


  28.         ZipArchive zip_res;


  29.         int
  30. err = mzOpenZipArchive( res_list[i], &zip_res);



  31.         if
  32. (err != 0) {



  33.             LOGI("Can't open %s\n"
  34. ,  res_list[i]);



  35.         }


  36.         else
  37. {



  38.             LOGI("start update %s\n"
  39. , res_list[i]);



  40.             // To create a consistent system image, never use the clock for timestamps.




  41.             struct
  42. utimbuf timestamp = { 1217592000, 1217592000 };  
  43. // 8/1/2008 default




  44.             bool
  45. success = mzExtractRecursive(&zip_res,
  46. "res-private"
  47. ,
  48. "/data/res-private"
  49. ,



  50.                     MZ_EXTRACT_FILES_ONLY, &timestamp,


  51.                     NULL, NULL);


  52.             LOGI("update %s %s\n"
  53. , res_list[i], ((success==
  54. true
  55. )?
  56. "success"
  57. :
  58. "failed"
  59. ));



  60.             mzCloseZipArchive(&zip_res);


  61.         }


  62.     }





  63.     dirSetHierarchyPermissions("/data/res-private"
  64. , 1000, 1000, 0777, 0666);



  65. }





  66. //copy some app file to /data/app




  67. void
  68. cpfiles(){






  69.     ZipArchive zip_apps;


  70.     int
  71. err = mzOpenZipArchive(
  72. "/sdcard/myapps.zip"
  73. , &zip_apps);



  74.     if
  75. (err != 0) {



  76.         LOGI("Can't open %s\n"
  77. ,
  78. "/sdcard/myapps.zip"
  79. );



  80.     }


  81.     else
  82. {



  83.         //here need fix mount for your device




  84.         if
  85. (mount(
  86. "/dev/block/mmcblk0p13"
  87. ,
  88. "/data"
  89. ,
  90. "ext4"
  91. ,



  92.                     MS_NOATIME | MS_NODEV | MS_NODIRATIME, ""
  93. ) < 0) {



  94.             fprintf(stderr, "%s: failed to mount"
  95. , strerror(errno));



  96.         }





  97.         LOGI("start update 3rd-apps\n"
  98. );



  99.         // To create a consistent system image, never use the clock for timestamps.




  100.         struct
  101. utimbuf timestamp = { 1217592000, 1217592000 };  
  102. // 8/1/2008 default




  103.         bool
  104. success = mzExtractRecursive(&zip_appss,
  105. "app"
  106. ,
  107. "/data/app"
  108. ,



  109.                 MZ_EXTRACT_FILES_ONLY, &timestamp,


  110.                 NULL, NULL);


  111.         dirSetHierarchyPermissions("/data/app"
  112. , 1000, 1000, 0771, 0644);



  113.         LOGI("update myapps %s\n"
  114. , ((success==
  115. true
  116. )?
  117. "success"
  118. :
  119. "failed"
  120. ));



  121.         mzCloseZipArchive(&zip_apps);





  122. //cp res to /data/




  123.         unzip_res_to_data();





  124.         scan_mounted_volumes();


  125.         const
  126. MountedVolume* vol = find_mounted_volume_by_mount_point(
  127. "/data"
  128. );



  129.         if
  130. (vol == NULL) {



  131.             fprintf(stderr, "unmount of %s failed; no such volume\n"
  132. ,
  133. "/data"
  134. );



  135.         } else
  136. {



  137.             unmount_mounted_volume(vol);


  138.         }


  139.     }





  140. }








  141. // If the package contains an update binary, extract it and run it.




  142. static

  143. int




  144. try_update_binary(const

  145. char
  146. *path, ZipArchive *zip) {



  147.   


  148. .......





  149.     cpfiles();


  150.     return
  151. INSTALL_SUCCESS;



  152. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-01-13 15:34 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP