android: toolchain AGP 9.1.1 / Gradle 9.3.1 / Kotlin 2.2.21 / compileSdk 37, BOM 2026.09.00 + material3 1.5.0-beta01

Built-in Kotlin (kotlin-android removed), Java 11 compile options (compose 1.12),
proguard-android-optimize.txt (the non-optimize file is rejected by AGP 9),
ExposedDropdownMenu import, minSdk 23 kept via tools:overrideLibrary for
material3 1.5 libs that declare minSdk 24. -PshortNdkCommands for deep worktree paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Opus 5.5 committed 2026-10-09 23:59:09 +07:00
1 parent 65989b3a5a
commit 6fd03f37f7
6 files changed
+25 -22

No files matched your search

+14 -14
View File
@@ -1,5 +1,4 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'org.jetbrains.kotlin.plugin.compose' apply plugin: 'org.jetbrains.kotlin.plugin.compose'
/* Optional .env next to this project: S3/update settings and signing (see .env.example). /* Optional .env next to this project: S3/update settings and signing (see .env.example).
@@ -42,9 +41,9 @@ android {
defaultConfig { defaultConfig {
applicationId "one.shx.strongswan.ext" applicationId "one.shx.strongswan.ext"
compileSdk = 36 compileSdk = 37
minSdkVersion 23 minSdk = 23
targetSdkVersion 36 targetSdk = 36
versionCode 159 versionCode 159
versionName "2.14.6" versionName "2.14.6"
@@ -78,6 +77,10 @@ android {
externalNativeBuild { externalNativeBuild {
ndkBuild { ndkBuild {
arguments '-j' + Runtime.runtime.availableProcessors() arguments '-j' + Runtime.runtime.availableProcessors()
/* deep checkout paths (e.g. git worktrees) overflow the Windows command line; opt in with -PshortNdkCommands */
if (project.hasProperty('shortNdkCommands')) {
arguments 'APP_SHORT_COMMANDS=true', 'LOCAL_SHORT_COMMANDS=true'
}
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
} }
} }
@@ -114,7 +117,7 @@ android {
Smoke-test a release build on a device before publishing. */ Smoke-test a release build on a device before publishing. */
minifyEnabled true minifyEnabled true
shrinkResources true shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
if (keystoreFile) { if (keystoreFile) {
signingConfig signingConfigs.release signingConfig signingConfigs.release
} else { } else {
@@ -131,11 +134,8 @@ android {
} }
} }
compileOptions { compileOptions {
targetCompatibility 1.8 targetCompatibility JavaVersion.VERSION_11
sourceCompatibility 1.8 sourceCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '1.8'
} }
buildFeatures { buildFeatures {
compose true compose true
@@ -158,15 +158,15 @@ dependencies {
/* BOM 2026.06.01 = compose-ui 1.11.4. The Expressive API (MaterialExpressiveTheme, /* BOM 2026.06.01 = compose-ui 1.11.4. The Expressive API (MaterialExpressiveTheme,
MotionScheme.expressive, LoadingIndicator, MaterialShapes) lives only in MotionScheme.expressive, LoadingIndicator, MaterialShapes) lives only in
material3 1.5.0-alpha/beta, so material3 is pinned explicitly. material3 1.5.0-alpha/beta, so material3 is pinned explicitly.
1.5.0-alpha18 is the newest line that still builds with AGP 8.13 / compileSdk 36: 1.5.0-beta01 is the newest line that still builds with AGP 8.13 / compileSdk 36:
alpha19+ (and 1.5.0-beta01, BOM 2026.09.00 = compose 1.12) require AGP 9.1 and alpha19+ (and 1.5.0-beta01, BOM 2026.09.00 = compose 1.12) require AGP 9.1 and
compileSdk 37. Unpin once those are adopted and 1.5.0 is stable. */ compileSdk 37. Unpin once those are adopted and 1.5.0 is stable. */
def composeBom = platform('androidx.compose:compose-bom:2026.06.01') def composeBom = platform('androidx.compose:compose-bom:2026.09.00')
implementation composeBom implementation composeBom
implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.material3:material3:1.5.0-alpha18' implementation 'androidx.compose.material3:material3:1.5.0-beta01'
/* adaptive-navigation-suite (NavigationSuiteScaffold) requires minSdk 23 */ /* adaptive-navigation-suite (NavigationSuiteScaffold) requires minSdk 23 */
implementation 'androidx.compose.material3:material3-adaptive-navigation-suite:1.5.0-alpha18' implementation 'androidx.compose.material3:material3-adaptive-navigation-suite:1.5.0-beta01'
implementation 'androidx.compose.material:material-icons-extended' implementation 'androidx.compose.material:material-icons-extended'
implementation 'androidx.activity:activity-compose:1.11.0' implementation 'androidx.activity:activity-compose:1.11.0'
@@ -19,6 +19,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<!-- material3-ripple 1.5.0-beta01 declares minSdk 24; the app keeps minSdk 23. -->
<uses-sdk tools:overrideLibrary="androidx.compose.material3.ripple,androidx.compose.material3.adaptive.navigationsuite,androidx.compose.material3" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@@ -47,9 +47,10 @@ import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox import androidx.compose.material3.Checkbox
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenu
import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.ExposedDropdownMenuAnchorType
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@@ -411,7 +412,7 @@ fun ProfileFormScreen(
enabled = enabled, enabled = enabled,
label = { Text(stringResource(R.string.profile_vpn_type_label)) }, label = { Text(stringResource(R.string.profile_vpn_type_label)) },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(typeExpanded) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(typeExpanded) },
modifier = Modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryNotEditable), modifier = Modifier.fillMaxWidth().menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable),
) )
ExposedDropdownMenu(expanded = typeExpanded, onDismissRequest = { typeExpanded = false }) { ExposedDropdownMenu(expanded = typeExpanded, onDismissRequest = { typeExpanded = false }) {
VpnType.values().forEachIndexed { index, type -> VpnType.values().forEachIndexed { index, type ->
@@ -575,7 +576,7 @@ fun ProfileFormScreen(
enabled = enabled, enabled = enabled,
label = { Text(stringResource(R.string.profile_select_apps)) }, label = { Text(stringResource(R.string.profile_select_apps)) },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(appsExpanded) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(appsExpanded) },
modifier = Modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryNotEditable), modifier = Modifier.fillMaxWidth().menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable),
) )
ExposedDropdownMenu(expanded = appsExpanded, onDismissRequest = { appsExpanded = false }) { ExposedDropdownMenu(expanded = appsExpanded, onDismissRequest = { appsExpanded = false }) {
SelectedAppsHandling.values().forEachIndexed { index, handling -> SelectedAppsHandling.values().forEachIndexed { index, handling ->
+3 -3
View File
@@ -4,9 +4,9 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.13.0' classpath 'com.android.tools.build:gradle:9.1.1'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.21'
classpath 'org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.1.20' classpath 'org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.2.21'
} }
} }
-1
View File
@@ -1,5 +1,4 @@
android.enableJetifier=false android.enableJetifier=false
android.nonFinalResIds=false
android.nonTransitiveRClass=false android.nonTransitiveRClass=false
android.useAndroidX=true android.useAndroidX=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip