一、ro.debuggable = 1
1.1 意義
ro.debuggable是Android系統中一個十分重要的屬性,在AndroidManifest.xml中很容易看到這樣一句話android:debuggable=”true”。該屬性為應用程序打開Debug調試模式,並且在打印堆棧的時候顯示代碼的行數。如果該屬性被設置為false,則在打印堆棧的時候將不顯示代碼的行數,比較不利於我們分析調試。
ro.debuggable = 1 代表目前設備處於Debug模式,在Debug模式下,系統會啟用日誌記錄,且在應用程序被簽名後,仍然可以在應用程序中調用系統的debug方法。
1.2 示例代碼
//獲取ro.debuggable屬性值 public static boolean isDebuggable() { return Log.isLoggable(TAG, Log.DEBUG) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && (0 != (ApplicationInfo.FLAG_DEBUGGABLE & mActivity.getApplicationInfo().flags))); }
二、ro.debuggable原理
2.1 意義
ro.debuggable原理是指Android系統是如何判斷當前debuggable屬性的值的。
Android系統中的屬性ro.debuggable是有一個SystemProperties類來維護的,可以用SystemProperties.get(“ro.debuggable”)來獲取它的值。當然,在安全保護的情況下,如果系統檢測到設備已經被Root過,則不允許讀取該值。
2.2 示例代碼
//使用SystemProperties獲取ro.debuggable屬性 public static boolean isDebuggable() { return SystemProperties.getInt("ro.debuggable", 0) == 1; }
三、rodebuggable
3.1 意義
rodebuggable是一個Android Studio中的Gradle插件,它在構建過程中會自動處理AndroidManifest.xml文件中的debuggable屬性,根據不同的構建類型,將debuggable的值設為true或false。
3.2 示例代碼
//在Gradle中使用rodebuggable插件設置debuggable屬性的值 android { buildTypes { debug { debuggable true } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' debuggable false } } }
四、ro.debuggable root
4.1 意義
ro.debuggable root是指在一個已經被Root的設備上,當應用程序請求應用程序的調試權限時,系統會認為這個應用程序是可信的,並授予應用程序調試權限。因此,在某些情況下,為了保護用戶的隱私,我們需要禁用root權限,並將ro.debuggable設為0,以禁用應用程序的調試權限。
4.2 示例代碼
//在Rooted設備上禁止ro.debuggable public static void disableDebugging() { try { File file = new File("/system/build.prop"); BufferedReader br = new BufferedReader(new FileReader(file)); String line; StringBuilder str = new StringBuilder(); while ((line = br.readLine()) != null) { if (line.contains("ro.debuggable")) { str.append("ro.debuggable=0\n"); //將ro.debuggable屬性改為0 } else { str.append(line).append("\n"); } } br.close(); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(str.toString().getBytes()); bos.close(); Runtime.getRuntime().exec(new String[]{"su", "-c", "mount -o remount,ro /system"}); } catch (IOException e) { e.printStackTrace(); } }
五、ro.debuggable=1無法調試
5.1 意義
ro.debuggable = 1是表示應用程序已經被調試,如果需要再次調試,則需要關閉應用程序,重新打開,才能使調試生效。如果在一個已經打開的應用程序界面上更改了ro.debuggable的值,將不會生效。
5.2 示例代碼
//判斷當前應用程序是否處於debuggable狀態 public static boolean isDebuggable() { return (0 != (mContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); }
六、ro.debuggable image kitchen
6.1 意義
ro.debuggable image kitchen是一個工具,用於製作可以從USB啟動的Linux映像文件,它可以為Android系統開發人員提供一個輕量級的Linux開發環境。
6.2 示例代碼
//無代碼示例
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200227.html