一、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
微信掃一掃
支付寶掃一掃