命令行從Android手機中導出已安裝APK的方法調研

1、背景

不少時候,APK文件只存在於應用市場,在PC上沒法直接下載。用手機下載下來後就直接安裝了,也不能保存原始的APK文件。android

APK安裝到手機後,Android系統會保存一份和原始APK如出一轍的拷貝,位於data/app目錄,文件名爲「APK的包名-1.apk」或者「APK的包名-2.apk」。這裏的包名即 package name,形如 com.xxx.xxx。shell

data/app這個目錄在非root的狀況下,是沒法直接查看的。但幸運的是,這個目錄下全部的APK文件,是有other組可讀權限的。微信

這就是本文方法的原理了。app

下面以微信這個APK爲例來講明下具體的操做步驟。ui


2、步驟

Step 0:在手機上安裝APK,打開(在下面的步驟中保持APK處於打開狀態)。
spa

Step 1:將PC經過adb鏈接上手機。這步顯然是必要條件,對adb不清楚的請自行查閱相關資料命令行

Step 2:獲取APK的包名(package name) - 最重要的一步 - 有兩種方法code

第一種方法 -- 若是你大概知道這個APK的包名可能會包含什麼字符串。orm

好比,咱們知道微信是騰訊出品的,那麼按慣例,它包名裏面確定包含了「tencent 」這個字符串。ip

方法:打開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

最前面幾行看起來是這樣的:

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 ,就能夠在下面幾行找到相似的包名了

<完>

相關文章
相關標籤/搜索