diff --git a/android/config.go b/android/config.go index bd13c454f..b9a47f2e2 100644 --- a/android/config.go +++ b/android/config.go @@ -592,12 +592,11 @@ func (c *config) HostJNIToolPath(ctx PathContext, lib string) Path { return path } -func (c *config) HostJavaToolPath(ctx PathContext, path string) Path { - return PathForOutput(ctx, "host", c.PrebuiltOS(), "framework", path) -} - -func (c *config) HostJavaBinToolPath(ctx PathContext, tool string) Path { - path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "bin", false, tool) +func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path { + path := pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "framework", false, tool) + if ctx.Config().KatiEnabled() { + path = path.ToMakePath() + } return path } diff --git a/android/package_ctx.go b/android/package_ctx.go index abd0c29da..c19debbb4 100644 --- a/android/package_ctx.go +++ b/android/package_ctx.go @@ -177,16 +177,6 @@ func (p PackageContext) HostBinToolVariable(name, path string) blueprint.Variabl }) } -// HostJavaBinToolVariable returns a Variable whose value is the path to a host java tool -// in the bin directory for host java targets. It may only be called during a Go -// package's initialization - either from the init() function or as part of a -// package-scoped variable's initialization. -func (p PackageContext) HostJavaBinToolVariable(name, path string) blueprint.Variable { - return p.VariableFunc(name, func(ctx PackageVarContext) string { - return ctx.Config().HostJavaBinToolPath(ctx, path).String() - }) -} - // HostJNIToolVariable returns a Variable whose value is the path to a host tool // in the lib directory for host targets. It may only be called during a Go // package's initialization - either from the init() function or as part of a diff --git a/android/paths.go b/android/paths.go index 82c8a2471..5285ee869 100644 --- a/android/paths.go +++ b/android/paths.go @@ -1661,6 +1661,12 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string return makePathForInstall(ctx, os, arch, partition, ctx.Debug(), pathComponents...) } +// PathForHostDexInstall returns an InstallPath representing the install path for the +// module appended with paths... +func PathForHostDexInstall(ctx ModuleInstallPathContext, pathComponents ...string) InstallPath { + return makePathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, "", ctx.Debug(), pathComponents...) +} + // PathForModuleInPartitionInstall is similar to PathForModuleInstall but partition is provided by the caller func PathForModuleInPartitionInstall(ctx ModuleInstallPathContext, partition string, pathComponents ...string) InstallPath { os, arch := osAndArch(ctx) diff --git a/java/androidmk.go b/java/androidmk.go index eca5caacb..35b4c8e19 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -285,11 +285,6 @@ func (binary *Binary) AndroidMkEntries() []android.AndroidMkEntries { }} } else { outputFile := binary.wrapperFile - // Have Make installation trigger Soong installation by using Soong's install path as - // the output file. - if binary.Host() { - outputFile = binary.binaryFile - } return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "EXECUTABLES", diff --git a/java/app.go b/java/app.go index 6554d6693..7c195fc3f 100755 --- a/java/app.go +++ b/java/app.go @@ -721,10 +721,12 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { // Install the app package. if (Bool(a.Module.properties.Installable) || ctx.Host()) && apexInfo.IsForPlatform() { - ctx.InstallFile(a.installDir, a.outputFile.Base(), a.outputFile) + var extraInstalledPaths android.Paths for _, extra := range a.extraOutputFiles { - ctx.InstallFile(a.installDir, extra.Base(), extra) + installed := ctx.InstallFile(a.installDir, extra.Base(), extra) + extraInstalledPaths = append(extraInstalledPaths, installed) } + ctx.InstallFile(a.installDir, a.outputFile.Base(), a.outputFile, extraInstalledPaths...) } a.buildAppDependencyInfo(ctx) diff --git a/java/app_import.go b/java/app_import.go index 3e5f972a4..4d1969ebb 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -108,6 +108,8 @@ func (a *AndroidAppImport) IsInstallable() bool { return true } +func (a *AndroidAppImport) InstallBypassMake() bool { return true } + // Updates properties with variant-specific values. func (a *AndroidAppImport) processVariants(ctx android.LoadHookContext) { config := ctx.Config() diff --git a/java/config/config.go b/java/config/config.go index 92d49a6cf..30c6f91aa 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -124,8 +124,8 @@ func init() { pctx.HostBinToolVariable("Zip2ZipCmd", "zip2zip") pctx.HostBinToolVariable("ZipSyncCmd", "zipsync") pctx.HostBinToolVariable("ApiCheckCmd", "apicheck") - pctx.HostJavaBinToolVariable("D8Cmd", "d8") - pctx.HostJavaBinToolVariable("R8Cmd", "r8-compat-proguard") + pctx.HostBinToolVariable("D8Cmd", "d8") + pctx.HostBinToolVariable("R8Cmd", "r8-compat-proguard") pctx.HostBinToolVariable("HiddenAPICmd", "hiddenapi") pctx.HostBinToolVariable("ExtractApksCmd", "extract_apks") pctx.VariableFunc("TurbineJar", func(ctx android.PackageVarContext) string { diff --git a/java/dexpreopt.go b/java/dexpreopt.go index e9dc982c7..8ab5a4549 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -335,17 +335,19 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Wr dexpreoptRule.Build("dexpreopt", "dexpreopt") - if global.ApexSystemServerJars.ContainsJar(moduleName(ctx)) { - // APEX variants of java libraries are hidden from Make, so their dexpreopt outputs need special - // handling. Currently, for APEX variants of java libraries, only those in the system server - // classpath are handled here. Preopting of boot classpath jars in the ART APEX are handled in - // java/dexpreopt_bootjars.go, and other APEX jars are not preopted. - for _, install := range dexpreoptRule.Installs() { - // Remove the "/" prefix because the path should be relative to $ANDROID_PRODUCT_OUT. - installDir := strings.TrimPrefix(filepath.Dir(install.To), "/") - installBase := filepath.Base(install.To) - arch := filepath.Base(installDir) - installPath := android.PathForModuleInPartitionInstall(ctx, "", installDir) + for _, install := range dexpreoptRule.Installs() { + // Remove the "/" prefix because the path should be relative to $ANDROID_PRODUCT_OUT. + installDir := strings.TrimPrefix(filepath.Dir(install.To), "/") + installBase := filepath.Base(install.To) + arch := filepath.Base(installDir) + installPath := android.PathForModuleInPartitionInstall(ctx, "", installDir) + + if global.ApexSystemServerJars.ContainsJar(moduleName(ctx)) { + // APEX variants of java libraries are hidden from Make, so their dexpreopt + // outputs need special handling. Currently, for APEX variants of java + // libraries, only those in the system server classpath are handled here. + // Preopting of boot classpath jars in the ART APEX are handled in + // java/dexpreopt_bootjars.go, and other APEX jars are not preopted. // The installs will be handled by Make as sub-modules of the java library. d.builtInstalledForApex = append(d.builtInstalledForApex, dexpreopterInstall{ name: arch + "-" + installBase, @@ -354,10 +356,12 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Wr installDirOnDevice: installPath, installFileOnDevice: installBase, }) + } else { + ctx.InstallFile(installPath, installBase, install.From) } - } else { - // The installs will be handled by Make as LOCAL_SOONG_BUILT_INSTALLED of the java library - // module. + } + + if !global.ApexSystemServerJars.ContainsJar(moduleName(ctx)) { d.builtInstalled = dexpreoptRule.Installs().String() } } diff --git a/java/droiddoc.go b/java/droiddoc.go index 869a5982d..c84a15c1f 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -769,8 +769,8 @@ func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) { d.Javadoc.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip") - jsilver := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jsilver.jar") - doclava := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "doclava.jar") + jsilver := ctx.Config().HostJavaToolPath(ctx, "jsilver.jar") + doclava := ctx.Config().HostJavaToolPath(ctx, "doclava.jar") outDir := android.PathForModuleOut(ctx, "out") srcJarDir := android.PathForModuleOut(ctx, "srcjars") diff --git a/java/java.go b/java/java.go index 854097b0a..3bb9a925b 100644 --- a/java/java.go +++ b/java/java.go @@ -265,6 +265,8 @@ func (j *Module) XrefJavaFiles() android.Paths { return j.kytheFiles } +func (j *Module) InstallBypassMake() bool { return true } + type dependencyTag struct { blueprint.BaseDependencyTag name string @@ -567,8 +569,22 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { if j.InstallMixin != nil { extraInstallDeps = j.InstallMixin(ctx, j.outputFile) } - j.installFile = ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), - j.Stem()+".jar", j.outputFile, extraInstallDeps...) + hostDexNeeded := Bool(j.deviceProperties.Hostdex) && !ctx.Host() + if hostDexNeeded { + ctx.InstallFile(android.PathForHostDexInstall(ctx, "framework"), + j.Stem()+"-hostdex.jar", j.outputFile) + } + var installDir android.InstallPath + if ctx.InstallInTestcases() { + var archDir string + if !ctx.Host() { + archDir = ctx.DeviceConfig().DeviceArch() + } + installDir = android.PathForModuleInstall(ctx, ctx.ModuleName(), archDir) + } else { + installDir = android.PathForModuleInstall(ctx, "framework") + } + j.installFile = ctx.InstallFile(installDir, j.Stem()+".jar", j.outputFile, extraInstallDeps...) } } @@ -842,6 +858,20 @@ type JavaTestImport struct { dexJarFile android.Path } +func (j *Test) InstallInTestcases() bool { + // Host java tests install into $(HOST_OUT_JAVA_LIBRARIES), and then are copied into + // testcases by base_rules.mk. + return !j.Host() +} + +func (j *TestHelperLibrary) InstallInTestcases() bool { + return true +} + +func (j *JavaTestImport) InstallInTestcases() bool { + return true +} + func (j *TestHost) DepsMutator(ctx android.BottomUpMutatorContext) { if len(j.testHostProperties.Data_native_bins) > 0 { for _, target := range ctx.MultiTargets() { @@ -1376,8 +1406,17 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { }) if Bool(j.properties.Installable) { - ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), - jarName, outputFile) + var installDir android.InstallPath + if ctx.InstallInTestcases() { + var archDir string + if !ctx.Host() { + archDir = ctx.DeviceConfig().DeviceArch() + } + installDir = android.PathForModuleInstall(ctx, ctx.ModuleName(), archDir) + } else { + installDir = android.PathForModuleInstall(ctx, "framework") + } + ctx.InstallFile(installDir, jarName, outputFile) } j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs)