From 100d52d563b1e3e6399efa12d1ed241d5be18aa4 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 8 Jul 2026 17:07:02 +0500 Subject: [PATCH 1/6] feat: add consumer-rules --- packages/brownfield-navigation/android/build.gradle | 1 + .../brownfield-navigation/android/consumer-rules.pro | 4 ++++ packages/brownie/android/consumer-rules.pro | 7 +++++++ packages/cli/schema.json | 11 +++++++++++ packages/react-native-brownfield/android/build.gradle | 1 + .../android/consumer-rules.pro | 11 +++++++++++ 6 files changed, 35 insertions(+) create mode 100644 packages/brownfield-navigation/android/consumer-rules.pro create mode 100644 packages/react-native-brownfield/android/consumer-rules.pro diff --git a/packages/brownfield-navigation/android/build.gradle b/packages/brownfield-navigation/android/build.gradle index 00e7ba33..dc201af0 100644 --- a/packages/brownfield-navigation/android/build.gradle +++ b/packages/brownfield-navigation/android/build.gradle @@ -40,6 +40,7 @@ android { defaultConfig { minSdkVersion getExtOrDefault("minSdkVersion") targetSdkVersion getExtOrDefault("targetSdkVersion") + consumerProguardFiles "consumer-rules.pro" } buildFeatures { diff --git a/packages/brownfield-navigation/android/consumer-rules.pro b/packages/brownfield-navigation/android/consumer-rules.pro new file mode 100644 index 00000000..abe2797d --- /dev/null +++ b/packages/brownfield-navigation/android/consumer-rules.pro @@ -0,0 +1,4 @@ +-keep class com.callstack.nativebrownfieldnavigation.NativeBrownfieldNavigationPackage { *; } +-keep class com.callstack.nativebrownfieldnavigation.NativeBrownfieldNavigationModule { *; } +-keep interface com.callstack.nativebrownfieldnavigation.BrownfieldNavigationDelegate { *; } +-keep class com.callstack.nativebrownfieldnavigation.BrownfieldNavigationManager { *; } diff --git a/packages/brownie/android/consumer-rules.pro b/packages/brownie/android/consumer-rules.pro index c231fd9c..72a39a1f 100644 --- a/packages/brownie/android/consumer-rules.pro +++ b/packages/brownie/android/consumer-rules.pro @@ -2,3 +2,10 @@ void onStoreDidChange(java.lang.String); native ; } + +-keep class com.callstack.brownie.Store { *; } +-keep class com.callstack.brownie.StoreKt { *; } +-keep class com.callstack.brownie.StoreManager { *; } +-keep class com.callstack.brownie.StoreManager$Companion { *; } +-keep class com.callstack.brownie.StoreManagerKt { *; } +-keep class com.callstack.brownie.BrownieStoreRegistrationKt { *; } \ No newline at end of file diff --git a/packages/cli/schema.json b/packages/cli/schema.json index 9ab1ecb5..05ba05c8 100644 --- a/packages/cli/schema.json +++ b/packages/cli/schema.json @@ -57,6 +57,13 @@ "description": "Compile SDK version for the Android library.", "type": "number" }, + "extraProguardRules": { + "description": "Extra Proguard rules appended to the default rules.", + "items": { + "type": "string" + }, + "type": "array" + }, "groupId": { "description": "Maven group ID used when publishing the AAR.", "type": "string" @@ -65,6 +72,10 @@ "description": "Minimum SDK version for the Android library.", "type": "number" }, + "minifyEnabled": { + "description": "Toggle minification for the generated Android library.", + "type": "boolean" + }, "packageName": { "description": "The package name for the Android library module.", "type": "string" diff --git a/packages/react-native-brownfield/android/build.gradle b/packages/react-native-brownfield/android/build.gradle index d3850b23..101f53cb 100644 --- a/packages/react-native-brownfield/android/build.gradle +++ b/packages/react-native-brownfield/android/build.gradle @@ -74,6 +74,7 @@ android { defaultConfig { minSdkVersion getExtOrIntegerDefault("minSdkVersion") targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") + consumerProguardFiles "consumer-rules.pro" buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() buildConfigField "boolean", "IS_HERMES_ENABLED", isHermesEnabled().toString() buildConfigField "String", "RN_VERSION", "\"$reactNativeVersion\"" diff --git a/packages/react-native-brownfield/android/consumer-rules.pro b/packages/react-native-brownfield/android/consumer-rules.pro new file mode 100644 index 00000000..9a351e08 --- /dev/null +++ b/packages/react-native-brownfield/android/consumer-rules.pro @@ -0,0 +1,11 @@ +-keep class com.callstack.reactnativebrownfield.ReactNativeBrownfield { *; } +-keep class com.callstack.reactnativebrownfield.ReactNativeBrownfield$Companion { *; } +-keep interface com.callstack.reactnativebrownfield.OnJSBundleLoaded { *; } +-keep interface com.callstack.reactnativebrownfield.OnMessageListener { *; } +-keep class com.callstack.reactnativebrownfield.ReactNativeFragment { *; } +-keep class com.callstack.reactnativebrownfield.ReactNativeFragment$Companion { *; } +-keep class com.callstack.reactnativebrownfield.ReactDelegateWrapper { *; } +-keep class com.callstack.reactnativebrownfield.ReactNativeBrownfieldPackage { *; } +-keep class com.callstack.reactnativebrownfield.ReactNativeBrownfieldModule { *; } +-keep class com.callstack.reactnativebrownfield.constants.ReactNativeFragmentArgNames { *; } +-keep class com.callstack.reactnativebrownfield.constants.ReactNativeFragmentArgNames$Companion { *; } From 2c9a2ecccd0a17042d3847f7575bebdfb78e1804 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 8 Jul 2026 17:08:03 +0500 Subject: [PATCH 2/6] feat: update proguard rules for RNApp --- .../RNApp/android/BrownfieldLib/proguard-rules.pro | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/RNApp/android/BrownfieldLib/proguard-rules.pro b/apps/RNApp/android/BrownfieldLib/proguard-rules.pro index 481bb434..52d761f7 100644 --- a/apps/RNApp/android/BrownfieldLib/proguard-rules.pro +++ b/apps/RNApp/android/BrownfieldLib/proguard-rules.pro @@ -18,4 +18,16 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +# Public API consumed from the Brownfield AAR. +-keep class com.rnapp.brownfieldlib.BrownfieldStore { *; } +-keep class com.rnapp.brownfieldlib.BrownfieldStore$Companion { *; } +-keep class com.rnapp.brownfieldlib.User { *; } +-keep class com.rnapp.brownfieldlib.SettingsStore { *; } +-keep class com.rnapp.brownfieldlib.SettingsStore$Companion { *; } +-keep class com.rnapp.brownfieldlib.Theme { *; } +-keep class com.rnapp.brownfieldlib.ReactNativeHostManager { *; } + +# Generated API for brownfield-navigation API consumed from the Brownfield AAR +-keep class com.callstack.nativebrownfieldnavigation.UserType { *; } \ No newline at end of file From 061374c131d8628d02f3beb7789877cd7121de77 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 8 Jul 2026 17:09:03 +0500 Subject: [PATCH 3/6] feat: add options for minify and extra proguard rules for android expo config --- .../src/__tests__/expoPluginConfig.test.ts | 52 +++++++++++++++++++ packages/cli/src/expoPluginConfig.ts | 6 +++ packages/cli/src/types.ts | 10 ++++ .../android/withAndroidModuleFiles.ts | 10 +++- .../template/android/build.gradle.kts | 2 +- .../template/android/proguard-rules.pro | 12 ++++- 6 files changed, 89 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/__tests__/expoPluginConfig.test.ts b/packages/cli/src/__tests__/expoPluginConfig.test.ts index 6745c71e..f79e2b6c 100644 --- a/packages/cli/src/__tests__/expoPluginConfig.test.ts +++ b/packages/cli/src/__tests__/expoPluginConfig.test.ts @@ -206,6 +206,8 @@ describe('resolveBrownfieldPluginConfig', () => { artifactId: 'brownfieldlib', version: '0.0.1-SNAPSHOT', useLocalGradlePlugin: false, + minifyEnabled: false, + extraProguardRules: [], }, }); }); @@ -309,6 +311,8 @@ describe('resolveBrownfieldPluginConfig', () => { moduleName: 'mylib', minSdkVersion: 26, version: '2.0.0', + minifyEnabled: false, + extraProguardRules: [], }); expect(resolved.ios).toMatchObject({ frameworkName: 'MyLib', @@ -334,6 +338,31 @@ describe('resolveBrownfieldPluginConfig', () => { expect(resolved.android?.useLocalGradlePlugin).toBe(true); }); + it('maps android.expo.minifyEnabled and extraProguardRules from file config', () => { + const resolved = resolveBrownfieldPluginConfig( + {}, + { + android: { + moduleName: 'mylib', + expo: { + minifyEnabled: true, + extraProguardRules: [ + '-keep class com.example.Foo { *; }', + '-dontwarn com.example.Bar', + ], + }, + }, + }, + baseExpoConfig + ); + + expect(resolved.android?.minifyEnabled).toBe(true); + expect(resolved.android?.extraProguardRules).toEqual([ + '-keep class com.example.Foo { *; }', + '-dontwarn com.example.Bar', + ]); + }); + it('maps android.useLocalGradlePlugin from legacy app.json plugin props', () => { const resolved = resolveBrownfieldPluginConfig( { @@ -348,4 +377,27 @@ describe('resolveBrownfieldPluginConfig', () => { expect(resolved.android?.useLocalGradlePlugin).toBe(true); }); + + it('maps android minifyEnabled and extraProguardRules from legacy app.json plugin props', () => { + const resolved = resolveBrownfieldPluginConfig( + { + android: { + moduleName: 'mylib', + minifyEnabled: true, + extraProguardRules: [ + '-keep class com.example.Legacy { *; }', + '-dontwarn com.example.Legacy', + ], + }, + }, + null, + baseExpoConfig + ); + + expect(resolved.android?.minifyEnabled).toBe(true); + expect(resolved.android?.extraProguardRules).toEqual([ + '-keep class com.example.Legacy { *; }', + '-dontwarn com.example.Legacy', + ]); + }); }); diff --git a/packages/cli/src/expoPluginConfig.ts b/packages/cli/src/expoPluginConfig.ts index 9b455636..792a0c46 100644 --- a/packages/cli/src/expoPluginConfig.ts +++ b/packages/cli/src/expoPluginConfig.ts @@ -24,6 +24,8 @@ export type BrownfieldPluginProps = { artifactId?: string; version?: string; useLocalGradlePlugin?: boolean; + minifyEnabled?: boolean; + extraProguardRules?: string[]; }; }; @@ -37,6 +39,8 @@ export type ResolvedBrownfieldPluginAndroidConfig = { artifactId: string; version: string; useLocalGradlePlugin: boolean; + minifyEnabled: boolean; + extraProguardRules: string[]; }; export type ResolvedBrownfieldPluginIosConfig = { @@ -189,6 +193,8 @@ export function resolveBrownfieldPluginConfig( version: effectiveProps.android?.version ?? '0.0.1-SNAPSHOT', useLocalGradlePlugin: effectiveProps.android?.useLocalGradlePlugin ?? false, + minifyEnabled: effectiveProps.android?.minifyEnabled ?? false, + extraProguardRules: effectiveProps.android?.extraProguardRules ?? [], } : null, }; diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 3c213b48..ebca9deb 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -56,6 +56,16 @@ export type BrownfieldExpoAndroidConfig = { */ packageName?: string; + /** + * Toggle minification for the generated Android library. + */ + minifyEnabled?: boolean; + + /** + * Extra Proguard rules appended to the default rules. + */ + extraProguardRules?: string[]; + /** * Minimum SDK version for the Android library. */ diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts index 663ee4c0..4beb6f14 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts @@ -78,6 +78,11 @@ export function createAndroidModule({ const compileSdkVersionExpression = resolveCompileSdkVersionExpression(config); const targetSdkVersionExpression = resolveTargetSdkVersionExpression(config); + const minifyEnabled = + (android as { minifyEnabled?: boolean }).minifyEnabled ?? false; + const extraProguardRules = + (android as { extraProguardRules?: string[] }).extraProguardRules ?? []; + const extraProguardRulesText = extraProguardRules.join('\n'); Logger.logDebug( `Resolved Hermes artifact: ${hermesArtifact.groupId}:${hermesArtifact.artifactId}:${hermesArtifact.version}` ); @@ -96,6 +101,7 @@ export function createAndroidModule({ '{{ARTIFACT_VERSION}}': android.version, '{{RN_VERSION}}': rnVersion, '{{HERMES_ARTIFACT}}': `${hermesArtifact.groupId}:${hermesArtifact.artifactId}:${hermesArtifact.version}`, + '{{IS_MINIFY_ENABLED}}': minifyEnabled.toString(), }), }, { @@ -114,7 +120,9 @@ export function createAndroidModule({ }, { relativePath: 'proguard-rules.pro', - content: renderTemplate('android', 'proguard-rules.pro', {}), + content: renderTemplate('android', 'proguard-rules.pro', { + '{{EXTRA_PROGUARD_RULES}}': extraProguardRulesText, + }), }, ]; diff --git a/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts b/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts index 827fff57..28c64245 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts +++ b/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts @@ -77,7 +77,7 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = {{IS_MINIFY_ENABLED}} proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/packages/react-native-brownfield/src/expo-config-plugin/template/android/proguard-rules.pro b/packages/react-native-brownfield/src/expo-config-plugin/template/android/proguard-rules.pro index 481bb434..471654ff 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/template/android/proguard-rules.pro +++ b/packages/react-native-brownfield/src/expo-config-plugin/template/android/proguard-rules.pro @@ -18,4 +18,14 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile +-dontwarn com.google.android.material.R$attr +-dontwarn com.google.android.material.R$dimen +-dontwarn com.google.android.material.R$id +-dontwarn com.google.android.material.R$style +-dontwarn java.lang.invoke.StringConcatFactory + +# Public API consumed from the Brownfield AAR. +-keep class com.callstack.rnbrownfield.demo.expoapp56.ReactNativeHostManager { *; } + +{{EXTRA_PROGUARD_RULES}} From 2d453ae1206043df57cc8a2e61d0d56aa1dbc94e Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 8 Jul 2026 17:10:32 +0500 Subject: [PATCH 4/6] feat: use options in expo app 56 --- apps/ExpoApp56/app.json | 7 +------ apps/ExpoApp56/package.json | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/ExpoApp56/app.json b/apps/ExpoApp56/app.json index ce594fb3..0d2238ec 100644 --- a/apps/ExpoApp56/app.json +++ b/apps/ExpoApp56/app.json @@ -37,12 +37,7 @@ } } ], - [ - "@callstack/react-native-brownfield", - { - "debug": true - } - ], + "@callstack/react-native-brownfield", "expo-image", "expo-font", "expo-web-browser" diff --git a/apps/ExpoApp56/package.json b/apps/ExpoApp56/package.json index 834b77ba..5eea378d 100644 --- a/apps/ExpoApp56/package.json +++ b/apps/ExpoApp56/package.json @@ -16,6 +16,23 @@ "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release --use-prebuilt-rn-core --use-prebuilt-expo --verbose", "eas:stg": "EXPO_TOKEN=$EAS_TOKEN eas update --channel production --message 'testing 1st stg channel update' --platform ios --environment staging" }, + "brownfield": { + "debug": true, + "android": { + "expo": { + "minifyEnabled": false, + "extraProguardRules": [ + "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore$Companion { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.User { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore$Companion { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.Theme { *; }", + "-keep class com.callstack.nativebrownfieldnavigation.UserType { *; }" + ] + } + } + }, "dependencies": { "@callstack/brownfield-navigation": "workspace:^", "@callstack/brownie": "workspace:^", From 03c8cdac9b286cd05cd4ecc73791ee4868601a84 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Wed, 8 Jul 2026 17:10:44 +0500 Subject: [PATCH 5/6] docs: update --- .../docs/docs/api-reference/configuration.mdx | 6 ++ docs/docs/docs/guides/_meta.json | 1 + docs/docs/docs/guides/minification.mdx | 74 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 docs/docs/docs/guides/minification.mdx diff --git a/docs/docs/docs/api-reference/configuration.mdx b/docs/docs/docs/api-reference/configuration.mdx index 0c16c862..f49a7d61 100644 --- a/docs/docs/docs/api-reference/configuration.mdx +++ b/docs/docs/docs/api-reference/configuration.mdx @@ -58,6 +58,10 @@ Example: "expo": { "packageName": "com.example.app", "minSdkVersion": 24, + "extraProguardRules": [ + "-keep class com.example.Foo { *; }" + ], + "minifyEnabled": false, "useLocalGradlePlugin": true } }, @@ -187,6 +191,8 @@ All file-based platform options mirror CLI flags, but they use camelCase propert | `android.expo.artifactId` | `string` | Maven artifact ID used when publishing the AAR. | | `android.expo.version` | `string` | Maven version used when publishing the AAR. | | `android.expo.useLocalGradlePlugin` | `boolean` | Load the Brownfield Gradle plugin from `node_modules` via `includeBuild` instead of the Maven classpath dependency. Disabled by default. | +| `android.expo.minifyEnabled` | `boolean` | Controls `minifyEnabled` for the generated Android library build. Disabled by default. | +| `android.expo.extraProguardRules` | `string[]`| Additional Proguard rules appended to the generated `proguard-rules.pro`. | ### iOS keys diff --git a/docs/docs/docs/guides/_meta.json b/docs/docs/docs/guides/_meta.json index df6eeff7..cf8e4956 100644 --- a/docs/docs/docs/guides/_meta.json +++ b/docs/docs/docs/guides/_meta.json @@ -1,5 +1,6 @@ [ "guidelines", + "minification", "troubleshooting", { "type": "dir", diff --git a/docs/docs/docs/guides/minification.mdx b/docs/docs/docs/guides/minification.mdx new file mode 100644 index 00000000..bd6cb585 --- /dev/null +++ b/docs/docs/docs/guides/minification.mdx @@ -0,0 +1,74 @@ +# Minification + +This guide shows how to enable minification for both Expo and bare React Native brownfield modules. + +## Expo + +Configure minification through the Brownfield config in `package.json` and let `expo prebuild` apply it to the generated module. + +Steps: + +1. Add a `brownfield` block to `package.json` and enable `android.expo.minifyEnabled`. +2. Add keep rules in `android.expo.extraProguardRules` for generated Brownie store types, navigation types, and host manager classes you need to keep. +3. Run `expo prebuild` to regenerate the Android module with the new settings. + +Example (see `apps/ExpoApp56`): + +```json +{ + "brownfield": { + "debug": true, + "android": { + "expo": { + "minifyEnabled": true, + "extraProguardRules": [ + "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore$Companion { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.User { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore$Companion { *; }", + "-keep class com.callstack.rnbrownfield.demo.expoapp56.Theme { *; }", + "-keep class com.callstack.nativebrownfieldnavigation.UserType { *; }" + ] + } + } + } +} +``` + +## Bare React Native + +For bare React Native, you do not need any Brownfield config. Enable minification in the module itself and add Proguard rules manually. + +Steps: + +1. In your `brownfieldlib/build.gradle.kts`, enable `isMinifyEnabled = true` in the `release` build type. +2. Ensure `proguard-rules.pro` keeps the generated Brownie store types, navigation types, and your host manager if you have one. + +Example (see `apps/RNApp`): + +```kts +android { + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } +} +``` + +``` +-keep class com.rnapp.brownfieldlib.BrownfieldStore { *; } +-keep class com.rnapp.brownfieldlib.BrownfieldStore$Companion { *; } +-keep class com.rnapp.brownfieldlib.User { *; } +-keep class com.rnapp.brownfieldlib.SettingsStore { *; } +-keep class com.rnapp.brownfieldlib.SettingsStore$Companion { *; } +-keep class com.rnapp.brownfieldlib.Theme { *; } +-keep class com.rnapp.brownfieldlib.ReactNativeHostManager { *; } + +-keep class com.callstack.nativebrownfieldnavigation.UserType { *; } +``` From 0277842b988f29ca1573b4863ae141f1db7ba456 Mon Sep 17 00:00:00 2001 From: Hur Ali Date: Thu, 9 Jul 2026 10:28:12 +0500 Subject: [PATCH 6/6] docs: update --- .changeset/tall-rabbits-love.md | 8 +++++++ docs/docs/docs/guides/minification.mdx | 32 +++++++++++++++++--------- 2 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 .changeset/tall-rabbits-love.md diff --git a/.changeset/tall-rabbits-love.md b/.changeset/tall-rabbits-love.md new file mode 100644 index 00000000..f4a06975 --- /dev/null +++ b/.changeset/tall-rabbits-love.md @@ -0,0 +1,8 @@ +--- +'@callstack/react-native-brownfield': minor +'@callstack/brownfield-navigation': minor +'@callstack/brownie': minor +'@callstack/brownfield-cli': minor +--- + +feat: support proguard/R8 minification diff --git a/docs/docs/docs/guides/minification.mdx b/docs/docs/docs/guides/minification.mdx index bd6cb585..ef431a6c 100644 --- a/docs/docs/docs/guides/minification.mdx +++ b/docs/docs/docs/guides/minification.mdx @@ -12,7 +12,7 @@ Steps: 2. Add keep rules in `android.expo.extraProguardRules` for generated Brownie store types, navigation types, and host manager classes you need to keep. 3. Run `expo prebuild` to regenerate the Android module with the new settings. -Example (see `apps/ExpoApp56`): +Example (see [apps/ExpoApp56](https://github.com/callstack/react-native-brownfield/blob/main/apps/ExpoApp56/package.json)): ```json { @@ -22,13 +22,19 @@ Example (see `apps/ExpoApp56`): "expo": { "minifyEnabled": true, "extraProguardRules": [ - "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore { *; }", - "-keep class com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore$Companion { *; }", - "-keep class com.callstack.rnbrownfield.demo.expoapp56.User { *; }", - "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore { *; }", - "-keep class com.callstack.rnbrownfield.demo.expoapp56.SettingsStore$Companion { *; }", - "-keep class com.callstack.rnbrownfield.demo.expoapp56.Theme { *; }", - "-keep class com.callstack.nativebrownfieldnavigation.UserType { *; }" + // If you're using Brownie, add the generated store here + "-keep class com.your.expoapp.BrownfieldStore { *; }", + "-keep class com.your.expoapp.BrownfieldStore$Companion { *; }", + "-keep class com.your.expoapp.User { *; }", + "-keep class com.your.expoapp.SettingsStore { *; }", + "-keep class com.your.expoapp.SettingsStore$Companion { *; }", + "-keep class com.your.expoapp.Theme { *; }", + + // If you're using Brownfield Navigation, add the generated types here + "-keep class com.callstack.nativebrownfieldnavigation.UserType { *; }", + + // Any other rule to add + //"-keep class ..." ] } } @@ -45,7 +51,7 @@ Steps: 1. In your `brownfieldlib/build.gradle.kts`, enable `isMinifyEnabled = true` in the `release` build type. 2. Ensure `proguard-rules.pro` keeps the generated Brownie store types, navigation types, and your host manager if you have one. -Example (see `apps/RNApp`): +Example (see [apps/RNApp](https://github.com/callstack/react-native-brownfield/blob/main/apps/RNApp/android/app/proguard-rules.pro)): ```kts android { @@ -61,14 +67,18 @@ android { } ``` -``` +```json +// If you're using Brownie, add the generated store here -keep class com.rnapp.brownfieldlib.BrownfieldStore { *; } -keep class com.rnapp.brownfieldlib.BrownfieldStore$Companion { *; } -keep class com.rnapp.brownfieldlib.User { *; } -keep class com.rnapp.brownfieldlib.SettingsStore { *; } -keep class com.rnapp.brownfieldlib.SettingsStore$Companion { *; } -keep class com.rnapp.brownfieldlib.Theme { *; } --keep class com.rnapp.brownfieldlib.ReactNativeHostManager { *; } +// If you're using Brownfield Navigation, add the generated types here -keep class com.callstack.nativebrownfieldnavigation.UserType { *; } + +// Any other rule to add +//"-keep class ..." ```