Skip to main content

invictus_android 1.0.0 copy "invictus_android: ^1.0.0" to clipboard
invictus_android: ^1.0.0 copied to clipboard

PlatformAndroid

Android implementation of the invictus plugin.


AIGC: Label: "1" ContentProducer: 001191440300708461136T1XGW3 ProduceID: 5372e7330f8cf53c897f243b18f6f976_eb73a009b59811f188f9525400248c00 ReservedCode1: wLtQW98/Uwviw/EVYMNxSIPH1dnXo6fN6YyaJk2hTCDvzazXizaKA4+P5RdKLT9HY5xwN7SZziYiYSAS3Da7W9Fasw93jSx7MOrn3gYtblyWpGh1CcLxhgvx7D5Rvt2cPVTvcbGlgo0rjpjLsp84Zh6K8gRS9DVOvryqP3SEiBZXzHktOPhl3KgVkHQ= ContentPropagator: 001191440300708461136T1XGW3 PropagateID: 5372e7330f8cf53c897f243b18f6f976_eb73a009b59811f188f9525400248c00 ReservedCode2: wLtQW98/Uwviw/EVYMNxSIPH1dnXo6fN6YyaJk2hTCDvzazXizaKA4+P5RdKLT9HY5xwN7SZziYiYSAS3Da7W9Fasw93jSx7MOrn3gYtblyWpGh1CcLxhgvx7D5Rvt2cPVTvcbGlgo0rjpjLsp84Zh6K8gRS9DVOvryqP3SEiBZXzHktOPhl3KgVkHQ= #

invictus_android #

Android implementation of the invictus plugin. It implements the channel contracts declared in invictus_api by calling privileged Android platform APIs over JNI (package:jni); no MethodChannel is involved.

Packages #

Package Description
invictus Plugin facade used by applications. Re-exports invictus_api.
invictus_api Platform interface: API declarations (Xxx) plus channel contracts (XxxChannel). No platform code.
invictus_android Android implementation. Talks to the platform over JNI (package:jni), without MethodChannel.
invictus_darwin iOS/macOS implementation. registerWith() is currently empty, so no API is implemented yet.
example Demo app exercising every implemented API.

How it works #

Path Role
lib/src/invictus_android_plugin.dart InvictusAndroidPlugin.registerWith() assigns an XxxChannelImpl to every XxxChannel.instance. This file is the authoritative list of implemented APIs.
lib/src/impl/** One XxxImpl / XxxChannelImpl per API type, each wrapping the matching jni binding object.
lib/src/jni/** Bindings produced by jnigen; generated code that must not be edited by hand.
android/src/main/kotlin/dev/zeekr/invictus_android/** Kotlin side: JniXxx wrappers for hidden AOSP APIs, XxxCompat helpers, and the plugin entry point InvictusAndroidPlugin.kt.
android/src/main/cpp/ C++ shim (os.cpp, CMakeLists.txt) for the calls that need native code.
tool/jnigen.dart jnigen configuration: the AOSP and Kotlin classes to bind, plus the output directory.

Requirements #

Requirement Version
Dart SDK ^3.12.0
Flutter >= 3.44.0
Android minSdk 24
Android compileSdk 36
Java / Kotlin Java 17, Kotlin 2.4.0 (AGP 9.1.0)
CMake 3.22.1

Most wrapped AOSP methods require a signature-level or privileged permission — for example android.Manifest.permission.DUMP for bugreports or android.permission.REBOOT for PowerManager.reboot — so the host app is usually installed as a system app. The bundled example declares android:sharedUserId="android.uid.system" for that reason.

Getting started #

dependencies:
  invictus_android: ^1.0.0

Registration is automatic: Flutter's generated plugin registrant calls the Dart InvictusAndroidPlugin.registerWith(), so no manual initialization is required. Applications normally depend on invictus, which pulls this package in on Android.

Regenerating the JNI bindings #

cd invictus_android
dart run tool/jnigen.dart

The generator reads the AOSP classes listed in tool/jnigen.dart together with android/src/main/kotlin/, uses ../invictus/example as the Android example project, and writes the bindings into lib/src/jni/. Review the produced diff; never edit lib/src/jni/** by hand.

Conventions #

  • Three layers per type: the Xxx interface and its XxxChannel contract live in invictus_api; XxxImpl / XxxChannelImpl live here; registration happens in InvictusAndroidPlugin.registerWith().
  • Kotlin helpers are only written when the AOSP API is hidden or the Dart binding alone is not enough; they are listed in tool/jnigen.dart as well.
  • Project extensions are prefixed with Invictus$ (for example Invictus$UsbManager$UsbDeviceListenerX) so they never collide with AOSP members.

Development #

flutter pub get
dart format .
flutter analyze
flutter test

License #

See LICENSE.

(内容由AI生成,仅供参考)