flutter如何检测手机是否越狱

在Flutter开发中,如何检测Android或iOS设备是否已越狱/root?有没有可靠的第三方库或原生代码方案?需要注意哪些平台差异和权限问题?求具体实现示例和兼容性建议。

2 回复

Flutter可通过flutter_jailbreak_detection插件检测越狱。调用JailbreakDetection.jailbroken方法,返回布尔值判断设备是否越狱。适用于iOS和Android平台。

更多关于flutter如何检测手机是否越狱的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中检测手机是否越狱可以通过平台通道调用原生代码实现。以下是具体实现方法:

Android端检测方法:

import 'package:flutter/services.dart';

class JailbreakDetection {
  static const MethodChannel _channel = MethodChannel('jailbreak_detection');

  static Future<bool> get isJailbroken async {
    try {
      return await _channel.invokeMethod('isJailbroken');
    } on PlatformException {
      return false;
    }
  }
}

Android原生代码(Kotlin):

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "jailbreak_detection").setMethodCallHandler { call, result ->
            when (call.method) {
                "isJailbroken" -> result.success(isJailbroken())
                else -> result.notImplemented()
            }
        }
    }

    private fun isJailbroken(): Boolean {
        val checks = arrayOf(
            "/system/app/Superuser.apk",
            "/sbin/su",
            "/system/bin/su",
            "/system/xbin/su",
            "/data/local/xbin/su",
            "/data/local/bin/su",
            "/system/sd/xbin/su",
            "/system/bin/failsafe/su",
            "/data/local/su"
        )
        
        return checks.any { File(it).exists() } || 
               checkBuildTags() || 
               checkSuCommand()
    }

    private fun checkBuildTags(): Boolean {
        return Build.TAGS?.contains("test-keys") == true
    }

    private fun checkSuCommand(): Boolean {
        return try {
            Runtime.getRuntime().exec("su")
            true
        } catch (e: Exception) {
            false
        }
    }
}

iOS端检测方法:

// 使用相同的Dart接口

iOS原生代码(Swift):

import Flutter

public class SwiftJailbreakDetectionPlugin: NSObject, FlutterPlugin {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "jailbreak_detection", binaryMessenger: registrar.messenger())
    let instance = SwiftJailbreakDetectionPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    switch call.method {
    case "isJailbroken":
      result(isJailbroken())
    default:
      result(FlutterMethodNotImplemented)
    }
  }

  private func isJailbroken() -> Bool {
    if TARGET_OS_SIMULATOR != 0 { return false }
    
    let paths = [
      "/Applications/Cydia.app",
      "/Library/MobileSubstrate/MobileSubstrate.dylib",
      "/bin/bash",
      "/usr/sbin/sshd",
      "/etc/apt"
    ]
    
    for path in paths {
      if FileManager.default.fileExists(atPath: path) {
        return true
      }
    }
    
    // 检查能否写入系统目录
    let stringToWrite = "Jailbreak Test"
    do {
      try stringToWrite.write(toFile: "/private/jailbreak.txt", atomically: true, encoding: .utf8)
      try FileManager.default.removeItem(atPath: "/private/jailbreak.txt")
      return true
    } catch {
      return false
    }
  }
}

使用方式:

bool isJailbroken = await JailbreakDetection.isJailbroken;
if (isJailbroken) {
  print("设备已越狱");
} else {
  print("设备未越狱");
}

注意事项:

  1. 越狱检测不是100%可靠,可能被绕过
  2. 在iOS模拟器上默认返回未越狱
  3. 建议结合其他安全检测措施
  4. 需要分别在Android和iOS项目中注册原生代码

这种方法通过检查常见的越狱文件和系统特征来判断设备是否越狱。

回到顶部