From b5951516cc78afa70124fb7f56027aecc5f567d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Mon, 14 Oct 2024 14:36:38 +0200
Subject: [PATCH] Improve build process, according to "Build multiple APKs"
 https://developer.android.com/build/configure-apk-splits

---
 .gitlab-ci.yml                                |  6 +-
 android/.gitignore                            |  4 +-
 android/app/build.gradle                      | 90 ++++++++++---------
 android/app/src/debug/AndroidManifest.xml     |  6 +-
 android/app/src/main/AndroidManifest.xml      | 14 ++-
 .../benoitharrault/random/MainActivity.java   |  6 --
 .../org/benoitharrault/random/MainActivity.kt |  5 ++
 android/app/src/profile/AndroidManifest.xml   |  6 +-
 android/build.gradle                          |  4 +-
 android/gradle.properties                     |  4 +-
 .../gradle/wrapper/gradle-wrapper.properties  |  2 +-
 android/settings.gradle                       |  9 +-
 pubspec.yaml                                  |  2 +-
 13 files changed, 84 insertions(+), 74 deletions(-)
 delete mode 100644 android/app/src/main/java/org/benoitharrault/random/MainActivity.java
 create mode 100644 android/app/src/main/kotlin/org/benoitharrault/random/MainActivity.kt

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 24c8063..e2cc66f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,12 +25,13 @@ android:build-debug:
     # build flutter app
     - flutter packages get
     - flutter clean
+    - flutter build apk --debug --split-per-abi
     - flutter build apk --debug
     # prepare artifact
     - find . -name "*.apk" # where is my apk?
   artifacts:
     paths:
-      - build/app/outputs/apk/debug
+      - build/app/outputs/flutter-apk
     expire_in: 1 week
   interruptible: true
 
@@ -63,13 +64,14 @@ android:build-release:
       else
         flutter packages get
         flutter clean
+        flutter build apk --release --split-per-abi
         flutter build apk --release
       fi
     # prepare artifact
     - find . -name "*.apk" # where is my apk?
   artifacts:
     paths:
-      - build/app/outputs/apk/release
+      - build/app/outputs/flutter-apk
     expire_in: 1 week
   interruptible: true
 
diff --git a/android/.gitignore b/android/.gitignore
index 0a741cb..55afd91 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -7,5 +7,7 @@ gradle-wrapper.jar
 GeneratedPluginRegistrant.java
 
 # Remember to never publicly share your keystore.
-# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+# See https://flutter.dev/to/reference-keystore
 key.properties
