安卓设备上备份已安装应用的apk包技术实现方案

需求的目的

在只有安装应用, 没有该应用的apk,而我们又想活取应用apk,用来分享给别人,或是应用的备份, 说是应用的增量升级的, 怎么办?

本文将告诉你如何靠谱的导出一个已安装应用的apk.

了解相关目录

安卓设备上根据安卓方式的不同,安装的数据存放路径也不同

1. system/app

此类应用是系统初始化时候安装完成的, 存放在 ‘system/app’ 目录下, 用户无法删除及操作.

2. data/app

通过market下载后安装(无安装界面),或是用户手动安装(adb,packageinstall等).这类apk安装过程系统会备份在data/app目录下

3. /mnt/asec/

安装到sd卡上的应用,作用同上

4. data/data

应用安装过程,会在该目录下存在应用的私有数据

5. data/dalvik-cache

应用安装过程中,会解析data/app下的安装包中的dex文件, 拷贝到data/dalvik-cache,以备应用运行时使用.

应用的删除过程即删除应用安装时所产生的这几个文件

备份apk思路分享

了解这个文件夹的作用后, 可以看到导出已安装应用只要拷贝相关目录下的应用即可.

通过测试,可以确定除了系统应用安装的备份数据没有权限, 第三方应用所产生的文件夹下的内容都是有读权限的. 所以我们不需要任何特殊权限即可实现安装应用的备份导出.

那问题来了, 在相关目录下如:data/app下如何才能知道一个应用的决定路径?

答案:

> context.getPackageManager().getApplicationInfo("packagename",

> 0).sourceDir;

所以需要了解下 PackageManager 相关api

实现代码

知道路径后,那么我们接可以将文件拷贝到指定地方了,代码如下:

private void backupApp(String path, String outname) throws IOException {

File in = new File(path);

if (!mBaseFile.exists()) mBaseFile.mkdir();

File out = new File(mBaseFile, outname + ".apk");

if (!out.exists()) out.createNewFile();

FileInputStream fis = new FileInputStream(in);

FileOutputStream fos = new FileOutputStream(out);

int count;

byte[] buffer = new byte[256 * 1024];

while ((count = fis.read(buffer)) > 0) {

fos.write(buffer, 0, count);

}

fis.close();

fos.flush();

fos.close();

}

//活取全面已安装应用的方法

PackageManager packageManager = getPackageManager();

List allPackages = packageManager.getInstalledPackages(0);

for (int i = 0; i < allPackages.size(); i++) {

PackageInfo packageInfo = allPackages.get(i);

String path = packageInfo.applicationInfo.sourceDir;

String name = packageInfo.applicationInfo.loadLabel(packageManager).toString();

}

//判断是否是第三方应用方法

public boolean isUserApp(PackageInfo pInfo) {

return (((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) && ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0));

}

正确性保障

如何确保拷贝出来的apk的正确性呢?

直接的办法可以校验md5或sha1, 当然还可以尝试解决文件格式等

Demo源代码

测试小程序已上传到github, 有兴趣的可以直接下载研究学习.

android备份:apk安装过程及原理,备份已安装应用的apk包技术实现方案相关推荐

  1. CAD、3dmax、Maya、Revit安装过程中显示产品已安装,如何卸载干净?

    CAD用户在安装CAD的时候,会遇到一个烦恼,就是提示已经安装了CAD软件,却无法使用.那么,为什么会出现这个问题呢?下面我们来介绍一下CAD安装过程中的一些情况. 出现这个提示的原因是之前安装的CA ...

  2. 大体了解Android应用安装过程及原理

    Android应用安装的流程及路径: 应用安装涉及到如下几个目录: system/app               系统自带的应用程序,无法删除 data/app                  ...

  3. Vmware Vcenter 5.1 部署安装过程 part 4 vmware vcenter 安装步骤

    Vmware  Vcenter 5.1  部署安装过程 part 4 vmware vcenter  安装步骤 作者:黄鑫      时间:2013-8-14    QQ:153890227(欢迎交流 ...

  4. 【安装过程】OllyDbg工具的安装使用学习

    安装过程: 官网下载安装即可,打开对应的压缩文件里面有help文档,会告诉怎么安装,大概解压缩就好了,exe文件发送个快捷方式到桌面,注意设置以管理员身份运行. 初步了解: help文档可以帮助了解, ...

  5. 关于安装office,出现你已安装32位,无法安装64位问题的解决方法

    关于安装office,出现你已安装32位,无法安装64位的问题 给大家安利一下office官网手动卸载office的办法 网址:https://support.microsoft.com/zh-cn/ ...

  6. 会声会影x7 每次安装均会提示:已安装这个产品的另一个版本

    会声会影x7 每次安装均会提示:已安装这个产品的另一个版本 卸载C++2008 的库就行了 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论 转载于:https://www.cnblog ...

  7. Mac 技术篇-VS Code插件安装方法,查看vscode已安装插件的方法

    微软的 Visual Studio Code 编辑器,是目前主流的前端代码编写工具,非常好用. VS Code 插件安装 点击左边最后一个图标. 然后搜索要安装的插件,点击安装就好了. 查看已安装插件 ...

  8. Windows8.1安装tools提示:安装程序无法验证是否已安装所需的Microsoft更新KB2919355的问题详解

    虚拟机下安装Windows8.1安装tools提示:安装程序无法验证是否已安装所需的Microsoft更新KB2919355.如果存在此更新,请继续安装. 因为Windows2012 R2缺少两个更新 ...

  9. “Windows Server 2012 R2安装VMwareTools提示“安装程序无法验证是否已安装所需的Microsoft更新KB2919355”的解决办法

    Windows Server 2012 R2安装VMwareTools提示"安装程序无法验证是否已安装所需的Microsoft更新KB2919355 网上查询资料说是Windows Serv ...

最新文章

  1. Vim----ma6174
  2. 开发常见错误解决(1)注册.NET EnterpriseServices COM+组件,事务服务不可用
  3. 阿里云AI如何助攻世界杯?视频集锦背后的技术实践
  4. 轻松了解面试官心理!ElasticSearch写入数据的工作原理是什么? | 技术头条
  5. 信息学奥赛C++语言: 螺旋方阵1
  6. C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
  7. go语言垃圾回收机制详解
  8. kotlin协程_Kotlin协程
  9. iOS开发之旧版本Xcode下载
  10. CentOS7安装无线网卡驱动和更新yum源
  11. 电子元器件商城与数据手册下载网站汇总
  12. C#单位档案信息管理系统源码
  13. 许晓斌的《Maven实战》 maven镜像配置
  14. Android手机安装原版BT5[ARM]
  15. C语言动态开辟多维数组空间
  16. android 瀑布流 的实现
  17. 营业收费管理系统,整合多类抄表系统
  18. 相对免赔额和绝对免赔额是什么意思,有什么区别?
  19. html制作菱锥旋转,几何画板实现三棱锥的旋转的操作方法
  20. OpenCV-灰度图蒙版GrayMask

热门文章

  1. 三本毕业后,选择了大数据开发职业
  2. java实习第一周周报,大学生实习周报
  3. 如何对优惠券进行测试
  4. 索尼Xperia S_4.0一键ROOT工具┇_┇免解锁┇_┇一分钟ROOT┇_┇
  5. strstr函数实现(C语言)
  6. 重阳重游万州文峰塔记
  7. 编写一个java_Java入门篇(一)——如何编写一个简单的Java程序
  8. ORA-01654错误:表空间满了,插入失败
  9. [No00002A]26个英语字母的原始象形意义、含义、产生及发展历史
  10. NY891 区间选点 找点