Device compatibility (regression fix): - The CAMERA permission (from zxing_barcode_scanner / image_picker) implicitly required android.hardware.camera, excluding camera-less devices — Play showed Automotive -96%, Chromebook -86%, TV -25%. Declare camera & location uses-feature required="false" to keep those devices supported. - Detect a real camera at runtime (PackageManager.FEATURE_CAMERA_ANY via the existing MethodChannel), cache it at bootstrap, and hide the QR scan button and the camera photo-source option when absent, so no broken actions are offered. Play "app optimization" recommendations: - Enable R8 (isMinifyEnabled + isShrinkResources) with keep rules for the OCR (tesseract4android), SQLCipher and notifications JNI/reflection code. - Bitmap downscaling: cacheWidth/cacheHeight (and ResizeImage for avatars) on list thumbnails and avatars so photos decode to on-screen size, not full res. - Edge-to-edge: opt in with transparent system bars in main(). Release flow: - Tagged builds now publish to the production track at 100% (was internal); add a manual deploy_internal lane as a QA safety net. - Document country/region availability as a Play Console setting (not in-repo).
40 lines
1.7 KiB
Prolog
40 lines
1.7 KiB
Prolog
# R8/ProGuard keep rules for Tane (org.comunes.tane).
|
|
#
|
|
# R8 is enabled for release builds (see build.gradle.kts). It shrinks/optimizes
|
|
# the Java/Kotlin bytecode and can break code reached only via reflection or JNI
|
|
# — the native plugins below load their Java classes from C, so R8 can't see the
|
|
# references and would strip/rename them. Keep them explicitly. Start
|
|
# conservative; trim only after a release smoke test proves a class is unused.
|
|
|
|
# --- Flutter engine & embedding (defensive; usually handled by the plugin) ---
|
|
-keep class io.flutter.** { *; }
|
|
-keep class io.flutter.plugins.** { *; }
|
|
-dontwarn io.flutter.embedding.**
|
|
|
|
# --- On-device OCR: tesseract4android (JNI) ---
|
|
# libtesseract/libleptonica call back into these Java classes by name.
|
|
-keep class com.googlecode.tesseract.android.** { *; }
|
|
-keep class com.googlecode.leptonica.android.** { *; }
|
|
-keep class io.paratoner.flutter_tesseract_ocr.** { *; }
|
|
|
|
# --- QR scanning: zxing_barcode_scanner (pure ZXing, platform view) ---
|
|
-keep class com.shirisharyal.zxing_barcode_scanner.** { *; }
|
|
|
|
# --- Encrypted DB: SQLCipher / sqlite3 native loader ---
|
|
# sqlite3 is reached over FFI (dlopen), but keep the loader plugin classes.
|
|
-keep class eu.simonbinder.sqlite3_flutter_libs.** { *; }
|
|
-keep class net.zetetic.** { *; }
|
|
-dontwarn net.zetetic.**
|
|
|
|
# --- Local notifications ---
|
|
# Published keep rules for flutter_local_notifications' Gson-serialized models.
|
|
-keep class com.dexterous.** { *; }
|
|
-keep class com.google.gson.** { *; }
|
|
-keep class * extends com.google.gson.TypeAdapter
|
|
-keepattributes Signature
|
|
-keepattributes *Annotation*
|
|
-dontwarn com.google.errorprone.annotations.**
|
|
|
|
# --- Core library desugaring ---
|
|
-dontwarn java.lang.invoke.**
|
|
-dontwarn build.IgnoreJava8API
|