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