Этап 0 п.1: release собираем и подписан (signingConfig из env + R8-правила)

- signingConfig.release читает F7_KEYSTORE_FILE/PASSWORD, F7_KEY_ALIAS/PASSWORD
  из env или -P; фолбэк на debug-подпись если не заданы. Схемы v2+v3.
- R8: app/proguard-rules.pro (kotlinx.serialization, Firebase, JS-мосты, Coil);
  vendor consumer-rules.pro через consumerProguardFiles (WebRTC/LoganSquare/Dagger/
  RxJava/Parceler/EventBus + dontwarn geogson/joda из missing_rules.txt).
- Проверено на инфре B (JDK 21 + Android SDK 36): assembleRelease BUILD SUCCESSFUL,
  подписанный APK 99 МБ (было ~130 debug), apksigner verify v2+v3 OK.
- Доки: docs/RELEASE-SIGNING.md, docs/AUDIT-2026-07-07.md.
This commit is contained in:
b-dev-mobile
2026-07-07 13:17:20 +00:00
parent 1641ad8ab8
commit 67cc851b15
6 changed files with 227 additions and 1 deletions
+83
View File
@@ -0,0 +1,83 @@
# Consumer ProGuard/R8 rules для :vendor:talk-app (F7cloud).
# Эти правила ПРОПАГИРУЮТСЯ в R8 приложения :app (vendor собирается как library
# с minifyEnabled false, поэтому обычные proguardFiles на потребителя не влияют
# нужен именно consumerProguardFiles, см. app/build.gradle).
# Защищают зависимости vendor-форка Nextcloud Talk от переименования/удаления R8.
# --- WebRTC (JNI: нативный libjingle_peerconnection_so.so зовёт org.webrtc.* по имени) ---
-keep class org.webrtc.** { *; }
-dontwarn org.webrtc.**
# --- LoganSquare (converter Talk API: сгенерированные $$JsonObjectMapper через рефлексию) ---
-keep class com.bluelinelabs.logansquare.** { *; }
-keep @com.bluelinelabs.logansquare.annotation.JsonObject class * { *; }
-keep class **$$JsonObjectMapper { *; }
-keepnames class * extends com.bluelinelabs.logansquare.JsonMapper
-keepclassmembers class * {
@com.bluelinelabs.logansquare.annotation.JsonField *;
}
# --- Jackson core (используется LoganSquare) ---
-dontwarn com.fasterxml.jackson.**
-keep class com.fasterxml.jackson.** { *; }
# --- Модели Talk API (парсятся LoganSquare/Gson по именам полей) ---
-keep class ru.f7cloud.talk.models.** { *; }
# --- Gson (converter-gson + модели) ---
-keepattributes Signature,*Annotation*,EnclosingMethod,InnerClasses
-keep class com.google.gson.** { *; }
-dontwarn com.google.gson.**
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# --- Retrofit 2 ---
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keepclasseswithmembers class * { @retrofit2.http.* <methods>; }
-dontwarn retrofit2.**
-dontwarn okio.**
-keepattributes RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations
# --- Parceler (сгенерированные $$Parcelable) ---
-keep class **$$Parcelable { *; }
-keep interface org.parceler.Parcel
-keep @org.parceler.Parcel class * { *; }
-keepclassmembers class **$$Parcelable {
public static final ** CREATOR;
}
# --- EventBus (@Subscribe вызывается рефлексией) ---
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keep class org.greenrobot.eventbus.android.** { *; }
# --- Dagger / autodagger2 ---
-dontwarn dagger.**
-dontwarn com.github.lukaspili.autodagger2.**
# --- RxJava2 (опциональные зависимости на этапе компиляции) ---
-dontwarn java.util.concurrent.Flow*
-dontwarn sun.misc.**
-dontwarn org.reactivestreams.**
# --- Conscrypt (опциональный security-provider) ---
-dontwarn org.conscrypt.**
-keep class org.conscrypt.** { *; }
# --- прочие опциональные/аннотационные зависимости, на которые ругается R8 ---
-dontwarn javax.annotation.**
-dontwarn org.bouncycastle.**
-dontwarn org.slf4j.**
-dontwarn okhttp3.internal.platform.**
# --- недостающие опциональные refs (из missing_rules.txt R8): geogsonстарая guava,
# joda-convert аннотации joda-time (maps-стек Talk). Классы отсутствуют в рантайме,
# код их не вызывает безопасно подавить. ---
-dontwarn com.google.common.base.Objects$ToStringHelper
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString