android: the handoff — the pending rounds, the pipeline, and what is unverified
Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
This commit is contained in:
1 parent
867fd42972
commit
9f0601027c
400 files changed
+26401
-3
No files matched your search
@@ -0,0 +1,38 @@
|
||||
# Consumer R8/ProGuard rules for the storage plugin. Gradle hands a consumer
|
||||
# file to whatever app links this module, and it is INERT unless that app
|
||||
# minifies: src-tauri/gen/android/app/build.gradle.kts sets
|
||||
# isMinifyEnabled = true for the `release` build type and false for `debug`,
|
||||
# and the debug type names no proguard files at all. The deploy pipeline
|
||||
# builds debug, so nothing in this file reaches it.
|
||||
#
|
||||
# Nothing below is called from Kotlin, which is the whole problem. Tauri
|
||||
# reaches this plugin by STRING, at three layers:
|
||||
#
|
||||
# 1. register_android_plugin("com.soulstream.storage", "StoragePlugin") is
|
||||
# turned into "com/soulstream/storage/StoragePlugin" and handed to
|
||||
# FindClass; the instance is built through the JNI signature
|
||||
# "(Landroid/app/Activity;)V" (tauri/src/plugin/mobile.rs).
|
||||
# 2. PluginHandle.indexMethods() files every @Command under
|
||||
# commands[method.name] and every @ActivityCallback under
|
||||
# startActivityCallbackMethods[method.name]; invoke() looks up the name
|
||||
# Rust asked for and throws "No command pickFolder found for plugin ..."
|
||||
# when it is not there.
|
||||
# 3. Jackson fills the @InvokeArg classes FIELD by field — PluginManager
|
||||
# sets FIELD visibility to ANY — so field names weigh the same as
|
||||
# method names.
|
||||
#
|
||||
# Six commands (pickFolder, allFilesAccess, requestAllFilesAccess, pickImage,
|
||||
# pickFile, createDocument) and four activity callbacks (folderPicked,
|
||||
# imagePicked, filePicked, documentCreated). createDocument is the easy one
|
||||
# to miss by hand: it has no JS-facing command at all, it is called from Rust
|
||||
# by playlist export.
|
||||
#
|
||||
# Tauri's own consumer rules already match all of this by annotation
|
||||
# (-keep @TauriPlugin public class * { @Command public <methods>; ... }).
|
||||
# These name it outright anyway: theirs are generic, ours are specific, the
|
||||
# failure is silent and user-facing, and nobody has built a release APK of
|
||||
# this app yet to find out which of us was needed. Narrow them once a release
|
||||
# build has actually been smoke-tested command by command.
|
||||
-keep class com.soulstream.storage.StoragePlugin { *; }
|
||||
-keep class com.soulstream.storage.CreateDocumentArgs { *; }
|
||||
-keep class com.soulstream.storage.PickFileArgs { *; }
|
||||
Reference in new issue
Block a user