1. 程式人生 > >Android Studio 3.0+ 無原始碼除錯apk

Android Studio 3.0+ 無原始碼除錯apk

Android Studio 3.0+ 無原始碼除錯debuggable=false apk

一、準備一臺支援debug程式的裝置

  • 把裝置root掉
  • 修改測試機的 /default.prop 檔案的ro.debuggable=1,目測這一步也可能需要root。可以使用這個命令檢視你的裝置是否支援debug所有app: adb shell “getprop ro.debuggable”,顯示1就是可以,顯示0就是不可以
  • 使用模擬器
  • 修改apk的Manifest application 屬性 android:debuggable=“true”,可以用apktool 解出Manifest 然後修改,接著重新打包回去。

二、將需要debug的apk匯入Android Studio

  1. 選擇Profile or debug APK,然後選中你的想要debug的apk,點“OK”匯入(首次開啟Android Studio或者“File”-“Close Project” 關閉所有開啟的專案就會進入到這個介面)

  2. 匯入apk,之後可以看到大概如下的結構: 在這裡插入圖片描述

  3. 給你想要debug的程式碼位置打斷點 在這裡插入圖片描述

  4. 點選“Run”-"Edit Configurations"進去設定debug埠 在這裡插入圖片描述

  5. 點選“+”-“add Remote”,建立一個新的remote除錯 在這裡插入圖片描述

  6. 配置好名字與除錯監聽的埠即可 在這裡插入圖片描述

三、使用DDMS連線裝置除錯

  1. 點選“Tools”-“Android”-“Android Device Monitor”,開啟裝置監視器 在這裡插入圖片描述
  2. 開啟之後,正常如下圖所示,可以看到你的裝置,若是看不到,重啟一下你的模擬器或者重新插一下你的手機 在這裡插入圖片描述
  3. 選中你想要除錯的程序,即apk 在這裡插入圖片描述
  4. 點選Android Studio的debug按鈕 在這裡插入圖片描述
  5. 顯示如下就是正常連線到裝置了,接下來你就可以跟平時除錯一樣除錯這個apk了 在這裡插入圖片描述
  6. 看,我們已經看到了debug出來的堆疊資料 在這裡插入圖片描述

四、使用ADB連線裝置除錯(網上常見的做法,親測不可用,不知問題點在哪)

  1. 開啟裝置中需要除錯的apk,在cmd中執行命令 :adb shell "dumpsys activity top | grep --color=always ACTIVITY"
    ,就可以看到需要除錯apk的包名、主acitivity以及程序號 在這裡插入圖片描述
  2. 使用命令以debug模式啟動apk:adb shell am start -D -n 包名/主activity名,然後你的裝置可以看到類似以下介面 在這裡插入圖片描述 在這裡插入圖片描述
  3. 再一次執行第一步的命令,獲取新的程序號:adb shell "dumpsys activity top | grep --color=always ACTIVITY" 或者執行命令: adb shell "ps | grep 包名"亦可 在這裡插入圖片描述 在這裡插入圖片描述
  4. 執行命令:adb forward tcp:debug埠 jdwp:apk程序號 ,建立除錯通道 在這裡插入圖片描述
  5. 然後跟DDMS除錯一樣,點選“Run”–"Debug"即可 【備註】其實,上面那些命令列的操作,現在可以直接在Android Studio中選擇即可,後面數字就是程序號 在這裡插入圖片描述

五、相關的命令列

  1. 顯示裝置當前的在前臺的Activity以及程序號:adb shell "dumpsys activity top | grep --color=always ACTIVITY" 在這裡插入圖片描述

  2. 顯示指定包名的程序號: adb shell "ps | grep 包名" 在這裡插入圖片描述

  3. ADB建立除錯通道:adb forward tcp:debug埠 jdwp:apk程序號 在這裡插入圖片描述

  4. 檢視與包名相關JDWP命令:adb shell "ps -t | grep -A 8 包名" 在這裡插入圖片描述

  5. 檢視所有JDWP程序命令:adb shell "ps -t | grep -B 6 JDWP" 在這裡插入圖片描述

  6. 顯示建立的除錯通道:adb forward --list 在這裡插入圖片描述

  7. 關閉ADB建立的除錯通道:adb forward --remove-all

  8. 以除錯模式啟動指定的應用:adb shell am start -D -n 包名/主activity名 在這裡插入圖片描述

  9. 設定指定應用以除錯模式啟動:adb shell am set-debug-app -w 包名 其中: set-debug-app : 用於設定待 Debug 的App。 -w: 表示設定為 wait 狀態,在程序被啟動的時候,等待 Debugger 進行除錯。 這樣,當我們再次執行 指定的 App 的時候,就會出現上面的 Waiting For Debugger 視窗,一直處於堵塞狀態,直到我們使用 Attach debugger to Android Process 的方式將其掛載上。 而這種方式是一次性的,再次執行就會恢復之前的狀態。但是就像前面說的,經常需要重複多次的 Debug 才能定位問題並且解決問題,那麼多次除錯則在所難免,如果每次都需要執行這個命令,明顯更麻煩了,有點得不償失。 其實 set-debug-app 還提供了一個 —persistent 的引數,設定一個需要持續除錯的 App。 完整的命令如下:

    adb shell am set-debug-app -w --persistent 包名

當使用 --persistent 標記之後,這個 App 就會一直被處於除錯模式來執行,所以每次啟動就會彈出 Waiting For Debugger 的視窗等待我們,哪怕我們解除安裝重新安裝,也不會改變。當然如果我們安裝一個 Release 簽名的同名 App ,必然不會處於Debug模式。 如果新增--persistent引數之後,除錯完成之後,還需要使用 clear-debug-app 來清理被標記為 debug 的 App。 完整的命令如下:

adb shell am clear-debug-app