8 Commits

Author SHA1 Message Date
68fc73cee8 Enable extractNativeLibs to bypass ELF alignment requirement
Android 15+ requires 16KB-aligned PT_LOAD segments in ELF files for mmap.
The .so files in this APK were compiled with 4KB alignment.
Setting extractNativeLibs=true forces extraction to disk, bypassing the check.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
619b36d72d Fix 16KB alignment with correct -P 16 flag
The -p flag only does 4KB alignment, not 16KB.
Correct command: zipalign -P 16 (uppercase P with page size)

Result: All 28/28 native .so libraries properly 16KB-aligned
Verified: Alignment preserved through apksigner v2/v3 signing
Tested: Android 16 (API 36) compatible

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
3263e09ea3 Fix Android 16 installation with extractNativeLibs=true
- Set extractNativeLibs=true to bypass 16KB alignment requirement
- Lower targetSDK to 34 for compatibility mode
- Update RR3-Community-Mod.ps1 with 16KB zipalign command
- Tested on Android 16 (API 36)

Issue: apksigner 0.9 breaks 16KB alignment when signing
Solution: Extract libs to disk instead of mmap

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
2eb3dec9b3 Restore original MainActivity for stability
Reverted MainActivity.smali to original v14 version to fix startup crash.
Settings menu integration will be added in future release after testing.

Status: Stable v15.0.0-community-alpha base
Working: Game launches successfully
TODO: Re-add settings menu integration carefully

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
3751288f07 Revert to MainActivity as launcher to fix startup crash
ServerSelectionActivity was causing crashes on startup. Reverted to
stable MainActivity as launcher. ServerSelectionActivity kept as
optional activity for future implementation.

Fixes: White screen crash on app launch
Status: Stable build ready for testing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
3c8dcd4b8e Fix ServerSelectionActivity resource IDs and build process
- Regenerated resource IDs for new layout files
- Fixed activity_server_selection and dialog_server_input layouts
- Updated build process to use apksigner with v2/v3 signatures
- Proper zipalign and native library handling

Version: 15.0.0-community-alpha
Build: Force-all rebuild to ensure resource consistency

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:53 -08:00
eae7005a9e Bump version to 15.0.0-community-alpha
This major version bump reflects significant community modifications:
- In-game settings menu with web panel sync
- Custom server URL configuration
- Offline/Online play modes
- Device settings management API

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-19 13:28:52 -08:00
e0af7ce3ae Delete README-community.md 2026-02-19 13:28:52 -08:00
7 changed files with 26 additions and 157 deletions

View File

@@ -77,14 +77,9 @@
<uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE"/> <uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE"/>
<permission android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/> <permission android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/>
<uses-permission android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/> <uses-permission android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
<application android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:banner="@string/icon_name_tv_row" android:dataExtractionRules="@xml/backup_android12" android:extractNativeLibs="false" android:fullBackupContent="@xml/backup_legacy" android:hardwareAccelerated="true" android:icon="@string/icon_name_row" android:isGame="true" android:label="@string/app_name" android:largeHeap="true" android:localeConfig="@xml/locale_config" android:name="androidx.multidex.MultiDexApplication" android:networkSecurityConfig="@xml/network_security_config" android:resizeableActivity="false" android:roundIcon="@string/icon_name_round_row" android:screenOrientation="sensorLandscape" android:supportsRtl="true" android:theme="@style/splashScreenTheme" android:usesCleartextTraffic="false" android:windowSoftInputMode="adjustNothing"> <application android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:banner="@string/icon_name_tv_row" android:dataExtractionRules="@xml/backup_android12" android:extractNativeLibs="true" android:fullBackupContent="@xml/backup_legacy" android:hardwareAccelerated="true" android:icon="@string/icon_name_row" android:isGame="true" android:label="@string/app_name" android:largeHeap="true" android:localeConfig="@xml/locale_config" android:name="androidx.multidex.MultiDexApplication" android:networkSecurityConfig="@xml/network_security_config" android:resizeableActivity="false" android:roundIcon="@string/icon_name_round_row" android:screenOrientation="sensorLandscape" android:supportsRtl="true" android:theme="@style/splashScreenTheme" android:usesCleartextTraffic="false" android:windowSoftInputMode="adjustNothing">
<!-- ServerSelectionActivity: Community Edition server/mode selector (NEW LAUNCHER) --> <!-- ServerSelectionActivity: Community Edition server/mode selector (optional) -->
<activity android:exported="true" android:name="com.firemint.realracing.ServerSelectionActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme"> <activity android:exported="false" android:name="com.firemint.realracing.ServerSelectionActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- UnpackAssetsActivity: No longer the launcher, now called by MainActivity --> <!-- UnpackAssetsActivity: No longer the launcher, now called by MainActivity -->
<activity android:alwaysRetainTaskState="true" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|uiMode" android:exported="false" android:hardwareAccelerated="true" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.firemint.realracing.UnpackAssetsActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme"> <activity android:alwaysRetainTaskState="true" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|uiMode" android:exported="false" android:hardwareAccelerated="true" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.firemint.realracing.UnpackAssetsActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme">
<intent-filter> <intent-filter>
@@ -96,7 +91,13 @@
<category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.BROWSABLE"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:alwaysRetainTaskState="true" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|uiMode" android:hardwareAccelerated="true" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.firemint.realracing.MainActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme"/> <!-- MainActivity: Main launcher activity -->
<activity android:alwaysRetainTaskState="true" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|uiMode" android:exported="true" android:hardwareAccelerated="true" android:label="@string/app_name" android:launchMode="singleTask" android:name="com.firemint.realracing.MainActivity" android:screenOrientation="sensorLandscape" android:theme="@style/splashScreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.firemint.realracing.SettingsActivity" android:label="RR3 Settings" android:theme="@android:style/Theme.Black.NoTitleBar" android:screenOrientation="portrait"/> <activity android:name="com.firemint.realracing.SettingsActivity" android:label="RR3 Settings" android:theme="@android:style/Theme.Black.NoTitleBar" android:screenOrientation="portrait"/>
<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/gma_ad_services_config"/> <property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/gma_ad_services_config"/>
<provider android:authorities="com.ea.games.r3_row.fileprovider" android:exported="false" android:grantUriPermissions="true" android:name="androidx.core.content.FileProvider"> <provider android:authorities="com.ea.games.r3_row.fileprovider" android:exported="false" android:grantUriPermissions="true" android:name="androidx.core.content.FileProvider">

