一、背景
很多時候,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 ,就可以在下面幾行找到類似的包名了