Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
1b069cb
fix: add ability to re-write class name references in desugar plugin
itsaky-adfa Mar 19, 2026
a70fd66
feat: integrate Kotlin analysis API
itsaky-adfa Mar 19, 2026
4ca1e97
Merge branch 'stage' into fix/ADFA-3366-include-analysis-api-as-depen…
itsaky-adfa Mar 19, 2026
43286a6
fix: update kotlin-android to latest version
itsaky-adfa Mar 23, 2026
f1fe62f
fix: remove UnsafeImpl
itsaky-adfa Mar 25, 2026
6e6d8b3
fix: update kotlin-android to latest version
itsaky-adfa Mar 25, 2026
b208658
fix: replace usages of Unsafe with UnsafeImpl
itsaky-adfa Mar 24, 2026
c844ad2
fix: make Kotlin LSP no-op
itsaky-adfa Mar 23, 2026
58db2cb
feat: configure K2 standalone session when setting up LSP
itsaky-adfa Mar 24, 2026
bf7acd1
fix: JvmTarget resolution fails for input "21"
itsaky-adfa Mar 24, 2026
dc62a51
fix: do not early-init VirtualFileSystem
itsaky-adfa Mar 24, 2026
4b1c8e4
fix: remove replaceClass desugar instruction for Unsafe
itsaky-adfa Mar 25, 2026
b14f6ee
fix: ensure boot class path is added as dependency to Android modules
itsaky-adfa Mar 26, 2026
54ca7a9
feat: add diagnostic provider for Kotlin
itsaky-adfa Mar 26, 2026
6e4d458
fix: remove unnecessary log statement
itsaky-adfa Mar 26, 2026
5d841a3
fix: update to latest kotlin-android release
itsaky-adfa Mar 26, 2026
4b7b0f2
fix: always re-initialize K2 session on setupWithProject
itsaky-adfa Mar 26, 2026
e2f137a
fix: diagnostics are always collected from the on-disk file
itsaky-adfa Mar 26, 2026
09fc9ea
feat: add the ability to incrementally invalidate source roots on pro…
itsaky-adfa Mar 30, 2026
dd3d519
fix: dispatch build-related events from GradleBuildService
itsaky-adfa Mar 31, 2026
d6defa6
feat: introduct KtFileManager
itsaky-adfa Mar 31, 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
3 changes: 2 additions & 1 deletion annotation-processors/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

import com.itsaky.androidide.build.config.BuildConfig
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
Expand Down Expand Up @@ -45,5 +46,5 @@ dependencies {
}

tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17"
compilerOptions.jvmTarget.set(JvmTarget.JVM_17)
}
24 changes: 22 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,29 @@ android {

packaging {
resources {
excludes.add("META-INF/DEPENDENCIES")
excludes.add("META-INF/gradle/incremental.annotation.processors")
excludes += "META-INF/DEPENDENCIES"
excludes += "META-INF/gradle/incremental.annotation.processors"

pickFirsts += "kotlin/internal/internal.kotlin_builtins"
pickFirsts += "kotlin/reflect/reflect.kotlin_builtins"
pickFirsts += "kotlin/kotlin.kotlin_builtins"
pickFirsts += "kotlin/coroutines/coroutines.kotlin_builtins"
pickFirsts += "kotlin/ranges/ranges.kotlin_builtins"
pickFirsts += "kotlin/concurrent/atomics/atomics.kotlin_builtins"
pickFirsts += "kotlin/collections/collections.kotlin_builtins"
pickFirsts += "kotlin/annotation/annotation.kotlin_builtins"

pickFirsts += "META-INF/FastDoubleParser-LICENSE"
pickFirsts += "META-INF/thirdparty-LICENSE"
pickFirsts += "META-INF/FastDoubleParser-NOTICE"
pickFirsts += "META-INF/thirdparty-NOTICE"
}

jniLibs {
useLegacyPackaging = false
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
Expand Down Expand Up @@ -197,6 +212,10 @@ configurations.matching { it.name.contains("AndroidTest") }.configureEach {
exclude(group = "com.google.protobuf", module = "protobuf-lite")
}

configurations.configureEach {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-android-extensions-runtime")
}

dependencies {
debugImplementation(libs.common.leakcanary)

Expand Down Expand Up @@ -278,6 +297,7 @@ dependencies {
implementation(projects.gradlePluginConfig)
implementation(projects.subprojects.aaptcompiler)
implementation(projects.subprojects.javacServices)
implementation(projects.subprojects.kotlinAnalysisApi)
implementation(projects.subprojects.shizukuApi)
implementation(projects.subprojects.shizukuManager)
implementation(projects.subprojects.shizukuProvider)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ 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.BuildRunType
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 @@ -565,7 +566,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
projectDir = projectDir,
buildVariants = buildVariants,
needsGradleSync = needsSync,
buildId = buildService.nextBuildId(),
buildId = buildService.nextBuildId(BuildRunType.ProjectSync),
),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ abstract class BuildMetric : Metric {
Bundle().apply {
putString("build_session_id", buildId.buildSessionId)
putLong("build_id", buildId.buildId)
putString("run_type", buildId.runType.typeName)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import com.itsaky.androidide.analytics.gradle.BuildCompletedMetric
import com.itsaky.androidide.analytics.gradle.BuildStartedMetric
import com.itsaky.androidide.app.BaseApplication
import com.itsaky.androidide.app.IDEApplication
import com.itsaky.androidide.eventbus.events.BuildCompletedEvent
import com.itsaky.androidide.eventbus.events.BuildStartedEvent
import com.itsaky.androidide.lookup.Lookup
import com.itsaky.androidide.lsp.java.debug.JdwpOptions
import com.itsaky.androidide.managers.ToolsManager
Expand All @@ -52,6 +54,7 @@ import com.itsaky.androidide.tooling.api.GradlePluginConfig.PROPERTY_LOGSENDER_E
import com.itsaky.androidide.tooling.api.IToolingApiClient
import com.itsaky.androidide.tooling.api.IToolingApiServer
import com.itsaky.androidide.tooling.api.messages.BuildId
import com.itsaky.androidide.tooling.api.messages.BuildRunType
import com.itsaky.androidide.tooling.api.messages.ClientGradleBuildConfig
import com.itsaky.androidide.tooling.api.messages.GradleBuildParams
import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams
Expand All @@ -77,6 +80,7 @@ import kotlinx.coroutines.cancel
import kotlinx.coroutines.future.await
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.koin.android.ext.android.inject
import org.slf4j.LoggerFactory
import java.io.File
Expand Down Expand Up @@ -162,10 +166,11 @@ class GradleBuildService :
}
} ?: "unknown"

internal fun nextBuildId(): BuildId =
internal fun nextBuildId(runType: BuildRunType): BuildId =
BuildId(
buildSessionId = buildSessionId,
buildId = buildId.incrementAndGet(),
runType = runType,
)

companion object {
Expand Down Expand Up @@ -360,7 +365,8 @@ class GradleBuildService :
var newTuningConfig: GradleTuningConfig? = null

@Suppress("SimplifyBooleanWithConstants")
val extraArgs = getGradleExtraArgs(enableJdwp = JdwpOptions.JDWP_ENABLED && isDebugBuild)
val extraArgs =
getGradleExtraArgs(enableJdwp = JdwpOptions.JDWP_ENABLED && isDebugBuild)

var buildParams =
if (FeatureFlags.isExperimentsEnabled) {
Expand Down Expand Up @@ -402,6 +408,11 @@ class GradleBuildService :
),
)

EventBus.getDefault()
.post(
BuildStartedEvent(buildInfo)
)

eventListener?.prepareBuild(buildInfo)

return@supplyAsync ClientGradleBuildConfig(
Expand All @@ -412,33 +423,38 @@ class GradleBuildService :
override fun onBuildSuccessful(result: BuildResult) {
updateNotification(getString(R.string.build_status_sucess), false)

val buildType = getBuildType(result.tasks)
analyticsManager.trackBuildCompleted(
metric =
BuildCompletedMetric(
buildId = result.buildId,
isSuccess = true,
buildType = buildType,
buildResult = result,
),
)
dispatchBuildResult(result, true)
eventListener?.onBuildSuccessful(result.tasks)
}

override fun onBuildFailed(result: BuildResult) {
updateNotification(getString(R.string.build_status_failed), false)

dispatchBuildResult(result, false)
eventListener?.onBuildFailed(result.tasks)
}

private fun dispatchBuildResult(
result: BuildResult,
isSuccess: Boolean,
) {
val buildType = getBuildType(result.tasks)
analyticsManager.trackBuildCompleted(
metric =
BuildCompletedMetric(
buildId = result.buildId,
isSuccess = false,
isSuccess = isSuccess,
buildType = buildType,
buildResult = result,
),
)
eventListener?.onBuildFailed(result.tasks)

EventBus.getDefault()
.post(
BuildCompletedEvent(
result = result,
)
)
}

override fun onProgressEvent(event: ProgressEvent) {
Expand Down Expand Up @@ -574,7 +590,7 @@ class GradleBuildService :
message =
TaskExecutionMessage(
tasks = tasks,
buildId = nextBuildId(),
buildId = nextBuildId(BuildRunType.TaskRun),
),
)

Expand Down Expand Up @@ -610,9 +626,9 @@ class GradleBuildService :
} catch (e: Throwable) {
if (BuildPreferences.isScanEnabled &&
(
e.toString().contains(ERROR_GRADLE_ENTERPRISE_PLUGIN) ||
e.toString().contains(ERROR_COULD_NOT_FIND_GRADLE)
)
e.toString().contains(ERROR_GRADLE_ENTERPRISE_PLUGIN) ||
e.toString().contains(ERROR_COULD_NOT_FIND_GRADLE)
)
) {
BuildPreferences.isScanEnabled = false

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,55 +28,60 @@ import com.itsaky.androidide.utils.ServiceLoader
*/
interface IJdkDistributionProvider {

/**
* The list of JDK distributions installed on the device.
*/
val installedDistributions: List<JdkDistribution>
/**
* The list of JDK distributions installed on the device.
*/
val installedDistributions: List<JdkDistribution>

/**
* Reloads the installed JDK distributions. This function is synchronous and should not be called
* on the UI thread.
*/
@WorkerThread
fun loadDistributions()
/**
* Reloads the installed JDK distributions. This function is synchronous and should not be called
* on the UI thread.
*/
@WorkerThread
fun loadDistributions()

/**
* Get the [JdkDistribution] instance for the given java version.
*
* @return The [JdkDistribution] instance for the given java version, or `null` if no such
* distribution is found.
*/
fun forVersion(javaVersion: String) : JdkDistribution? =
installedDistributions.firstOrNull { it.javaVersion == javaVersion }
/**
* Get the [JdkDistribution] instance for the given java version.
*
* @return The [JdkDistribution] instance for the given java version, or `null` if no such
* distribution is found.
*/
fun forVersion(javaVersion: String): JdkDistribution? =
installedDistributions.firstOrNull { it.javaVersion == javaVersion }


/**
* Get the [JdkDistribution] instance for the given java home.
*
* @return The [JdkDistribution] instance for the given java home, or `null` if no such
* distribution is found.
*/
fun forJavaHome(javaHome: String) : JdkDistribution? =
installedDistributions.firstOrNull { it.javaHome == javaHome }
/**
* Get the [JdkDistribution] instance for the given java home.
*
* @return The [JdkDistribution] instance for the given java home, or `null` if no such
* distribution is found.
*/
fun forJavaHome(javaHome: String): JdkDistribution? =
installedDistributions.firstOrNull { it.javaHome == javaHome }

companion object {
companion object {

/**
* The default java version.
*/
const val DEFAULT_JAVA_VERSION = "17"
/**
* The default Java version.
*/
const val DEFAULT_JAVA_RELEASE = 21

private val _instance by lazy {
ServiceLoader.load(
IJdkDistributionProvider::class.java,
IJdkDistributionProvider::class.java.classLoader
).findFirstOrThrow()
}
/**
* The default java version.
*/
const val DEFAULT_JAVA_VERSION = DEFAULT_JAVA_RELEASE.toString()

/**
* Get instance of [IJdkDistributionProvider].
*/
@JvmStatic
fun getInstance(): IJdkDistributionProvider = _instance
}
private val _instance by lazy {
ServiceLoader.load(
IJdkDistributionProvider::class.java,
IJdkDistributionProvider::class.java.classLoader
).findFirstOrThrow()
}

/**
* Get instance of [IJdkDistributionProvider].
*/
@JvmStatic
fun getInstance(): IJdkDistributionProvider = _instance
}
}
13 changes: 9 additions & 4 deletions composite-builds/build-deps/java-compiler/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,15 @@
*/

plugins {
id("java-library")
id("java-library")
}

java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

dependencies {
annotationProcessor(libs.google.auto.service)
implementation(libs.google.auto.service.annotations)
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@

package javac.internal.jrtfs;

import com.google.auto.service.AutoService;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
Expand Down Expand Up @@ -53,6 +55,7 @@
* but also compiled and delivered as part of the jrtfs.jar to support access
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
*/
@AutoService(FileSystemProvider.class)
public final class JrtFileSystemProvider extends FileSystemProvider {

private volatile FileSystem theFileSystem;
Expand Down
Loading
Loading