Install
openclaw skills install flutterguard-cliReview Flutter Android APK/AAB release artifacts for manifest, permission, cleartext traffic, exported component, embedded secret, signing, size, WebView, deep link, and third-party service risks.
openclaw skills install flutterguard-cliUse this skill when the user provides an Android APK/AAB, asks whether a Flutter Android release artifact is safe, or asks for review of Android artifact security, permissions, embedded secrets, manifest risks, or release signing signals.
This is an agent workflow, not a standalone scanner. Inspect the artifact and report evidence. Do not silently change a user app's permissions, signing, dependencies, auth, payments, privacy behavior, production environment, publishing config, or API key migration strategy.
libapp.so.apkeep when available to fetch the APK first, then inspect the downloaded artifact.If the user wants review of a published app and has not provided an APK/AAB, use EFForg/apkeep when available to download the APK, then continue with the normal inspection workflow.
Keep this bounded:
Safe examples:
apkeep -a com.example.app .
apkeep -a com.example.app -d apk-pure .
apkeep -a com.example.app -d google-play -e user@example.com -t AAS_TOKEN .
If apkeep is missing, tell the user and ask them to install it or provide the APK/AAB manually.
Use whichever tools exist locally. If a tool is missing, say so and continue with the next best read-only method.
apkeep -a com.example.app .
file app-release.apk
du -h app-release.apk
unzip -l app-release.apk
jadx -d /tmp/flutterguard-jadx app-release.apk
aapt2 dump badging app-release.apk
aapt2 dump xmltree app-release.apk AndroidManifest.xml
apksigner verify --print-certs app-release.apk
keytool -printcert -jarfile app-release.apk
strings path/to/libapp.so > /tmp/flutterguard-libapp-strings.txt
rg -n "api[_-]?key|secret|token|bearer|private_key|client_secret|AIza|sk_live|pk_live|firebase|sentry|amplitude|mixpanel" /tmp/flutterguard-jadx
For AAB files, start with ZIP inspection. If bundletool is available and the user approves any generated intermediate output, an agent may build universal APKs for inspection, but this is optional tooling.
file app-release.aab
du -h app-release.aab
unzip -l app-release.aab
unzip -q app-release.aab -d /tmp/flutterguard-aab
Classify the artifact as Flutter when one or more strong signals exist:
assets/flutter_assets/ or base/assets/flutter_assets/lib/*/libapp.solib/*/libflutter.soio.flutter.embedding.android.FlutterActivityflutter_assets/AssetManifest.json, FontManifest.json, or NOTICES.ZIf Flutter evidence is absent, still perform Android artifact review, but state that Flutter-specific conclusions are not confirmed.
Identify artifact metadata.
aapt2 dump badging, decompiled AndroidManifest.xml, unzip -l.Decode or inspect the manifest.
aapt2 dump xmltree.Inspect resources and assets.
res/xml/network_security_config.xml, res/values/strings.xml, assets/, flutter_assets/, JSON/YAML/XML/env/config files, certificates, bundled databases, and web assets.Inspect native Flutter strings.
lib/*/libapp.so.strings to look for URLs, keys, tokens, feature flags, environment names, debug markers, private endpoints, and third-party service identifiers.strings; report only observable strings and risk.Inspect decompiled Android wrapper code.
MainActivity, custom Application, plugins, MethodChannel/EventChannel names, WebView usage, file providers, broadcast receivers, and platform code.Inspect signing and release signals.
apksigner or keytool for APK certificate evidence.AndroidManifest.xml; signing evidence comes from certificate tooling or source files if the user also provides the app source.Summarize third-party services.
android:debuggable="true" in a release artifact.addJavascriptInterface.android:allowBackup="true" or missing backup/data extraction controls for apps handling sensitive data.FileProvider paths.<uses-permission> and runtime-sensitive permission groups.android:exported; for older targets, intent filters can imply exported behavior.android:usesCleartextTraffic, referenced network security config, and domain-specific cleartext overrides.intent-filter entries with VIEW, BROWSABLE, DEFAULT, scheme, host, and path*.WebView, setJavaScriptEnabled, addJavascriptInterface, setAllowFileAccess, setMixedContentMode, and channel handlers that pass URLs.SharedPreferences, getExternalStorage, openFileOutput, SQLite, Room, DataStore, cache paths, and visible database files.libapp.so strings. Distinguish public mobile app identifiers from privileged secrets.Start at 100 and subtract:
Clamp score to 0-100.
Status:
SAFE: score 85-100 and no critical blockers.RISKY: score 60-84 or one unresolved high-risk issue.UNSAFE: score below 60 or any critical blocker.Use judgment when a single severe issue should block release even if the numeric score remains high. Explain that decision.
Never auto-edit these areas without explicit approval:
Safe automatic work may include generating a Markdown report, adding an audit checklist, suggesting tests, formatting the report, or removing obvious debug output only after the user has approved cleanup.
FlutterGuard APK Security Report
Artifact: path/to/app-release.apk
Flutter Evidence: confirmed | not confirmed | inconclusive
Status: SAFE | RISKY | UNSAFE
Score: 0-100
Critical:
- [severity] Finding title
Evidence: file/path or command output reference
Why it matters: concise release risk
Recommended action: human-approved fix or next check
High Risk:
- ...
Warnings:
- ...
Informational:
- Package: ...
- Version: ...
- Target SDK: ...
- ABIs: ...
- Detected services: ...
- Method channels: ...
Recommended Actions:
- ...
Requires Human Approval:
- ...
If no issue is found in a category, write None found from available evidence. Do not print full secrets. Redact secret values and report the path, type, and risk.