Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
162f726
feat: add Gradle build tuner
itsaky-adfa Feb 12, 2026
15f3cc4
Merge branch 'stage' into feat/ADFA-2784
itsaky-adfa Feb 13, 2026
8646016
feat: add helpers to build device profile
itsaky-adfa Feb 17, 2026
8a58ed1
feat: allow tooling clients to specify global Gradle build parameters
itsaky-adfa Feb 17, 2026
177fa48
feat: add logic to compute CPU topology and thermal state
itsaky-adfa Feb 17, 2026
78a8895
Merge branch 'stage' into feat/ADFA-2784
itsaky-adfa Feb 17, 2026
395ae94
feat: integrate Gradle build tuning strategies as an experimental fea…
itsaky-adfa Feb 17, 2026
260067e
tests: add test to verify generate Gradle args correctness
itsaky-adfa Feb 17, 2026
a08719a
fix: previous tunig config is not provided when new config is built
itsaky-adfa Feb 17, 2026
b766ce6
fix: use serial GC on low-memory devices
itsaky-adfa Feb 17, 2026
8ac39b2
fix: track metrics related to performance tuning
itsaky-adfa Feb 18, 2026
f83f57e
Merge branch 'stage' into feat/ADFA-2784
itsaky-adfa Feb 18, 2026
679698c
refactor: reformat
itsaky-adfa Feb 18, 2026
8d29009
fix: invalid max worker limit used in balanced strategy
itsaky-adfa Feb 18, 2026
1fe8ad1
fix: kt max heap is doubled instead of halved in balanced strategy
itsaky-adfa Feb 18, 2026
effdc54
fix: skip clusters whose cpuinfo_max_freq could not be computed
itsaky-adfa Feb 18, 2026
e9325ef
fix: remove hardcoded isDebugBuild=false
itsaky-adfa Feb 18, 2026
1e6b564
fix: use kotlin.daemon.jvmargs for some Gradle versions
itsaky-adfa Feb 18, 2026
7b826b3
fix: use mem-bound Gradle daemon xmx limit on very low-memory devices
itsaky-adfa Feb 18, 2026
8d96bf6
tests: fix compilation error
itsaky-adfa Feb 18, 2026
deceb81
fix: inconsistent build duration computation during initialization
itsaky-adfa Feb 18, 2026
76f0605
fix: gracefully handle failures during prepareBuild
itsaky-adfa Feb 18, 2026
9ccd83c
fix: resolve compilation errors in MultiVersionTestClient
itsaky-adfa Feb 18, 2026
f04cf48
refactor: reformat
itsaky-adfa Feb 18, 2026
6e57c61
fix: make strategies objects instead of classes
itsaky-adfa Feb 18, 2026
e5d2465
fix: gracefully handle failures during Gradle auto-tune
itsaky-adfa Feb 18, 2026
49f02d2
fix: use actual CPU count when determining clusters using policies
itsaky-adfa Feb 18, 2026
1148f93
fix: restore interrupted status when preparing build in tooling server
itsaky-adfa Feb 18, 2026
36271e7
refactor: reformat
itsaky-adfa Feb 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,11 @@
android:name=".activities.MainActivity"
android:exported="false"
android:theme="@style/Theme.AndroidIDE" />
<activity
android:name=".activities.editor.EditorActivityKt"
android:configChanges="orientation|screenSize"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".activities.editor.EditorActivityKt"
android:configChanges="orientation|screenSize"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize" />
<activity android:name=".activities.PreferencesActivity" />
<activity android:name=".activities.PluginManagerActivity" />
<activity android:name=".activities.AboutActivity" />
Expand Down Expand Up @@ -222,4 +222,4 @@
android:value="true" />
</service>
</application>
</manifest>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ import com.itsaky.androidide.services.builder.GradleBuildService
import com.itsaky.androidide.services.builder.GradleBuildServiceConnnection
import com.itsaky.androidide.services.builder.gradleDistributionParams
import com.itsaky.androidide.tooling.api.messages.AndroidInitializationParams
import com.itsaky.androidide.tooling.api.messages.BuildId
import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams
import com.itsaky.androidide.tooling.api.messages.result.InitializeResult
import com.itsaky.androidide.tooling.api.messages.result.TaskExecutionResult
Expand Down Expand Up @@ -93,12 +94,12 @@ import com.itsaky.androidide.viewmodel.BuildVariantsViewModel
import com.itsaky.androidide.viewmodel.BuildViewModel
import io.github.rosemoe.sora.text.ICUUtils
import io.github.rosemoe.sora.util.IntPair
import org.koin.android.ext.android.inject
import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.adfa.constants.CONTENT_KEY
import org.koin.android.ext.android.inject
import java.io.File
import java.io.FileNotFoundException
import java.nio.file.NoSuchFileException
Expand All @@ -119,9 +120,10 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
private val buildViewModel by viewModels<BuildViewModel>()
protected var initializingFuture: CompletableFuture<out InitializeResult?>? = null
private val Throwable?.isFileNotFound: Boolean
get() = this is FileNotFoundException ||
this is NoSuchFileException ||
(this is ErrnoException && this.errno == OsConstants.ENOENT)
get() =
this is FileNotFoundException ||
this is NoSuchFileException ||
(this is ErrnoException && this.errno == OsConstants.ENOENT)