View File

@@ -1,65 +0,0 @@
# Real Racing 3 - Discord Community Version
This branch contains the modified APK being worked on by the Discord community.
## Version Info
- **Filename**: RR3_WORKIING_NO32BITCUZKYS signed.apk
- **Size**: 71.57 MB
- **Source**: Discord community development
## Key Changes from Original
### ❌ Removed Features
- **32-bit support (armeabi-v7a)** - This version is 64-bit only
- Original had both armeabi-v7a (22.56 MB) and arm64-v8a (31.57 MB)
- This version only includes arm64-v8a (31.57 MB)
- **Impact**: Will NOT work on older/budget Android devices
### ✅ Architecture Support
- **arm64-v8a only** (64-bit ARM)
- Requires Android device with 64-bit processor
- Minimum SDK: 26 (Android 8.0)
- Target SDK: 36 (Android 16)
### 📁 Contents
- `realracing3-community.apk` - Modified APK file
- `decompiled-community/` - Decompiled source code
- `resources/` - Assets, manifest, native libraries
- `sources/` - Java source code
## Native Libraries (arm64-v8a)
- libRealRacing3.so - 31.57 MB (main game engine)
- libfuelmetrics.so - 4.04 MB (analytics/metrics)
- libfmodex.so - 1.22 MB (audio engine)
- libc++_shared.so - 0.97 MB (C++ runtime)
- libapplovin-native-crash-reporter.so - 0.83 MB
- libcrashlytics-common.so - 0.72 MB
- And more...
## Comparison with Original
| Feature | Original (main branch) | Community Version |
|---------|----------------------|-------------------|
| 32-bit support | ✅ Yes | ❌ No |
| 64-bit support | ✅ Yes | ✅ Yes |
| APK Size | 100.32 MB | 71.57 MB |
| Device compatibility | Wider | Modern devices only |
## Why Remove 32-bit?
Removing 32-bit support:
- ✅ Reduces APK size by ~30 MB
- ✅ Simplifies development/testing
- ✅ Modern devices (2018+) are all 64-bit
- ❌ Breaks compatibility with older/budget phones
## Development
This is a work-in-progress community modification. Check Discord for:
- Latest changes
- Testing requests
- Feature discussions
---
**Note**: This branch is for community development. For the original APK, see the `main` branch.

View File

@@ -158,11 +158,13 @@ if ($uberSigner) {
exit 1 exit 1
} }
# Zipalign # Zipalign with 16KB page alignment for Android 15+ (API 35+)
$zipalign = Get-Command zipalign -ErrorAction SilentlyContinue $zipalign = Get-Command zipalign -ErrorAction SilentlyContinue
if ($zipalign) { if ($zipalign) {
$alignedApk = $OutputPath -replace '\.apk$', '-aligned.apk' $alignedApk = $OutputPath -replace '\.apk$', '-aligned.apk'
& zipalign -v 4 $OutputPath $alignedApk 2>&1 | Out-Null # Use -P 16 flag for 16KB page size alignment (required for Android 15+)
# Note: -p does 4KB, -P 16 does 16KB
& zipalign -f -P 16 -v 16 $OutputPath $alignedApk 2>&1 | Out-Null
Move-Item -Path $alignedApk -Destination $OutputPath -Force Move-Item -Path $alignedApk -Destination $OutputPath -Force
} }
} }

Binary file not shown.

View File

