检测是否调试APP
这个原理就是APP的AndroidManifest.xml文件中application是否配置了android:debuggable="true",设置true支持动态调试public static boolean isAppDebuggable(Context context) {
return (context.getApplicationInfo().flags & 2) != 0;}
检测当前APP是否被动态调试中
public static boolean isDebuggerAttached() {return Debug.isDebuggerConnected() || Debug.waitingForDebugger();}
检测是否模拟器
这里获取了Android id,如果Android id是null,就是模拟器?如果包含GOLDFISH字符串也属于模拟器
public static boolean isEmulator(Context context) {return Build.PRODUCT.contains(SDK) || Build.HARDWARE.contains(GOLDFISH) || Build.HARDWARE.contains(RANCHU) || Settings.Secure.getString(context.getContentResolver(), "android_id") == null;}
root检测
检测系统的tags是不是test-keys。
检测是不是安装了supersu的APP,检测su文件是否存在。
public static boolean isRooted(Context context) {boolean isEmulator = isEmulator(context);String str = Build.TAGS;if ((isEmulator || str == null || !str.contains("test-keys")) && !new File("/system/app/Superuser.apk").exists()) {return !isEmulator && new File("/system/xbin/su").exists();}return true;}
判断一些root的APP是否安装
private final boolean a(List<String> list) {PackageManager packageManager = this.b.getPackageManager();boolean z = false;for (String str : list) {try {packageManager.getPackageInfo(str, 0);C0339Io.h.e(str + " ROOT management app detected!");z = true;} catch (PackageManager.NameNotFoundException unused) {}}return z;}
通过which su寻找su文件
public final boolean f() {/*r5 = this;r0 = 0r1 = 0java.lang.Runtime r2 = java.lang.Runtime.getRuntime() // Catch: java.lang.Throwable -> L2fjava.lang.String r3 = "which"java.lang.String r4 = "su"java.lang.String[] r3 = new java.lang.String[]{r3, r4} // Catch: java.lang.Throwable -> L2fjava.lang.Process r1 = r2.exec(r3) // Catch: java.lang.Throwable -> L2fjava.io.BufferedReader r2 = new java.io.BufferedReader // Catch: java.lang.Throwable -> L2fjava.io.InputStreamReader r3 = new java.io.InputStreamReader // Catch: java.lang.Throwabl

本文介绍了如何通过检查AndroidManifest.xml配置、应用是否被调试、识别模拟器、检测root权限、分析APP安装列表以及无障碍服务,提供了一套全面的APP环境检测方法。
最低0.47元/天 解锁文章
1823

被折叠的 条评论
为什么被折叠?