val findInProjectDialog: AlertDialog?
get() {
Expand Down Expand Up @@ -287,7 +289,12 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
.onSuccess {
showRestartPrompt(this@ProjectHandlerActivity)
}.onFailure { error ->
flashError(getString(string.msg_plugin_install_failed, error.message ?: "Unknown error"))
flashError(
getString(
string.msg_plugin_install_failed,
error.message ?: "Unknown error",
),
)
}
setStatus("")
buildViewModel.pluginInstallationAttempted()
Expand Down Expand Up @@ -318,7 +325,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
override fun onResume() {
super.onResume()

val service = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService
val service =
Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService
editorViewModel.isBuildInProgress = service?.isBuildInProgress == true
editorViewModel.isInitializing = initializingFuture?.isDone == false

Expand Down Expand Up @@ -381,7 +389,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
}

fun appendBuildOutput(str: String) {
if (_binding == null || isDestroyed || isFinishing) return
if (_binding == null || isDestroyed || isFinishing) return
content.bottomSheet.appendBuildOut(str)
}

Expand Down Expand Up @@ -466,7 +474,10 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
newSelections.putAll(buildVariantsViewModel.updatedBuildVariants)

val selectedVariants = newSelections.mapToSelectedVariants()
log.debug("Initializing project with new build variant selections: {}", selectedVariants)
log.debug(
"Initializing project with new build variant selections: {}",
selectedVariants,
)

initializeProject(buildVariants = selectedVariants, forceSync = forceSync)
return
Expand Down Expand Up @@ -501,7 +512,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
/**
* Initialize (sync) the project.
*
* @param buildVariants A map of project paths to the selected build variants.
* @param buildVariants A map of project paths to the selected build
* variants.
*/
fun initializeProject(
buildVariants: Map<String, String>,
Expand All @@ -524,6 +536,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
handleMissingProjectDirectory(projectDir.name)
return@launch
}

else -> throw e
}
}
Expand All @@ -532,7 +545,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
preProjectInit()
}

val buildService = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE)
val buildService =
Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService
if (buildService == null) {
log.error("No build service found. Cannot initialize project.")
return@launch
Expand All @@ -544,7 +558,16 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
}

log.info("Sending init request to tooling server (needs sync: {})...", needsSync)
initializingFuture = buildService.initializeProject(params = createProjectInitParams(projectDir, buildVariants, needsSync))
initializingFuture =
buildService.initializeProject(
params =
createProjectInitParams(
projectDir = projectDir,
buildVariants = buildVariants,
needsGradleSync = needsSync,
buildId = buildService.nextBuildId(),
),
)

initializingFuture!!.whenCompleteAsync { result, error ->
releaseServerListener()
Expand All @@ -568,12 +591,14 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
projectDir: File,
buildVariants: Map<String, String>,
needsGradleSync: Boolean,
buildId: BuildId,
): InitializeProjectParams =
InitializeProjectParams(
directory = projectDir.absolutePath,
gradleDistribution = gradleDistributionParams,
androidParams = createAndroidParams(buildVariants),
needsGradleSync = needsGradleSync,
buildId = buildId,
)

private fun createAndroidParams(buildVariants: Map<String, String>): AndroidInitializationParams {
Expand Down Expand Up @@ -856,7 +881,11 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
SearchFieldToolbar(view).show()
true
} else if (view === binding.input || view === binding.filter || view.parent === binding.input || view.parent === binding.filter) {
} else if (view === binding.input ||
view === binding.filter ||
view.parent === binding.input ||
view.parent === binding.filter
) {
true
} else {
TooltipManager.showIdeCategoryTooltip(
Expand Down Expand Up @@ -887,9 +916,10 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
val newStart = IntPair.getFirst(range)
val newEnd = IntPair.getSecond(range)

val isValidRange = newStart >= 0 &&
newEnd <= content.length &&
newStart <= newEnd
val isValidRange =
newStart >= 0 &&
newEnd <= content.length &&
newStart <= newEnd

if (isValidRange && newStart != newEnd) {
setSelection(newStart, newEnd)
Expand Down
Loading
Loading