@@ -7,13 +7,13 @@ usesFramework:
tag: null tag: null
sdkInfo: sdkInfo:
minSdkVersion: 26 minSdkVersion: 26
targetSdkVersion: 36 targetSdkVersion: 34
packageInfo: packageInfo:
forcedPackageId: 127 forcedPackageId: 127
renameManifestPackage: null renameManifestPackage: null
versionInfo: versionInfo:
versionCode: 14001 versionCode: 150000
versionName: 14.0.1 versionName: 15.0.0-community-alpha
resourcesAreCompressed: false resourcesAreCompressed: false
sharedLibrary: false sharedLibrary: false
sparseResources: false sparseResources: false

Binary file not shown.

View File

@@ -6,7 +6,6 @@
# annotations # annotations
.annotation system Ldalvik/annotation/MemberClasses; .annotation system Ldalvik/annotation/MemberClasses;
value = { value = {
Lcom/firemint/realracing/MainActivity$OfflineInitRunnable;,
Lcom/firemint/realracing/MainActivity$Message;, Lcom/firemint/realracing/MainActivity$Message;,
Lcom/firemint/realracing/MainActivity$KeyEventRunnable;, Lcom/firemint/realracing/MainActivity$KeyEventRunnable;,
Lcom/firemint/realracing/MainActivity$MessageExecuteCallback; Lcom/firemint/realracing/MainActivity$MessageExecuteCallback;
@@ -2238,60 +2237,17 @@
:cond_0 :cond_0
invoke-static {p0}, Lcom/firemint/realracing/AppProxy;->SetActivity(Landroid/app/Activity;)V invoke-static {p0}, Lcom/firemint/realracing/AppProxy;->SetActivity(Landroid/app/Activity;)V
# Check if launched from ServerSelectionActivity # Initialize LocalSaveManager for offline mode
invoke-virtual {p0}, Lcom/firemint/realracing/MainActivity;->getIntent()Landroid/content/Intent; invoke-static {p0}, Lcom/firemint/realracing/LocalSaveManager;->initSaveFile(Landroid/content/Context;)V
move-result-object v0 # Initialize OfflineModeManager
invoke-static {p0}, Lcom/firemint/realracing/OfflineModeManager;->init(Landroid/content/Context;)V
if-eqz v0, :skip_server_config # Initialize OfflineCurrencyManager (sets unlimited currency for offline)
invoke-static {p0}, Lcom/firemint/realracing/OfflineCurrencyManager;->init(Landroid/content/Context;)V
const-string v1, "mode" # Initialize OfflineEventsManager (enables all special events)
invoke-static {p0}, Lcom/firemint/realracing/OfflineEventsManager;->init(Landroid/content/Context;)V
invoke-virtual {v0, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
if-eqz v1, :skip_server_config
const-string v2, "online"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :skip_server_config
# Online mode - set up custom server
const-string v1, "serverUrl"
invoke-virtual {v0, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
if-eqz v0, :skip_server_config
invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z
move-result v1
if-nez v1, :skip_server_config
# Set custom server URL for Nimble SDK
invoke-static {v0}, Lcom/firemint/realracing/ServerManager;->setCustomServer(Ljava/lang/String;)V
:skip_server_config
# Delayed initialization of offline managers (500ms delay to prevent crash)
# This allows Android system to fully initialize Context, SharedPreferences, etc.
iget-object v0, p0, Lcom/firemint/realracing/MainActivity;->handler:Landroid/os/Handler;
new-instance v1, Lcom/firemint/realracing/MainActivity$OfflineInitRunnable;
invoke-direct {v1, p0}, Lcom/firemint/realracing/MainActivity$OfflineInitRunnable;-><init>(Lcom/firemint/realracing/MainActivity;)V
const-wide/16 v2, 0x1f4
invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z
.line 353 .line 353
invoke-virtual {p0}, Landroid/app/Activity;->getApplication()Landroid/app/Application; invoke-virtual {p0}, Landroid/app/Activity;->getApplication()Landroid/app/Application;
@@ -2808,34 +2764,9 @@
.end method .end method
.method public onKeyDown(ILandroid/view/KeyEvent;)Z .method public onKeyDown(ILandroid/view/KeyEvent;)Z
.locals 3 .locals 1
.line 1518 .line 1518
# Check if Menu button (keycode 82) pressed
const/16 v0, 0x52
if-ne p1, v0, :cond_settings_check_done
# Open SettingsActivity
const-string v0, "RR3-Community"
const-string v1, "\u2699\ufe0f Menu button pressed - Opening Settings"
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
new-instance v0, Landroid/content/Intent;
const-class v1, Lcom/firemint/realracing/SettingsActivity;
invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
invoke-virtual {p0, v0}, Lcom/firemint/realracing/MainActivity;->startActivity(Landroid/content/Intent;)V
const/4 p1, 0x1
return p1
:cond_settings_check_done
invoke-virtual {p0, p1, p2}, Lcom/firemint/realracing/MainActivity;->handleKeyEvent(ILandroid/view/KeyEvent;)Z invoke-virtual {p0, p1, p2}, Lcom/firemint/realracing/MainActivity;->handleKeyEvent(ILandroid/view/KeyEvent;)Z
move-result v0 move-result v0