+**/*.keystore
+**/*.jks
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 1c18897..57e585a 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -4,32 +4,6 @@ plugins {
     id "dev.flutter.flutter-gradle-plugin"
 }
 
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
-    localPropertiesFile.withReader('UTF-8') { reader ->
-        localProperties.load(reader)
-    }
-}
-
-def gradleProperties = new Properties()
-def gradlePropertiesFile = rootProject.file('gradle.properties')
-if (gradlePropertiesFile.exists()) {
-    gradlePropertiesFile.withReader('UTF-8') { reader ->
-        gradleProperties.load(reader)
-    }
-}
-
-def appVersionCode = gradleProperties.getProperty('app.versionCode')
-if (appVersionCode == null) {
-    appVersionCode = '1'
-}
-
-def appVersionName = gradleProperties.getProperty('app.versionName')
-if (appVersionName == null) {
-    appVersionName = '1.0'
-}
-
 def keystoreProperties = new Properties()
 def keystorePropertiesFile = rootProject.file('key.properties')
 if (keystorePropertiesFile.exists()) {
@@ -37,33 +11,69 @@ if (keystorePropertiesFile.exists()) {
 }
 
 android {
-    compileSdkVersion 34
-    namespace "org.benoitharrault.random"
+    namespace = "org.benoitharrault.random"
+    compileSdk = flutter.compileSdkVersion
+    ndkVersion = flutter.ndkVersion
+
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_1_8
+        targetCompatibility = JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
 
     defaultConfig {
-        applicationId "org.benoitharrault.random"
-        minSdkVersion 21
-        targetSdkVersion 30
-        versionCode appVersionCode.toInteger()
-        versionName appVersionName
-        archivesBaseName = "$applicationId" + "_" + "$versionCode"
+        applicationId = "org.benoitharrault.random"
+        minSdk = flutter.minSdkVersion
+        targetSdk = flutter.targetSdkVersion
+        versionCode = flutter.versionCode
+        versionName = flutter.versionName
     }
 
     signingConfigs {
         release {
-            keyAlias keystoreProperties['keyAlias']
-            keyPassword keystoreProperties['keyPassword']
-            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
-            storePassword keystoreProperties['storePassword']
+            keyAlias = keystoreProperties['keyAlias']
+            keyPassword = keystoreProperties['keyPassword']
+            storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+            storePassword = keystoreProperties['storePassword']
         }
     }
     buildTypes {
         release {
-            signingConfig signingConfigs.release
+            signingConfig = signingConfigs.release
+        }
+    }
+
+    splits {
+        abi {
+            reset()
+            include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
         }
     }
 }
 
+ext.abiCodes = [
+    'armeabi': 1,
+    'armeabi-v7a': 2,
+    'arm64-v8a': 3,
+    'x86': 4,
+    'x86_64': 5,
+]
+
+import com.android.build.OutputFile
+
+android.applicationVariants.all { variant ->
+  variant.outputs.each { output ->
+    def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
+
+    if (baseAbiVersionCode != null) {
+      output.versionCodeOverride = baseAbiVersionCode * 1000 + variant.versionCode
+    }
+  }
+}
+
 flutter {
-    source '../..'
+    source = "../.."
 }
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index 449de18..bbd7ee7 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,7 +1,3 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.benoitharrault.random">
-    <!-- Flutter needs it to communicate with the running application
-         to allow setting breakpoints, to provide hot reload, etc.
-    -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <uses-permission android:name="android.permission.INTERNET"/>
 </manifest>
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 302b583..ab3840c 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,11 +1,13 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.benoitharrault.random">
-   <application
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+    <application
         android:label="random"
+        android:name="${applicationName}"
         android:icon="@mipmap/ic_launcher">
         <activity
             android:name=".MainActivity"
+            android:exported="true"
             android:launchMode="singleTop"
+            android:taskAffinity=""
             android:theme="@style/LaunchTheme"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
             android:hardwareAccelerated="true"
@@ -27,4 +29,10 @@
             android:name="flutterEmbedding"
             android:value="2" />
     </application>
+    <queries>
+        <intent>
+            <action android:name="android.intent.action.PROCESS_TEXT"/>
+            <data android:mimeType="text/plain"/>
+        </intent>
+    </queries>
 </manifest>
diff --git a/android/app/src/main/java/org/benoitharrault/random/MainActivity.java b/android/app/src/main/java/org/benoitharrault/random/MainActivity.java
deleted file mode 100644
index 9c36f15..0000000
--- a/android/app/src/main/java/org/benoitharrault/random/MainActivity.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.benoitharrault.random;
-
-import io.flutter.embedding.android.FlutterActivity;
-
-public class MainActivity extends FlutterActivity {
-}
diff --git a/android/app/src/main/kotlin/org/benoitharrault/random/MainActivity.kt b/android/app/src/main/kotlin/org/benoitharrault/random/MainActivity.kt
new file mode 100644
index 0000000..8b89a3f
--- /dev/null
+++ b/android/app/src/main/kotlin/org/benoitharrault/random/MainActivity.kt
@@ -0,0 +1,5 @@
+package org.benoitharrault.random
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index 449de18..bbd7ee7 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -1,7 +1,3 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.benoitharrault.random">
-    <!-- Flutter needs it to communicate with the running application
-         to allow setting breakpoints, to provide hot reload, etc.
-    -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <uses-permission android:name="android.permission.INTERNET"/>
 </manifest>
diff --git a/android/build.gradle b/android/build.gradle
index bc157bd..d2ffbff 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -5,12 +5,12 @@ allprojects {
     }
 }
 
-rootProject.buildDir = '../build'
+rootProject.buildDir = "../build"
 subprojects {
     project.buildDir = "${rootProject.buildDir}/${project.name}"
 }
 subprojects {
-    project.evaluationDependsOn(':app')
+    project.evaluationDependsOn(":app")
 }
 
 tasks.register("clean", Delete) {
diff --git a/android/gradle.properties b/android/gradle.properties
index 3ca4d32..2597170 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,3 @@
-org.gradle.jvmargs=-Xmx1536M
+org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=1.0.58
-app.versionCode=59
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index b1159fc..7bb2df6 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
index 8cc46c0..b9e43bd 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -5,10 +5,9 @@ pluginManagement {
         def flutterSdkPath = properties.getProperty("flutter.sdk")
         assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
         return flutterSdkPath
-    }
-    settings.ext.flutterSdkPath = flutterSdkPath()
+    }()
 
-    includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
+    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
 
     repositories {
         google()
@@ -19,8 +18,8 @@ pluginManagement {
 
 plugins {
     id "dev.flutter.flutter-plugin-loader" version "1.0.0"
-    id "com.android.application" version "7.2.2" apply false
-    id "org.jetbrains.kotlin.android" version "1.9.22" apply false
+    id "com.android.application" version "8.1.0" apply false
+    id "org.jetbrains.kotlin.android" version "1.8.22" apply false
 }
 
 include ":app"
diff --git a/pubspec.yaml b/pubspec.yaml
index 110d089..180685a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
 
 publish_to: "none"
 
-version: 1.0.58+59
+version: 1.0.59+60
 
 environment:
   sdk: "^3.0.0"
-- 
GitLab