Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66c0c406 authored by Przemyslaw Szczepaniak's avatar Przemyslaw Szczepaniak
Browse files

Add support for renamed kotlin stdlib.

Added new CompilerProperty flag, rename_kotlin_stdlib, which
allow to build kotlin libraries/binaries that use platform internal
version of kotlin stdlib (com.android.kotlin.*). This way, app-provided
kotlin standard library won't collide with version used internaly.

+ remove kotlinc-build.xml after compilation so it won't end up in the
result jar file

+ remove *.kotlin_module and *.kotlin_bultin filesfrom result jar file.
These files are needed only by kotlin-reflect library and
need more work to support kotlin-stdlib renaming.

Bug: 73281388
Test: java_test.go
Change-Id: Iae7ccb919e2ae9853b3f30f3dd447ebd01a1bed0
parent bfe65a32
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ var (
				`${config.GenKotlinBuildFileCmd} $classpath $outDir $out.rsp $srcJarDir/list > $outDir/kotlinc-build.xml &&` +
				`${config.KotlincCmd} $kotlincFlags ` +
				`-jvm-target $kotlinJvmTarget -Xbuild-file=$outDir/kotlinc-build.xml && ` +
				`rm $outDir/kotlinc-build.xml && ` +
				`${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
			CommandDeps: []string{
				"${config.KotlincCmd}",
@@ -358,6 +359,11 @@ func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePa
	// for downstream tools like desugar.
	jarArgs = append(jarArgs, "-stripFile module-info.class")

	// Remove any kotlin-reflect related files
	// TODO(pszczepaniak): Support kotlin-reflect
	jarArgs = append(jarArgs, "-stripFile \"*.kotlin_module\"")
	jarArgs = append(jarArgs, "-stripFile \"*.kotlin_builtin\"")

	if stripDirs {
		jarArgs = append(jarArgs, "-D")
	}
+23 −1
Original line number Diff line number Diff line
@@ -83,6 +83,10 @@ type CompilerProperties struct {
	// ext, and framework for device targets)
	No_framework_libs *bool

	// Use renamed kotlin stdlib (com.android.kotlin.*). This allows kotlin usage without colliding
	// with app-provided kotlin stdlib.
	Renamed_kotlin_stdlib *bool

	// list of module-specific flags that will be used for javac compiles
	Javacflags []string `android:"arch_variant"`

@@ -810,6 +814,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
		// won't emit any classes for them.

		flags.kotlincFlags = "-no-stdlib"

		if ctx.Device() {
			flags.kotlincFlags += " -no-jdk"
		}
@@ -830,10 +835,16 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path

		// Make javac rule depend on the kotlinc rule
		flags.classpath = append(flags.classpath, kotlinJar)

		// Jar kotlin classes into the final jar after javac
		jars = append(jars, kotlinJar)

		// Don't add kotlin-stdlib if using (on-device) renamed stdlib
		// (it's expected to be on device bootclasspath)
		if !proptools.Bool(j.properties.Renamed_kotlin_stdlib) {
			jars = append(jars, deps.kotlinStdlib...)
		}
	}

	// Store the list of .java files that was passed to javac
	j.compiledJavaSrcs = uniqueSrcFiles
@@ -952,6 +963,17 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
		outputFile = combinedJar
	}

	// Use renamed kotlin standard library?
	if srcFiles.HasExt(".kt") && proptools.Bool(j.properties.Renamed_kotlin_stdlib) {
		jarjarFile := android.PathForModuleOut(ctx, "kotlin-renamed", jarName)
		TransformJarJar(ctx, jarjarFile, outputFile,
			android.PathForSource(ctx, "external/kotlinc/jarjar-rules.txt"))
		outputFile = jarjarFile
		if ctx.Failed() {
			return
		}
	}

	if j.properties.Jarjar_rules != nil {
		jarjar_rules := android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules)
		// Transform classes.jar into classes-jarjar.jar
+14 −0
Original line number Diff line number Diff line
@@ -176,6 +176,8 @@ func testContext(config android.Config, bp string,
		"bar-doc/b.java":                 nil,
		"bar-doc/known_oj_tags.txt":      nil,
		"external/doclava/templates-sdk": nil,

		"external/kotlinc/jarjar-rules.txt": nil,
	}

	for k, v := range fs {
@@ -755,6 +757,12 @@ func TestKotlin(t *testing.T) {
			name: "baz",
			srcs: ["c.java"],
		}

		java_library {
			name: "blorg",
			renamed_kotlin_stdlib: true,
			srcs: ["b.kt"],
		}
		`)

	fooKotlinc := ctx.ModuleForTests("foo", "android_common").Rule("kotlinc")
@@ -797,6 +805,12 @@ func TestKotlin(t *testing.T) {
		t.Errorf(`expected %q in bar implicits %v`,
			bazHeaderJar.Output.String(), barKotlinc.Implicits.Strings())
	}

	blorgRenamedJar := ctx.ModuleForTests("blorg", "android_common").Output("kotlin-renamed/blorg.jar")
	if blorgRenamedJar.Implicit.String() != "external/kotlinc/jarjar-rules.txt" {
		t.Errorf(`expected external/kotlinc/jarjar-rules.txt in blorg implicit %q`,
			blorgRenamedJar.Implicit.String())
	}
}

func TestTurbine(t *testing.T) {