Skip to content

Commit e53e930

Browse files
committed
abi specific apk - implemented via product flavors
1 parent 8fb884c commit e53e930

7 files changed

Lines changed: 254 additions & 68 deletions

File tree

app/build.gradle.kts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ android {
4343

4444
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
4545
testInstrumentationRunnerArguments["androidx.test.orchestrator.ENABLE"] = "true"
46-
47-
packaging {
48-
resources.excludes.add("com/sun/jna/**")
49-
}
5046
}
5147

5248
testOptions {
@@ -61,16 +57,6 @@ android {
6157
release {
6258
isShrinkResources = true
6359
}
64-
65-
applicationVariants.all {
66-
outputs.all {
67-
val date = SimpleDateFormat("-MMdd-HHmm").format(Date())
68-
val buildTypeName = if(name.contains("dev") || name.contains("debug")) "debug" else "release" // This is the variant's build type (e.g., "debug" or "release")
69-
val newApkName = "CodeOnTheGo-${buildTypeName}${date}.apk"
70-
71-
(this as com.android.build.gradle.internal.api.BaseVariantOutputImpl).outputFileName = newApkName
72-
}
73-
}
7460
}
7561

7662
android {
@@ -246,9 +232,6 @@ dependencies {
246232
androidTestImplementation(libs.tests.androidx.test.runner)
247233
}
248234

249-
configurations.all {
250-
exclude(group = "com.sun.jna")
251-
}
252235

253236
//sentry {
254237
// org.set("appdevforall-inc-pb")
@@ -258,4 +241,3 @@ configurations.all {
258241
// // disable if you don't want to expose your sources
259242
// includeSourceContext.set(true)
260243
//}
261-

composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/conf/AndroidModuleConf.kt

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import com.itsaky.androidide.plugins.util.SdkUtils.getAndroidJar
3232
import org.gradle.api.Project
3333
import org.gradle.api.artifacts.MinimalExternalModuleDependency
3434
import org.gradle.api.provider.Provider
35+
import java.text.SimpleDateFormat
36+
import java.util.Date
3537

3638
/**
3739
* ABIs for which the product flavors will be created.
@@ -74,7 +76,8 @@ fun Project.configureAndroidModule(
7476
arrayOf(
7577
"META-INF/CHANGES",
7678
"META-INF/README.md",
77-
"META-INF/LICENSE-notice.md"
79+
"META-INF/LICENSE-notice.md",
80+
"com/sun/jna/**"
7881
)
7982
)
8083
pickFirsts.addAll(
@@ -135,18 +138,18 @@ fun Project.configureAndroidModule(
135138
)
136139
}
137140

138-
// splits {
139-
// abi {
140-
// reset()
141-
// isEnable = true
142-
// isUniversalApk = false
143-
// if (isFDroidBuild) {
144-
// include(FDroidConfig.fDroidBuildArch!!)
145-
// } else {
146-
// include(*flavorsAbis.keys.toTypedArray())
147-
// }
148-
// }
149-
// }
141+
// splits {
142+
// abi {
143+
// reset()
144+
// isEnable = true
145+
// isUniversalApk = false
146+
// if (isFDroidBuild) {
147+
// include(FDroidConfig.fDroidBuildArch!!)
148+
// } else {
149+
// include(*flavorsAbis.keys.toTypedArray())
150+
// }
151+
// }
152+
// }
150153

151154
extensions.getByType(ApplicationAndroidComponentsExtension::class.java).apply {
152155
onVariants { variant ->
@@ -162,13 +165,54 @@ fun Project.configureAndroidModule(
162165
}
163166
}
164167
}
168+
169+
extensions.getByType(com.android.build.gradle.AppExtension::class.java).apply {
170+
applicationVariants.all {
171+
outputs.all {
172+
val flavorName = productFlavors.firstOrNull()?.name ?: "default"
173+
val date = SimpleDateFormat("-MMdd-HHmm").format(Date())
174+
val buildTypeName = if(name.contains("dev") || name.contains("debug")) "debug" else "release" // This is the variant's build type (e.g., "debug" or "release")
175+
val newApkName = "CodeOnTheGo-${flavorName}-${buildTypeName}${date}.apk"
176+
177+
(this as com.android.build.gradle.internal.api.BaseVariantOutputImpl).outputFileName = newApkName
178+
}
179+
}
180+
}
181+
182+
} else {
183+
defaultConfig {
184+
ndk {
185+
abiFilters.clear()
186+
abiFilters += flavorsAbis.keys
187+
}
188+
}
165189
}
166190

167-
defaultConfig {
168-
ndk {
169-
abiFilters.clear()
170-
abiFilters += (flavorsAbis.keys - "x86_64")
171-
}
191+
flavorDimensions("abi")
192+
193+
productFlavors {
194+
195+
create("v7") {
196+
dimension = "abi"
197+
ndk {
198+
abiFilters += "armeabi-v7a"
199+
}
200+
}
201+
202+
create("v8") {
203+
dimension = "abi"
204+
ndk {
205+
abiFilters += "arm64-v8a"
206+
}
207+
}
208+
209+
// NOTE: disable x86_64 builds for now
210+
create("x86") {
211+
dimension = "abi"
212+
ndk {
213+
abiFilters += "x86_64"
214+
}
215+
}
172216
}
173217

174218
buildTypes.getByName("debug") { isMinifyEnabled = false }
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* This file is part of AndroidIDE.
3+
*
4+
* AndroidIDE is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* AndroidIDE is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.itsaky.androidide.plugins.tasks
19+
20+
import com.adfa.constants.ASSETS_COMMON_FOLDER
21+
import com.adfa.constants.LOCAL_SOURCE_TERMUX_LIB_FOLDER_NAME
22+
import com.adfa.constants.DESTINATION_TERMUX_PACKAGES_FOLDER_NAME
23+
import com.adfa.constants.LOCAL_SOURCE_TERMUX_VAR_FOLDER_NAME
24+
import com.adfa.constants.MANIFEST_FILE_NAME
25+
import com.adfa.constants.SOURCE_LIB_FOLDER
26+
import com.google.common.io.Files
27+
import com.itsaky.androidide.plugins.util.FolderCopyUtils.Companion.copy
28+
import com.itsaky.androidide.plugins.util.FolderCopyUtils.Companion.copyFolderWithInnerFolders
29+
import org.gradle.api.DefaultTask
30+
import org.gradle.api.GradleException
31+
import org.gradle.api.file.DirectoryProperty
32+
import org.gradle.api.provider.Property
33+
import org.gradle.api.tasks.Input
34+
import org.gradle.api.tasks.Internal
35+
import org.gradle.api.tasks.OutputDirectory
36+
import org.gradle.api.tasks.TaskAction
37+
import java.io.File
38+
import java.io.IOException
39+
import kotlin.io.path.Path
40+
41+
42+
abstract class CopyTermuxCacheAbiTask : DefaultTask() {
43+
44+
@get:Input
45+
// abstract val srcDir: Property<String>
46+
var srcDir: String = ""
47+
48+
// @get:Input
49+
// var srcDir: String = ""
50+
51+
/**
52+
* The output directory.
53+
*/
54+
@get:OutputDirectory
55+
abstract val outputDirectory: DirectoryProperty
56+
57+
@TaskAction
58+
fun copyTermuxAbiCacheToAssets() {
59+
val outputDirectory = this.outputDirectory.get()
60+
.file(ASSETS_COMMON_FOLDER + File.separator + LOCAL_SOURCE_TERMUX_LIB_FOLDER_NAME +
61+
File.separator + DESTINATION_TERMUX_PACKAGES_FOLDER_NAME).asFile
62+
val sourceFilePath =
63+
this.project.projectDir.parentFile.parentFile.path + File.separator + SOURCE_LIB_FOLDER + File.separator +
64+
LOCAL_SOURCE_TERMUX_LIB_FOLDER_NAME + File.separator + this.srcDir
65+
66+
if (!outputDirectory.exists()) {
67+
outputDirectory.mkdirs()
68+
}
69+
70+
if (!File(sourceFilePath).exists()) {
71+
return
72+
}
73+
74+
copy(sourceFilePath, outputDirectory)
75+
}
76+
77+
}

composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/tasks/CopyTermuxCacheAndManifestTask.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,15 @@ abstract class CopyTermuxCacheAndManifestTask : DefaultTask() {
4949
.file(ASSETS_COMMON_FOLDER + File.separator + LOCAL_SOURCE_TERMUX_LIB_FOLDER_NAME).asFile
5050
val sourceFilePath =
5151
this.project.projectDir.parentFile.path + File.separator + SOURCE_LIB_FOLDER + File.separator + LOCAL_SOURCE_TERMUX_LIB_FOLDER_NAME
52-
copy(sourceFilePath, outputDirectory)
52+
53+
if (!outputDirectory.exists()) {
54+
outputDirectory.mkdirs()
55+
}
56+
57+
// NOTE: disable copying of the full termux lib for now
58+
// copy(sourceFilePath, outputDirectory)
59+
60+
5361

5462
val manifestOutputDirectory = this.outputDirectory.get()
5563
.file(ASSETS_COMMON_FOLDER).asFile.resolve(MANIFEST_FILE_NAME)

constants/src/main/java/com/adfa/constants/constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ const val LOCAL_SOURCE_TERMUX_VAR_FOLDER_NAME = "var"
112112
const val DESTINATION_TERMUX_VAR_FOLDER_PATH = "$USR/$LOCAL_SOURCE_TERMUX_VAR_FOLDER_NAME"
113113
const val LOCAL_SOURCE_USR_FOLDER = USR
114114
const val DESTINATION_USR_FOLDER = USR
115+
const val DESTINATION_TERMUX_PACKAGES_FOLDER_NAME = "packages"
115116

116117
// Gradle Caches
117118
const val LOCAL_GRADLE_8_0_0_CACHES_PATH = "gradle"

termux/termux-app/build.gradle.kts

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
@file:Suppress("UnstableApiUsage")
22

33
import com.itsaky.androidide.build.config.BuildConfig
4+
import com.itsaky.androidide.build.config.downloadVersion
45
import com.itsaky.androidide.plugins.TerminalBootstrapPackagesPlugin
6+
import com.itsaky.androidide.plugins.tasks.CopyTermuxCacheAbiTask
7+
import com.itsaky.androidide.plugins.tasks.GenerateInitScriptTask
8+
import com.itsaky.androidide.plugins.tasks.GradleWrapperGeneratorTask
59

610
plugins {
711
id("com.android.library")
812
id("kotlin-android")
913
}
1014

11-
// -- runs on configure phase --
12-
//apply {
13-
// plugin(TerminalBootstrapPackagesPlugin::class.java)
14-
//}
15-
1615
val packageVariant = System.getenv("TERMUX_PACKAGE_VARIANT") ?: "apt-android-7" // Default: "apt-android-7"
1716

1817
android {
1918
namespace = "com.termux"
2019
ndkVersion = BuildConfig.ndkVersion
2120

2221
defaultConfig {
23-
2422
buildConfigField("String", "TERMUX_PACKAGE_VARIANT", "\"" + packageVariant + "\"") // Used by TermuxApplication class
2523

2624
manifestPlaceholders["TERMUX_PACKAGE_NAME"] = BuildConfig.packageName
@@ -50,6 +48,35 @@ android {
5048
packaging.jniLibs.useLegacyPackaging = true
5149
}
5250

51+
android {
52+
sourceSets {
53+
getByName("main") {
54+
jniLibs.srcDirs("src/main/jniLibs")
55+
}
56+
}
57+
}
58+
59+
androidComponents {
60+
onVariants { variant ->
61+
var flavorName = variant.productFlavors.firstOrNull()?.second ?: "default"
62+
63+
when (flavorName) {
64+
"v8" -> variant.sources.assets?.addGeneratedSourceDirectory(
65+
copyV8TermuxCache,
66+
CopyTermuxCacheAbiTask::outputDirectory)
67+
"v7" -> variant.sources.assets?.addGeneratedSourceDirectory(
68+
copyV7TermuxCache,
69+
CopyTermuxCacheAbiTask::outputDirectory)
70+
"x86" -> variant.sources.assets?.addGeneratedSourceDirectory(
71+
copyX86TermuxCache,
72+
CopyTermuxCacheAbiTask::outputDirectory)
73+
else -> variant.sources.assets?.addGeneratedSourceDirectory(
74+
copyV8TermuxCache,
75+
CopyTermuxCacheAbiTask::outputDirectory)// default to v8
76+
}
77+
}
78+
}
79+
5380
dependencies {
5481
implementation(libs.androidx.annotation)
5582
implementation(libs.androidx.core)
@@ -87,3 +114,36 @@ tasks.register("applyTerminalBootstrapPackagesPlugin") {
87114
tasks.named("preBuild").configure {
88115
dependsOn("applyTerminalBootstrapPackagesPlugin")
89116
}
117+
118+
val copyV8TermuxCache = tasks.register<CopyTermuxCacheAbiTask>("copyV8TermuxCache")
119+
copyV8TermuxCache.configure {
120+
srcDir = "v8"
121+
}
122+
123+
val copyV7TermuxCache = tasks.register<CopyTermuxCacheAbiTask>("copyV7TermuxCache") {
124+
srcDir = "v7"
125+
}
126+
127+
val copyX86TermuxCache = tasks.register<CopyTermuxCacheAbiTask>("copyX86TermuxCache") {
128+
srcDir = "x86"
129+
}
130+
131+
afterEvaluate {
132+
listOf("generateV8DebugResValues", "generateV8ReleaseResValues").forEach { taskName ->
133+
tasks.named(taskName).configure {
134+
dependsOn("copyV8TermuxCache")
135+
}
136+
}
137+
138+
listOf("generateV7DebugResValues", "generateV7ReleaseResValues").forEach { taskName ->
139+
tasks.named(taskName).configure {
140+
dependsOn("copyV7TermuxCache")
141+
}
142+
}
143+
144+
listOf("generateX86DebugResValues", "generateX86ReleaseResValues").forEach { taskName ->
145+
tasks.named(taskName).configure {
146+
dependsOn("copyX86TermuxCache")
147+
}
148+
}
149+
}

0 commit comments

Comments
 (0)