一、背景

很多时候,APK文件只存在于应用市场,在PC上无法直接下载。用手机下载下来后就直接安装了,也不能保存原始的APK文件。

APK安装到手机后,Android系统会保存一份和原始APK一模一样的拷贝,位于data/app目录,文件名为“APK的包名-1.apk”或者“APK的包名-2.apk”。这里的包名即 package name,形如 com.xxx.xxx。

data/app这个目录在非root的情况下,是无法直接查看的。但幸运的是,这个目录下所有的APK文件,是有other组可读权限的。

这就是本文方法的原理了。

下面以微信这个APK为例来说明下具体的操作步骤。

二、步骤

Step 0:在手机上安装APK,打开(在下面的步骤中保持APK处于打开状态)。

Step 1:将PC通过adb连接上手机。这步显然是必要条件,对adb不清楚的请自行查阅相关资料

Step 2:获取APK的包名(package name) - 最重要的一步 - 有两种方法

第一种方法 -- 如果你大概知道这个APK的包名可能会包含什么字符串。

比如,我们知道微信是腾讯出品的,那么按惯例,它包名里面肯定包含了“tencent ”这个字符串。

方法:打开PC的命令行,输入adb shell ps。它会列出当前手机中所有正在运行的程序,肯定包含了你要的APK的包名。

在这个输出里面查找包含 tencent的行,你很快就可以找到,它的包名是 com.tencent.mm。

第二种方法 -- 如果你对这个APK的包名可能包含什么内容一无所知。

这时可以使用一个比较复杂的命令:dumpsys activity activities

方法:打开PC的命令行,输入adb shell dumpsys activity activities ,它会列出当前手机中所有正在运行的应用的详细信息,按打开顺序排列,最后打开的APK信息会放在输出的最前面。

(输出非常长,可以重定向到文件中查看到 adb shell dumpsys activity activities > temp.txt)

最前面几行看起来是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
  Main stack:
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}
    numActivities=1 rootWasReset=true userId=0
    affinity=com.tencent.mm
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}
    realActivity=com.tencent.mm/.ui.LauncherUI
    askedCompatMode=false
    lastThumbnail=null lastDescription=null
    lastActiveTime=19915965 (inactive for 10s)
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}
        packageName=com.tencent.mm processName=com.tencent.mm

发现了吗,第三行就已经有我们需要的信息了:com.tencent.mm

不要被里面的技术细节信息吓倒了,我们不需要关心那些~

Step 3:利用adb pull命令导出APK

知道了APK的包名,导出APK就简单了。因为data/app下的APK文件名只有两种情况,一个一个试就行了

adb pull data/app/com.tencent.mm-1.apk com.tencent.mm.apk

adb pull data/app/com.tencent.mm-2.apk com.tencent.mm.apk

第三种方法好是好,但是得首先知道APK叫什么名字,可以使用adb shell pm list package -f -3获得

备注:Android4.4以后,dumpsys的输出有点变化,这里,在获取到dumpsys的输出后,搜索关键字:Stack #1 ,就可以在下面几行找到类似的包名了

命令行从Android手机中导出已安装APK的方法调研的更多相关文章

  1. 从Android手机中取出已安装的app包,导出apk

    从Android手机中取出已安装的app包,导出apk TAG:Android,提取,apk,adb,pm,root,导出apk 假设有这样一个场景,A君看到你手机上一个实用APP,想要安装到自己手机 ...

  2. ubuntu中查看已安装软件包的方法

    ubuntu中查看已安装软件包的方法: 方法一:在新立得软件包管理器中,打到已安装,便可以看看有多少包被安装. 如果想把这些包的信息复制到一文件里,可用下面的方法. 方法二:在终端输入 sudo dp ...

  3. 命令行执行php脚本中的$argv和$argc配置方法

    在实际工作中有可能会碰到需要在nginx命令行执行php脚本的时候,当然你可以去配置一个conf用外网访问. 在nginx命令行中 使用 php index.php 就可以执行这个index.php脚 ...

  4. 将文件从已Root Android手机中copy出来的几个cmd窗口命令

    将文件从已Root Android手机中copy出来的几个cmd窗口命令: 以shell身份登录adbadb shell进入adb后切换至root用户su更改文件的所属chown shell *更改文 ...

  5. Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  6. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  7. 命令行创建Android应用,生成签名,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  8. 命令行运行Android Robotium自动化用例或单元测试用例

    本文目录 1.运行所有的测试用例 2.运行单个测试类或某个TestSuite 3.运行某个测试类里面的某个测试方法 4.运行两个不同的测试类或类中的方法 命令行运行Android Robotium自动 ...

  9. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

随机推荐

  1. vconfig 的使用

    http://man.cx/vconfig%288%29 vconfig 作用: (802.1q)VLAN配置程序 root@hbg:/# vconfig --helpBusyBox v1.22.1 ...

  2. 第二次冲刺spring会议(第二次会议)

    [例会时间]2014/5/5 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇 界面的一些修改如下

  3. Events and Responder Chain

    事件类型(Event Type) iOS 有三种事件类型: 触控事件(UIEventTypeTouches):单点.多点触控以及各种手势操作: 传感器事件(UIEventTypeMotion):重力. ...

  4. C# 验证码生成(MVC和非MVC两种方式)

    /// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度 ...

  5. sql分页带参数,带排序等,动态实现的方法

    USE [YQOBS] GO /****** Object: StoredProcedure [dbo].[PageList] Script Date: 11/06/2014 11:39:35 *** ...

  6. 【Vmware】VirtualBox下虚拟机的网络配置

    1.VirtualBox的提供了四种网络接入模式,它们分别是:1.NAT    网络地址转换模式(NAT,Network Address Translation)2.Bridged Adapter   ...

  7. automaticallyAdjustsScrollViewInsets (iOS)

    [摘要:@当我们正在一个UIViewController中同时建立2个tableView的时间,若是把它们的frame中的Y坐标设置为一样,您大概会发明它们的地位并出有到达您念要的效果.比方第一tab ...

  8. G - 娜娜梦游仙境系列——梦醒

    G - 娜娜梦游仙境系列——梦醒 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  9. Excel补全日期(日期按顺序补全)

    1.给出的数据 2.想补全缺失的日期,比如2015/3/1,2015/3/2,... 1)在D列输入完整的日期,如下图所示: 2)在E2处写函数“=IF(ISERR(VLOOKUP(D2,B:C,2, ...

  10. Oracle数据库插入数据出错:ORA-06550

    wpf应用调用oracle的存储过程,出错“ORA-06550:参数个数或参数类型出错”,如下图: 反复检查,存储过程的参数个数和参数类型都没错,觉得非常蹊跷.最后终于解决, 原因是当参数的值为nul ...