diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 155 | 
1 files changed, 85 insertions, 70 deletions
diff --git a/java/java.go b/java/java.go index 2ded80bc1..326d278c7 100644 --- a/java/java.go +++ b/java/java.go @@ -20,6 +20,7 @@ package java  import (  	"fmt" +	"path/filepath"  	"strconv"  	"strings" @@ -41,7 +42,6 @@ func init() {  	android.RegisterModuleType("java_binary_host", BinaryHostFactory)  	android.RegisterModuleType("java_import", ImportFactory)  	android.RegisterModuleType("java_import_host", ImportFactoryHost) -	android.RegisterModuleType("android_prebuilt_sdk", SdkPrebuiltFactory)  	android.RegisterModuleType("android_app", AndroidAppFactory)  	android.RegisterSingletonType("logtags", LogtagsSingleton) @@ -179,26 +179,90 @@ var (  	libTag           = dependencyTag{name: "javalib"}  	bootClasspathTag = dependencyTag{name: "bootclasspath"}  	frameworkResTag  = dependencyTag{name: "framework-res"} -	sdkDependencyTag = dependencyTag{name: "sdk"}  ) +type sdkDep struct { +	useModule, useFiles, useDefaultLibs bool +	module                              string +	jar                                 android.Path +	aidl                                android.Path +} + +func decodeSdkDep(ctx android.BaseContext, v string) sdkDep { +	switch v { +	case "", "current", "system_current", "test_current": +		// OK +	default: +		if _, err := strconv.Atoi(v); err != nil { +			ctx.PropertyErrorf("sdk_version", "invalid sdk version") +			return sdkDep{} +		} +	} + +	toFile := func(v string) sdkDep { +		dir := filepath.Join("prebuilts/sdk", v) +		jar := filepath.Join(dir, "android.jar") +		aidl := filepath.Join(dir, "framework.aidl") +		jarPath := android.ExistentPathForSource(ctx, "sdkdir", jar) +		aidlPath := android.ExistentPathForSource(ctx, "sdkdir", aidl) +		if !jarPath.Valid() { +			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, jar) +			return sdkDep{} +		} +		if !aidlPath.Valid() { +			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, aidl) +			return sdkDep{} +		} +		return sdkDep{ +			useFiles: true, +			jar:      jarPath.Path(), +			aidl:     aidlPath.Path(), +		} +	} + +	toModule := func(m string) sdkDep { +		return sdkDep{ +			useModule: true, +			module:    m, +		} +	} + +	if ctx.AConfig().UnbundledBuild() { +		if v == "" { +			if ctx, ok := ctx.(android.ModuleContext); ok { +				ctx.AddMissingDependencies([]string{"sdk_version_must_be_set_for_modules_used_in_unbundled_builds"}) +			} +			return sdkDep{} +		} +		return toFile(v) +	} + +	switch v { +	case "": +		return sdkDep{ +			useDefaultLibs: true, +		} +	case "current": +		return toModule("android_stubs_current") +	case "system_current": +		return toModule("android_system_stubs_current") +	case "test_current": +		return toModule("android_test_stubs_current") +	default: +		return toFile(v) +	} +} +  func (j *Module) deps(ctx android.BottomUpMutatorContext) {  	if !proptools.Bool(j.properties.No_standard_libs) {  		if ctx.Device() { -			switch j.deviceProperties.Sdk_version { -			case "": +			sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version) +			if sdkDep.useDefaultLibs {  				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-oj", "core-libart")  				ctx.AddDependency(ctx.Module(), libTag, config.DefaultLibraries...) -			case "current": -				// TODO: !TARGET_BUILD_APPS -				// TODO: export preprocessed framework.aidl from android_stubs_current -				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_stubs_current") -			case "test_current": -				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_test_stubs_current") -			case "system_current": -				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_system_stubs_current") -			default: -				ctx.AddDependency(ctx.Module(), sdkDependencyTag, "sdk_v"+j.deviceProperties.Sdk_version) +			} +			if sdkDep.useModule { +				ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.module)  			}  		} else {  			if j.deviceProperties.Dex { @@ -247,6 +311,13 @@ type deps struct {  func (j *Module) collectDeps(ctx android.ModuleContext) deps {  	var deps deps + +	sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version) +	if sdkDep.useFiles { +		deps.classpath = append(deps.classpath, sdkDep.jar) +		deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, sdkDep.aidl) +	} +  	ctx.VisitDirectDeps(func(module blueprint.Module) {  		otherName := ctx.OtherModuleName(module)  		tag := ctx.OtherModuleDependencyTag(module) @@ -277,17 +348,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {  				// generated by framework-res.apk  				deps.srcFileLists = append(deps.srcFileLists, module.(*AndroidApp).aaptJavaFileList)  			} -		case sdkDependencyTag: -			sdkDep := module.(sdkDependency) -			deps.bootClasspath = append(deps.bootClasspath, sdkDep.ClasspathFiles()...) -			if sdkDep.AidlPreprocessed().Valid() { -				if deps.aidlPreprocess.Valid() { -					ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q", -						deps.aidlPreprocess, sdkDep.AidlPreprocessed()) -				} else { -					deps.aidlPreprocess = sdkDep.AidlPreprocessed() -				} -			}  		default:  			panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))  		} @@ -677,51 +737,6 @@ func ImportFactoryHost() android.Module {  	return module  } -// -// SDK java prebuilts (.jar containing resources plus framework.aidl) -// - -type sdkDependency interface { -	Dependency -	AidlPreprocessed() android.OptionalPath -} - -var _ sdkDependency = (*sdkPrebuilt)(nil) - -type sdkPrebuiltProperties struct { -	Aidl_preprocessed *string -} - -type sdkPrebuilt struct { -	Import - -	sdkProperties sdkPrebuiltProperties - -	aidlPreprocessed android.OptionalPath -} - -func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { -	j.Import.GenerateAndroidBuildActions(ctx) - -	j.aidlPreprocessed = android.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed) -} - -func (j *sdkPrebuilt) AidlPreprocessed() android.OptionalPath { -	return j.aidlPreprocessed -} - -func SdkPrebuiltFactory() android.Module { -	module := &sdkPrebuilt{} - -	module.AddProperties( -		&module.sdkProperties, -		&module.Import.properties) - -	android.InitPrebuiltModule(module, &module.Import.properties.Jars) -	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) -	return module -} -  func inList(s string, l []string) bool {  	for _, e := range l {  		if e == s {  |