device_safety_info
Device Safety Info Flutter Plugin used for checking JailBreak, Rooted Device, Emulator/Simulator, External storage, VPN Detector, Application Update Checker and Screen Lock.
1.4.0
2.6K downloads/mo
#4903 most downloaded on pub.dev
devamitkumartiwari/devicesafetyinfo
What this package is like to depend on
Last release 11 days ago
13 Aug 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 17 of 18 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
18 releases · first in 2023
7 releases in the last 12 months
see the full history below
Release timeline
18 releases · Oct 2023 to Aug 2026Releases
latest 18-
1.4.013 Aug 2026Release notes
Open source →New checks — Android banking-malware defenses (added in response to advisory coverage of Android banking trojans like TrickMo/PhantomCall):
- New: Notification Listener enumeration —
enabledNotificationListeners/isAnyNotificationListenerEnabledsurface which apps currently hold notification-listener access (the mechanism banking trojans commonly abuse to intercept OTP/SMS notifications). Android only. - New: Unknown-sources / sideloading check —
isUnknownSourcesEnabled. On Android 8+ this can only answer "has this app been granted install rights" (not "has some other app"), a real API limitation documented in the getter's own doc comment. RequiresREQUEST_INSTALL_PACKAGES(query-only, never installs anything) — strip it viatools:node="remove"in your manifest if you don't use this check. - New: Call-screening role —
isCallScreeningRoleAvailable,isCallScreeningRoleHeldByThisApp,openCallScreeningRoleSettings(). Android'sRoleManager.getRoleHolders()(which would reveal which app holds the role) is a privileged system API unavailable to third-party apps — these three cover what's actually achievable: capability check, self-check, and a settings deep-link so the user can review the current holder themselves. Android only, API 29+. - New: Call activity detection —
onCallActivityChangedstream +isCallActivegetter detect when any call (native SIM or a VoIP call from WhatsApp/Teams/Skype/Meet/imo/etc.) starts or ends, without identifying which app is calling (not achievable on either platform). Android:TelephonyManager(SIM, needsREAD_PHONE_STATE) + system-wideAudioManagerrouting state (any VoIP app, generically). iOS:CXCallObserver(CallKit) +AVAudioSessioninterruption notifications. Detect-only, like every other stream in this plugin — no lockdown/navigation policy is embedded. Native listeners only run while the stream has an active subscriber.
Dependency removal (eliminates consumer version-conflict risk from this plugin's own
dependencies:):- Removed
connectivity_plus,package_info_plus, andhttp— replaced with a nativedevice_safety_info/connectivity_eventsEventChannel, a nativegetPackageInfoMethodChannel call, and a minimaldart:io HttpClient-based helper (lib/src/http/simple_http_get.dart) respectively.VPNCheck,NewVersionChecker, andIOCDomainBlockerare unaffected from the outside.
Toolchain modernization (Flutter 3.47 plugin-template baseline):
- Breaking (iOS): minimum iOS version raised
13.0→16.0. - Fix (iOS — Swift Package Manager):
Package.swiftmoved from the flatios/Package.swifttoios/device_safety_info/Package.swift— the path Flutter's tooling actually scans for plugin SPM support (Plugin.pluginSwiftPackageManifestPathinflutter_tools). The previous flat location was never discovered by Flutter's build system, so SPM support was silently non-functional despite being present; only the CocoaPods path was ever exercised. The native C FFI source now lives in its own SPM target (device_safety_ffi) since SwiftPM doesn't support mixed Swift+C sources in one target. - Dependency: Android toolchain baseline bumped to match the Flutter 3.47 plugin template — Gradle
8.14→9.3.1, Android Gradle Plugin8.12.1→9.1.0, Kotlin2.2.20→2.4.0. - Dependency:
flutter_lintsany→^6.0.0. - Removed the plugin's Kotlin-level (
android/src/test/kotlin) unit test in favor of relying solely on the Dart-level test suite (test/device_safety_info_test.dart) — one less native test dependency (kotlin-test,mockito-core) to keep in sync, and this plugin's actual public surface is the Dart API.
- New: Notification Listener enumeration —
-
1.3.029 Jul 2026Release notes
Open source →- Fix (Android — 16 KB page size):
libdevice_safety_ffi.sois now linked with-Wl,-z,max-page-size=16384/common-page-size=16384, fixing Google Play Console's "native library not 16 KB compatible" warning forarm64-v8aandx86_64. - Fix (Android — build): the plugin module now declares its own self-contained
buildscriptclasspath and explicitly applies the Kotlin Android Gradle plugin, instead of relying on transitive application via Flutter's Gradle plugin — that assumption didn't hold under all AGP/Gradle declarative-plugins{}configurations, causing Kotlin sources to silently not compile andcannot find symbol DeviceSafetyInfoPluginbuild failures (#14). - New: Overlay Attack Detection —
onOverlayAttackDetectedstream andblockTouchesWhenObscured()detect/block touches delivered while another app is drawing an overlay on top of yours (tapjacking). Android only; throwsPlatformException('UNSUPPORTED_PLATFORM', ...)on iOS, where app sandboxing makes cross-app overlays structurally impossible. - New: Clipboard Protection —
copyToClipboard()(withsensitive+autoClearoptions),clearClipboard(), andonClipboardChangedstream. Android:ClipDescription.EXTRA_IS_SENSITIVE(API 33+). iOS:UIPasteboard.expirationDate/.localOnly. Android + iOS. - New:
IOCDomainBlocker— lightweight IOC/C2 domain-reputation lookup (isBlocked,updateBlocklist,loadRemoteBlocklist) to wire into your own HTTP client or WebView guard. Pure Dart, no native dependency. Android + iOS. - New: Malware Package Detection —
MalwarePackageDetector.isPackageInstalled()/scanKnownMalware()check specific package names against a list you supply. Android only. Requires declaring each package name in your app's own<queries>manifest block (Android 11+ package visibility filtering) — this plugin deliberately doesn't request the broaderQUERY_ALL_PACKAGESpermission, which Google Play gates behind manual approval and would be merged into every app depending on this plugin. - New: Accessibility Abuse Detection —
DeviceSafetyInfo.enabledAccessibilityServices/isAnyAccessibilityServiceEnabledreadSettings.Secure.ENABLED_ACCESSIBILITY_SERVICES. Android only, no new permission. - New: Play Protect Status —
DeviceSafetyInfo.playProtectStatusreads thepackage_verifier_user_consentOS setting Play Protect's toggle controls. Android only, no new permission or dependency. (SafetyNet's Verify Apps API, the old documented way to read this, was fully retired in January 2025.) - New: Idle Session Timeout —
IdleTimeoutGuardwidget fires a callback after a period of no touch activity anywhere in the wrapped subtree. Pure Dart, no native code, Android + iOS. - New: Risk Summary —
RiskSummary.evaluate()aggregates the rooted/hooked/debugger/screen-capture/VPN/ screen-lock checks into a list of plain-languageRiskFlags. Pure Dart, no new platform channel calls.
- Fix (Android — 16 KB page size):
-
1.2.024 Jun 2026Release notes
Open source →- Fix (Android — ANR):
isRootedDeviceandisHookednow run on a background thread pool — eliminates main-thread shell spawning and ANR risk. - Fix (Android — Performance):
SystemPropsCheckernow reads system properties viaandroid.os.SystemPropertiesreflection (zero-cost cache read) before falling back togetpropshell spawn — worst-case latency for 4 property checks drops from ~800 ms to near-zero. - Fix (Android):
ShellExecutormigrated fromRuntime.exec()toProcessBuilder— stdout is now drained concurrently withwaitFor, eliminating a race condition wherereadLine()blocked after the timeout expired. - Fix (Android): API-34
ScreenCaptureCallbackexecutor was never shut down onstopScreenshotDetection()— fixed resource leak. - New (Android): 30-second TTL result cache for
isRootedDeviceandisHooked— repeated polls within the window return immediately without spawning any processes. - Dependency (Android): Kotlin updated
1.9.22→2.2.0; Android Gradle Plugin8.2.2→8.12.1. - Dependency (iOS SPM):
swift-tools-versionbumped5.9→6.0(compiles in Swift 5 language mode — no source changes needed). - Dependency (iOS SPM): IOSSecuritySuite minimum version raised from
1.9.0to1.9.11. - Dependency (Dart): Dart SDK floor raised to
>=3.5.0; Flutter floor raised to>=3.24.0— this also fixes the "Swift Package Manager not supported" flag on pub.dev (pub.dev requires Flutter ≥ 3.19.0 to recognise SPM support).flutter_lintspinned to^6.0.0.
- Fix (Android — ANR):
-
1.1.004 May 2026Release notes
Open source →- New:
onScreenshotTakenstream — fires when the user takes a screenshot. Android API 34+: usesActivity.ScreenshotCallback(no permission needed). Android API 24–33: usesMediaStoreContentObserver(host app must holdREAD_MEDIA_IMAGESat runtime). iOS:UIApplication.userDidTakeScreenshotNotification(no permission needed). - New:
setRecentsOverlay({int argbColor})— shows a solid-color overlay over the app thumbnail in the recent-apps switcher. Automatically shown on background, hidden on foreground. Android + iOS. - New:
clearRecentsOverlay()— removes the recents overlay. - Fix:
blockScreenshots()now works on iOS via theUITextField.isSecureTextEntrylayer trick — the key window'sCALayeris re-parented into the text field's secure sublayer, which the system protects from screenshots and recordings. - New:
dart:ffinative C/C++ layer — Frida/proc/self/mapsscan + port scan (27042/27043), rootstat()check, and debuggerTracerPidcheck all run below the JVM/Swift runtime, making them significantly harder to hook - New: Swift Package Manager (SPM) support via
Package.swift— Flutter 3.19+ projects can now resolve the plugin without CocoaPods - New:
isDebuggerAttachedAPI — detects attached debuggers via native sysctl (iOS) and TracerPid (Android) - New:
isHookednow implemented on iOS viaIOSSecuritySuite.amIReverseEngineered() - New:
checkFridaByMaps()andcheckRootFilesNative()exposed as standalone public APIs - Fix:
isRootedDevicenow combines native Cstat()check with JVM-level check — false negatives from hookedFile.exists()no longer silently bypass detection - Fix:
isVPNCheckandisRootedDevicewere returningtrueas default on null/error — corrected tofalse - Fix:
ScreenCaptureDetectorwas flagging HDMI monitors and Chromecast as screen captures — fixed withFLAG_PRESENTATIONcheck - Fix:
ro.debuggable=1was incorrectly flagging all developer/debug builds as rooted — removed from root detection - Fix:
com.google.android.packageinstallerwas listed as a trusted store — it is the APK sideload installer; removed - Fix: iOS
#if TARGET_OS_SIMULATORC macro silently had no effect in Swift — corrected to#if targetEnvironment(simulator) - Fix: iOS
UIScreen.main.isCaptureddeprecated in iOS 16 — replaced with scene-based API with fallback - Fix:
blockScreenshots/hideMenureturned success silently whenActivitywas null — now returnserror("NO_ACTIVITY") - Fix:
exitProcess(0)was called beforeresult.success()— Dart Future now resolves before process exits - Fix:
DisplayListenerwas not unregistered on engine detach — memory leak fixed - Fix:
VPNCheckstream now emits initial VPN state immediately on creation - Fix:
ShellExecutortimeout increased from 50 ms to 200 ms; stderr now drained to prevent process hangs - Fix: Production
print()calls replaced withdebugPrint()throughout - Fix: Podspec metadata (version, description, homepage, author) updated from placeholder values
- Removed:
ro.debuggablefalse-positive root indicator - Removed:
com.google.android.packageinstallerfrom trusted stores - Removed: Unused
LaunchModeVersionenum - Removed: Dead pre-API-17 code path in
DevelopmentModeCheck(minSdk is 24)
- New:
-
1.0.423 Feb 2026Nothing published for this version
-
1.0.324 Sep 2025Release notes
Open source →- @magnus-lpa thank you for contributing screen lock issue in iOS
- @UADACID thank you for pointing out 16KB issue in Android fixed
-
1.0.218 Sep 2025Release notes
Open source →Note: This release has breaking changes. On Android plugin now requires the following:
- Android Gradle Plugin >=8.12.1
- Gradle wrapper >=8.13
- Kotlin 2.2.0
-
1.0.117 Jul 2025 -
1.0.010 May 2025Release notes
Open source →- Dependency updated
- iOS issue fixed
- Application is installed from store check feature added
- Local and store version check feature added
-
0.0.908 Oct 2024Release notes
Open source →- Dependency updated
- iOS issue fixed
- @jiazeh thank you for contributing
- AndroidManifest.xml issue fixed
-
0.0.812 Aug 2024 -
0.0.709 Aug 2024 -
0.0.609 Aug 2024 -
0.0.508 Aug 2024Release notes
Open source →- Dependency updated
- AGP version updated
- Kotlin version updated
- Code refactoring
-
0.0.419 Apr 2024Release notes
Open source →- Dependency updated
- AGP version updated
- Kotlin version updated
- Code refactoring
-
0.0.322 Feb 2024 -
0.0.218 Oct 2023 -
0.0.118 Oct 2023Release notes
Open source →- Flutter JailBreak, Rooted, Emulator/Simulator, External storage, VPN Detector, Application Update Checker and Screen Lock detection.