Flutter设备Root状态检测插件root_detector的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter设备Root状态检测插件root_detector的使用

root_detector 是一个用于检测设备是否具有Root权限的Flutter插件。它可以检查设备是否被Root或越狱,帮助开发者在应用中实现安全相关的功能。

检测逻辑

root_detector 使用以下方法来检测设备是否被Root:

  • 检查常见的Root工具和文件是否存在(如/system/bin/su/system/xbin/su等)。
  • 检查是否安装了BusyBox(某些Android设备上常用的工具)。
  • 检查是否安装了Cydia(iOS越狱后的应用商店)。

参数说明

参数 描述
busyBox 是否使用BusyBox进行Root检测,默认值为false
ignoreSimulator 是否忽略模拟器,默认值为false。如果设置为true,则不会在模拟器上进行Root检测。

配置说明

Android

对于Android设备,无需额外配置,直接使用即可。

iOS

对于iOS设备,需要在Info.plist文件中添加以下代码,以便检测Cydia的存在:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>cydia</string>
</array>

该文件位于/ios/Runner/目录下。

使用步骤

  1. 安装依赖pubspec.yaml文件中添加root_detector依赖:

    dependencies:
      root_detector: ^latest_version  # 建议使用最新版本
    
  2. 导入包 在Dart文件中导入root_detector包:

    import 'package:root_detector/root_detector.dart';
    
  3. 检测Root状态 使用RootDetector.isRooted()方法来检测设备是否被Root。该方法返回一个布尔值,表示设备是否被Root。

    try {
      final result = await RootDetector.isRooted(
        busyBox: true,  // 是否使用BusyBox进行检测,默认为false
        ignoreSimulator: true,  // 是否忽略模拟器,默认为false
      );
      print('Device is Rooted: $result');
    } on PlatformException catch (e) {
      print('Failed to get root status: ${e.message}');
    }
    

完整示例Demo

以下是一个完整的Flutter应用示例,展示了如何使用root_detector插件来检测设备是否被Root,并将结果显示在界面上。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:root_detector/root_detector.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _isRooted = 'Unknown';  // 初始化状态为未知

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();  // 初始化平台状态
  }

  // 异步方法,用于初始化平台状态并检测Root
  Future<void> initPlatformState() async {
    try {
      // 调用RootDetector.isRooted()方法检测Root状态
      final result = await RootDetector.isRooted(
        busyBox: true,  // 使用BusyBox进行检测
        ignoreSimulator: false,  // 不忽略模拟器
      );

      // 更新UI,显示检测结果
      setState(() {
        _isRooted = result.toString();  // 将结果转换为字符串
      });
    } on PlatformException catch (e) {
      // 如果发生错误,更新UI显示错误信息
      setState(() {
        _isRooted = 'Failed to get root status.';
      });
    }
  }

  [@override](/user/override)
  void setState(VoidCallback fn) {
    if (mounted) {
      super.setState(fn);  // 确保组件已挂载时才更新UI
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Root Detector'),  // 设置应用栏标题
        ),
        body: Center(
          child: Text('Device is Rooted: $_isRooted\n'),  // 显示Root检测结果
        ),
      ),
    );
  }
}

更多关于Flutter设备Root状态检测插件root_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter设备Root状态检测插件root_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用root_detector插件来检测设备Root状态的示例代码。

首先,你需要在你的Flutter项目中添加root_detector插件。你可以通过修改pubspec.yaml文件来完成这一步:

dependencies:
  flutter:
    sdk: flutter
  root_detector: ^x.y.z  # 请将x.y.z替换为插件的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用RootDetector类来检测设备是否已Root。以下是一个简单的示例代码,展示了如何在应用的启动屏幕上进行Root状态检测:

import 'package:flutter/material.dart';
import 'package:root_detector/root_detector.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Root Detector Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: RootDetectionScreen(),
    );
  }
}

class RootDetectionScreen extends StatefulWidget {
  @override
  _RootDetectionScreenState createState() => _RootDetectionScreenState();
}

class _RootDetectionScreenState extends State<RootDetectionScreen> {
  bool? isDeviceRooted;

  @override
  void initState() {
    super.initState();
    _checkDeviceRootStatus();
  }

  Future<void> _checkDeviceRootStatus() async {
    try {
      bool rooted = await RootDetector.isDeviceRooted;
      setState(() {
        isDeviceRooted = rooted;
      });
    } catch (e) {
      print("Error checking root status: $e");
      setState(() {
        isDeviceRooted = null;  // 或者你可以设置一个错误状态
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Root Detector Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Device Rooted:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              isDeviceRooted == null ? 'Checking...' : isDeviceRooted!.toString(),
              style: TextStyle(fontSize: 24, color: isDeviceRooted == true ? Colors.red : Colors.green),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,RootDetectionScreen是一个StatefulWidget,它在初始化时会调用_checkDeviceRootStatus方法来检测设备是否已Root。检测结果会保存在isDeviceRooted状态变量中,并显示在屏幕上。

请注意,RootDetector.isDeviceRooted是一个异步方法,它返回一个布尔值,表示设备是否已Root。如果检测过程中出现错误,你可以捕获异常并处理。

确保你在实际使用插件时查看其官方文档,以获取最新的使用方法和可能的更新。

回到顶部