Этап 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:
@@ -9,10 +9,32 @@ if (googleServicesFile.exists()) {
|
||||
apply plugin: 'com.google.gms.google-services'
|
||||
}
|
||||
|
||||
// Release-подпись читается из окружения/gradle-properties (боевой keystore вне git,
|
||||
// в CI — из secrets). Переменные: F7_KEYSTORE_FILE, F7_KEYSTORE_PASSWORD,
|
||||
// F7_KEY_ALIAS, F7_KEY_PASSWORD (можно и как -P… gradle-property). Если не заданы —
|
||||
// release подписывается debug-ключом (локальная сборка/QA работает без keystore).
|
||||
def f7KeystoreFile = System.getenv('F7_KEYSTORE_FILE') ?: project.findProperty('F7_KEYSTORE_FILE')
|
||||
def f7HasReleaseSigning = f7KeystoreFile != null && file(f7KeystoreFile).exists()
|
||||
|
||||
android {
|
||||
namespace 'ru.forbion.f7cloud.mobile'
|
||||
compileSdk 36
|
||||
|
||||
signingConfigs {
|
||||
if (f7HasReleaseSigning) {
|
||||
release {
|
||||
storeFile file(f7KeystoreFile)
|
||||
storePassword System.getenv('F7_KEYSTORE_PASSWORD') ?: project.findProperty('F7_KEYSTORE_PASSWORD')
|
||||
keyAlias System.getenv('F7_KEY_ALIAS') ?: project.findProperty('F7_KEY_ALIAS')
|
||||
keyPassword System.getenv('F7_KEY_PASSWORD') ?: project.findProperty('F7_KEY_PASSWORD')
|
||||
// v2 обязателен (minSdk 26); v3 — под будущую ротацию ключа. v1 не нужен (minSdk>=24).
|
||||
enableV1Signing false
|
||||
enableV2Signing true
|
||||
enableV3Signing true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId 'ru.forbion.f7cloud.mobile'
|
||||
minSdk 26
|
||||
@@ -35,6 +57,8 @@ android {
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
// боевой keystore — если задан env/-P; иначе debug-ключ (не для распространения)
|
||||
signingConfig f7HasReleaseSigning ? signingConfigs.release : signingConfigs.debug
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vendored
+51
-1
@@ -1 +1,51 @@
|
||||
# Project specific ProGuard rules.
|
||||
# ProGuard/R8 rules приложения :app (F7cloud Mobile).
|
||||
# Vendor-зависимости (WebRTC/LoganSquare/Dagger/RxJava/Parceler/EventBus) держат
|
||||
# vendor/talk-android/app/consumer-rules.pro (доезжает сюда через consumerProguardFiles).
|
||||
# Здесь — правила для КОДА ПРИЛОЖЕНИЯ и его прямых библиотек.
|
||||
|
||||
# --- Общие атрибуты (нужны рефлексии/сериализации/отладке стектрейсов) ---
|
||||
-keepattributes Signature,*Annotation*,EnclosingMethod,InnerClasses
|
||||
-keepattributes SourceFile,LineNumberTable
|
||||
-renamesourcefileattribute SourceFile
|
||||
|
||||
# --- kotlinx.serialization (@Serializable в feature-модулях) ---
|
||||
# Держим сгенерированные сериализаторы; без этого @Serializable падает в рантайме.
|
||||
-keepclassmembers @kotlinx.serialization.Serializable class ** {
|
||||
*** Companion;
|
||||
*** INSTANCE;
|
||||
kotlinx.serialization.KSerializer serializer(...);
|
||||
}
|
||||
-keepclasseswithmembers class ** {
|
||||
@kotlinx.serialization.Serializable <fields>;
|
||||
}
|
||||
-keep,includedescriptorclasses class ru.forbion.f7cloud.**$$serializer { *; }
|
||||
-dontwarn kotlinx.serialization.**
|
||||
|
||||
# --- Kotlin метаданные/корутины ---
|
||||
-keep class kotlin.Metadata { *; }
|
||||
-dontwarn kotlinx.coroutines.**
|
||||
|
||||
# --- enum'ы приложения (values()/valueOf по имени) ---
|
||||
-keepclassmembers enum ru.forbion.f7cloud.** { *; }
|
||||
|
||||
# --- Coil (декодеры подгружаются по имени) ---
|
||||
-dontwarn coil.**
|
||||
-keep class coil.decode.** { *; }
|
||||
|
||||
# --- OkHttp/Okio/security-провайдеры (косметические ворнинги R8) ---
|
||||
-dontwarn okhttp3.internal.platform.**
|
||||
-dontwarn org.conscrypt.**
|
||||
-dontwarn org.bouncycastle.**
|
||||
-dontwarn org.openjsse.**
|
||||
|
||||
# --- Firebase Cloud Messaging ---
|
||||
-keep class com.google.firebase.** { *; }
|
||||
-dontwarn com.google.firebase.**
|
||||
|
||||
# --- WebView JS-мосты (@JavascriptInterface вызывается из JS по имени) ---
|
||||
-keepclassmembers class * {
|
||||
@android.webkit.JavascriptInterface <methods>;
|
||||
}
|
||||
|
||||
# --- Compose обычно не требует правил; косметика ---
|
||||
-dontwarn org.jetbrains.annotations.**
|
||||
|
||||
Reference in New Issue
Block a user