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


一、背景

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM