config.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. // Copyright 2017 Google Inc. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package config
  15. import (
  16. "path/filepath"
  17. "runtime"
  18. "strings"
  19. _ "github.com/google/blueprint/bootstrap"
  20. "android/soong/android"
  21. "android/soong/remoteexec"
  22. )
  23. var (
  24. pctx = android.NewPackageContext("android/soong/java/config")
  25. exportedVars = android.NewExportedVariables(pctx)
  26. LegacyCorePlatformBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"}
  27. LegacyCorePlatformSystemModules = "legacy-core-platform-api-stubs-system-modules"
  28. StableCorePlatformBootclasspathLibraries = []string{"stable.core.platform.api.stubs", "core-lambda-stubs"}
  29. StableCorePlatformSystemModules = "stable-core-platform-api-stubs-system-modules"
  30. FrameworkLibraries = []string{"ext", "framework"}
  31. DefaultLambdaStubsLibrary = "core-lambda-stubs"
  32. SdkLambdaStubsPath = "prebuilts/sdk/tools/core-lambda-stubs.jar"
  33. DefaultMakeJacocoExcludeFilter = []string{"org.junit.*", "org.jacoco.*", "org.mockito.*"}
  34. DefaultJacocoExcludeFilter = []string{"org.junit.**", "org.jacoco.**", "org.mockito.**"}
  35. InstrumentFrameworkModules = []string{
  36. "framework",
  37. "framework-minus-apex",
  38. "telephony-common",
  39. "services",
  40. "android.car",
  41. "android.car7",
  42. "conscrypt",
  43. "core-icu4j",
  44. "core-oj",
  45. "core-libart",
  46. }
  47. )
  48. var (
  49. JavacVmFlags = strings.Join(javacVmFlagsList, " ")
  50. javaVmFlagsList = []string{
  51. `-XX:OnError="cat hs_err_pid%p.log"`,
  52. "-XX:CICompilerCount=6",
  53. "-XX:+UseDynamicNumberOfGCThreads",
  54. }
  55. javacVmFlagsList = []string{
  56. `-J-XX:OnError="cat hs_err_pid%p.log"`,
  57. "-J-XX:CICompilerCount=6",
  58. "-J-XX:+UseDynamicNumberOfGCThreads",
  59. "-J-XX:+TieredCompilation",
  60. "-J-XX:TieredStopAtLevel=1",
  61. }
  62. dexerJavaVmFlagsList = []string{
  63. `-JXX:OnError="cat hs_err_pid%p.log"`,
  64. "-JXX:CICompilerCount=6",
  65. "-JXX:+UseDynamicNumberOfGCThreads",
  66. }
  67. )
  68. func init() {
  69. pctx.Import("github.com/google/blueprint/bootstrap")
  70. exportedVars.ExportStringStaticVariable("JavacHeapSize", "2048M")
  71. exportedVars.ExportStringStaticVariable("JavacHeapFlags", "-J-Xmx${JavacHeapSize}")
  72. // ErrorProne can use significantly more memory than javac alone, give it a higher heap
  73. // size (b/221480398).
  74. exportedVars.ExportStringStaticVariable("ErrorProneHeapSize", "4096M")
  75. exportedVars.ExportStringStaticVariable("ErrorProneHeapFlags", "-J-Xmx${ErrorProneHeapSize}")
  76. // D8 invocations are shorter lived, so we restrict their JIT tiering relative to R8.
  77. // Note that the `-JXX` prefix syntax is specific to the R8/D8 invocation wrappers.
  78. exportedVars.ExportStringListStaticVariable("D8Flags", append([]string{
  79. "-JXmx4096M",
  80. "-JXX:+TieredCompilation",
  81. "-JXX:TieredStopAtLevel=1",
  82. }, dexerJavaVmFlagsList...))
  83. exportedVars.ExportStringListStaticVariable("R8Flags", append([]string{
  84. "-JXmx2048M",
  85. // Disable this optimization as it can impact weak reference semantics. See b/233432839.
  86. "-JDcom.android.tools.r8.disableEnqueuerDeferredTracing=true",
  87. }, dexerJavaVmFlagsList...))
  88. exportedVars.ExportStringListStaticVariable("CommonJdkFlags", []string{
  89. `-Xmaxerrs 9999999`,
  90. `-encoding UTF-8`,
  91. `-sourcepath ""`,
  92. `-g`,
  93. // Turbine leaves out bridges which can cause javac to unnecessarily insert them into
  94. // subclasses (b/65645120). Setting this flag causes our custom javac to assume that
  95. // the missing bridges will exist at runtime and not recreate them in subclasses.
  96. // If a different javac is used the flag will be ignored and extra bridges will be inserted.
  97. // The flag is implemented by https://android-review.googlesource.com/c/486427
  98. `-XDskipDuplicateBridges=true`,
  99. // b/65004097: prevent using java.lang.invoke.StringConcatFactory when using -target 1.9
  100. `-XDstringConcat=inline`,
  101. })
  102. exportedVars.ExportStringListStaticVariable("JavaVmFlags", javaVmFlagsList)
  103. exportedVars.ExportStringListStaticVariable("JavacVmFlags", javacVmFlagsList)
  104. pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS)
  105. pctx.VariableFunc("JavaHome", func(ctx android.PackageVarContext) string {
  106. // This is set up and guaranteed by soong_ui
  107. return ctx.Config().Getenv("ANDROID_JAVA_HOME")
  108. })
  109. pctx.VariableFunc("Java11Home", func(ctx android.PackageVarContext) string {
  110. // This is set up and guaranteed by soong_ui
  111. return ctx.Config().Getenv("ANDROID_JAVA11_HOME")
  112. })
  113. pctx.VariableFunc("JlinkVersion", func(ctx android.PackageVarContext) string {
  114. if override := ctx.Config().Getenv("OVERRIDE_JLINK_VERSION_NUMBER"); override != "" {
  115. return override
  116. }
  117. switch ctx.Config().Getenv("EXPERIMENTAL_USE_OPENJDK17_TOOLCHAIN") {
  118. case "true":
  119. return "17"
  120. default:
  121. return "11"
  122. }
  123. })
  124. pctx.SourcePathVariable("JavaToolchain", "${JavaHome}/bin")
  125. pctx.SourcePathVariable("Java11Toolchain", "${Java11Home}/bin")
  126. pctx.SourcePathVariableWithEnvOverride("JavacCmd",
  127. "${JavaToolchain}/javac", "ALTERNATE_JAVAC")
  128. pctx.SourcePathVariable("JavaCmd", "${JavaToolchain}/java")
  129. pctx.SourcePathVariable("JarCmd", "${JavaToolchain}/jar")
  130. pctx.SourcePathVariable("JavadocCmd", "${Java11Toolchain}/javadoc")
  131. pctx.SourcePathVariable("JlinkCmd", "${JavaToolchain}/jlink")
  132. pctx.SourcePathVariable("JmodCmd", "${JavaToolchain}/jmod")
  133. pctx.SourcePathVariable("JrtFsJar", "${JavaHome}/lib/jrt-fs.jar")
  134. pctx.SourcePathVariable("JavaKytheExtractorJar", "prebuilts/build-tools/common/framework/javac_extractor.jar")
  135. pctx.SourcePathVariable("Ziptime", "prebuilts/build-tools/${hostPrebuiltTag}/bin/ziptime")
  136. pctx.HostBinToolVariable("GenKotlinBuildFileCmd", "gen-kotlin-build-file")
  137. pctx.SourcePathVariable("JarArgsCmd", "build/soong/scripts/jar-args.sh")
  138. pctx.SourcePathVariable("PackageCheckCmd", "build/soong/scripts/package-check.sh")
  139. pctx.HostBinToolVariable("ExtractJarPackagesCmd", "extract_jar_packages")
  140. pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
  141. pctx.HostBinToolVariable("MergeZipsCmd", "merge_zips")
  142. pctx.HostBinToolVariable("Zip2ZipCmd", "zip2zip")
  143. pctx.HostBinToolVariable("ZipSyncCmd", "zipsync")
  144. pctx.HostBinToolVariable("ApiCheckCmd", "apicheck")
  145. pctx.HostBinToolVariable("D8Cmd", "d8")
  146. pctx.HostBinToolVariable("R8Cmd", "r8")
  147. pctx.HostBinToolVariable("ResourceShrinkerCmd", "resourceshrinker")
  148. pctx.HostBinToolVariable("HiddenAPICmd", "hiddenapi")
  149. pctx.HostBinToolVariable("ExtractApksCmd", "extract_apks")
  150. pctx.VariableFunc("TurbineJar", func(ctx android.PackageVarContext) string {
  151. turbine := "turbine.jar"
  152. if ctx.Config().AlwaysUsePrebuiltSdks() {
  153. return "prebuilts/build-tools/common/framework/" + turbine
  154. } else {
  155. return ctx.Config().HostJavaToolPath(ctx, turbine).String()
  156. }
  157. })
  158. pctx.HostJavaToolVariable("JarjarCmd", "jarjar.jar")
  159. pctx.HostJavaToolVariable("JsilverJar", "jsilver.jar")
  160. pctx.HostJavaToolVariable("DoclavaJar", "doclava.jar")
  161. pctx.HostJavaToolVariable("MetalavaJar", "metalava.jar")
  162. pctx.HostJavaToolVariable("DokkaJar", "dokka.jar")
  163. pctx.HostJavaToolVariable("JetifierJar", "jetifier.jar")
  164. pctx.HostJavaToolVariable("R8Jar", "r8.jar")
  165. pctx.HostJavaToolVariable("D8Jar", "d8.jar")
  166. pctx.HostBinToolVariable("SoongJavacWrapper", "soong_javac_wrapper")
  167. pctx.HostBinToolVariable("DexpreoptGen", "dexpreopt_gen")
  168. pctx.StaticVariableWithEnvOverride("REJavaPool", "RBE_JAVA_POOL", "java16")
  169. pctx.StaticVariableWithEnvOverride("REJavacExecStrategy", "RBE_JAVAC_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)
  170. pctx.StaticVariableWithEnvOverride("RED8ExecStrategy", "RBE_D8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)
  171. pctx.StaticVariableWithEnvOverride("RER8ExecStrategy", "RBE_R8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)
  172. pctx.StaticVariableWithEnvOverride("RETurbineExecStrategy", "RBE_TURBINE_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
  173. pctx.StaticVariableWithEnvOverride("RESignApkExecStrategy", "RBE_SIGNAPK_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
  174. pctx.StaticVariableWithEnvOverride("REJarExecStrategy", "RBE_JAR_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
  175. pctx.StaticVariableWithEnvOverride("REZipExecStrategy", "RBE_ZIP_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
  176. pctx.HostJavaToolVariable("JacocoCLIJar", "jacoco-cli.jar")
  177. pctx.HostBinToolVariable("ManifestCheckCmd", "manifest_check")
  178. pctx.HostBinToolVariable("ManifestFixerCmd", "manifest_fixer")
  179. pctx.HostBinToolVariable("ManifestMergerCmd", "manifest-merger")
  180. pctx.HostBinToolVariable("Class2NonSdkList", "class2nonsdklist")
  181. pctx.HostBinToolVariable("HiddenAPI", "hiddenapi")
  182. hostBinToolVariableWithSdkToolsPrebuilt("Aapt2Cmd", "aapt2")
  183. hostBinToolVariableWithBuildToolsPrebuilt("AidlCmd", "aidl")
  184. hostBinToolVariableWithBuildToolsPrebuilt("ZipAlign", "zipalign")
  185. hostJavaToolVariableWithSdkToolsPrebuilt("SignapkCmd", "signapk")
  186. // TODO(ccross): this should come from the signapk dependencies, but we don't have any way
  187. // to express host JNI dependencies yet.
  188. hostJNIToolVariableWithSdkToolsPrebuilt("SignapkJniLibrary", "libconscrypt_openjdk_jni")
  189. }
  190. func BazelJavaToolchainVars(config android.Config) string {
  191. return android.BazelToolchainVars(config, exportedVars)
  192. }
  193. func hostBinToolVariableWithSdkToolsPrebuilt(name, tool string) {
  194. pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
  195. if ctx.Config().AlwaysUsePrebuiltSdks() {
  196. return filepath.Join("prebuilts/sdk/tools", runtime.GOOS, "bin", tool)
  197. } else {
  198. return ctx.Config().HostToolPath(ctx, tool).String()
  199. }
  200. })
  201. }
  202. func hostJavaToolVariableWithSdkToolsPrebuilt(name, tool string) {
  203. pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
  204. if ctx.Config().AlwaysUsePrebuiltSdks() {
  205. return filepath.Join("prebuilts/sdk/tools/lib", tool+".jar")
  206. } else {
  207. return ctx.Config().HostJavaToolPath(ctx, tool+".jar").String()
  208. }
  209. })
  210. }
  211. func hostJNIToolVariableWithSdkToolsPrebuilt(name, tool string) {
  212. pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
  213. if ctx.Config().AlwaysUsePrebuiltSdks() {
  214. ext := ".so"
  215. if runtime.GOOS == "darwin" {
  216. ext = ".dylib"
  217. }
  218. return filepath.Join("prebuilts/sdk/tools", runtime.GOOS, "lib64", tool+ext)
  219. } else {
  220. return ctx.Config().HostJNIToolPath(ctx, tool).String()
  221. }
  222. })
  223. }
  224. func hostBinToolVariableWithBuildToolsPrebuilt(name, tool string) {
  225. pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
  226. if ctx.Config().AlwaysUsePrebuiltSdks() {
  227. return filepath.Join("prebuilts/build-tools", ctx.Config().PrebuiltOS(), "bin", tool)
  228. } else {
  229. return ctx.Config().HostToolPath(ctx, tool).String()
  230. }
  231. })
  232. }
  233. // JavaCmd returns a SourcePath object with the path to the java command.
  234. func JavaCmd(ctx android.PathContext) android.SourcePath {
  235. return javaTool(ctx, "java")
  236. }
  237. // JavadocCmd returns a SourcePath object with the path to the java command.
  238. func JavadocCmd(ctx android.PathContext) android.SourcePath {
  239. return java11Tool(ctx, "javadoc")
  240. }
  241. func javaTool(ctx android.PathContext, tool string) android.SourcePath {
  242. type javaToolKey string
  243. key := android.NewCustomOnceKey(javaToolKey(tool))
  244. return ctx.Config().OnceSourcePath(key, func() android.SourcePath {
  245. return javaToolchain(ctx).Join(ctx, tool)
  246. })
  247. }
  248. func java11Tool(ctx android.PathContext, tool string) android.SourcePath {
  249. type javaToolKey string
  250. key := android.NewCustomOnceKey(javaToolKey(tool))
  251. return ctx.Config().OnceSourcePath(key, func() android.SourcePath {
  252. return java11Toolchain(ctx).Join(ctx, tool)
  253. })
  254. }
  255. var javaToolchainKey = android.NewOnceKey("javaToolchain")
  256. func javaToolchain(ctx android.PathContext) android.SourcePath {
  257. return ctx.Config().OnceSourcePath(javaToolchainKey, func() android.SourcePath {
  258. return javaHome(ctx).Join(ctx, "bin")
  259. })
  260. }
  261. var java11ToolchainKey = android.NewOnceKey("java11Toolchain")
  262. func java11Toolchain(ctx android.PathContext) android.SourcePath {
  263. return ctx.Config().OnceSourcePath(java11ToolchainKey, func() android.SourcePath {
  264. return java11Home(ctx).Join(ctx, "bin")
  265. })
  266. }
  267. var javaHomeKey = android.NewOnceKey("javaHome")
  268. func javaHome(ctx android.PathContext) android.SourcePath {
  269. return ctx.Config().OnceSourcePath(javaHomeKey, func() android.SourcePath {
  270. // This is set up and guaranteed by soong_ui
  271. return android.PathForSource(ctx, ctx.Config().Getenv("ANDROID_JAVA_HOME"))
  272. })
  273. }
  274. var java11HomeKey = android.NewOnceKey("java11Home")
  275. func java11Home(ctx android.PathContext) android.SourcePath {
  276. return ctx.Config().OnceSourcePath(java11HomeKey, func() android.SourcePath {
  277. // This is set up and guaranteed by soong_ui
  278. return android.PathForSource(ctx, ctx.Config().Getenv("ANDROID_JAVA11_HOME"))
  279. })
  280. }