blob: 96f8042a0be83d24839b52e7ac90e2c8c8b3c393 [file] [log] [blame]
Colin Cross44df5812019-02-15 23:06:46 -08001// Copyright 2019 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
15package java
16
17import (
Colin Cross44df5812019-02-15 23:06:46 -080018 "path/filepath"
19 "strings"
Colin Cross2d00f0d2019-05-09 21:50:00 -070020
21 "android/soong/android"
22 "android/soong/dexpreopt"
Colin Cross44df5812019-02-15 23:06:46 -080023)
24
Colin Cross44df5812019-02-15 23:06:46 -080025// systemServerClasspath returns the on-device locations of the modules in the system server classpath. It is computed
26// once the first time it is called for any ctx.Config(), and returns the same slice for all future calls with the same
27// ctx.Config().
Ulya Trafimovichf3ff0102019-12-03 15:39:23 +000028func systemServerClasspath(ctx android.MakeVarsContext) []string {
Colin Cross44df5812019-02-15 23:06:46 -080029 return ctx.Config().OnceStringSlice(systemServerClasspathKey, func() []string {
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +000030 global := dexpreopt.GetGlobalConfig(ctx)
Colin Cross44df5812019-02-15 23:06:46 -080031 var systemServerClasspathLocations []string
Ulya Trafimovichf3ff0102019-12-03 15:39:23 +000032 for _, m := range *DexpreoptedSystemServerJars(ctx.Config()) {
Colin Cross44df5812019-02-15 23:06:46 -080033 systemServerClasspathLocations = append(systemServerClasspathLocations,
34 filepath.Join("/system/framework", m+".jar"))
35 }
Roshan Pius9b51a402019-11-21 12:36:53 -080036 for _, m := range global.UpdatableSystemServerJars {
Roshan Pius9b51a402019-11-21 12:36:53 -080037 systemServerClasspathLocations = append(systemServerClasspathLocations,
Roshan Piusccc26ef2019-11-27 09:37:46 -080038 dexpreopt.GetJarLocationFromApexJarPair(m))
Roshan Pius9b51a402019-11-21 12:36:53 -080039 }
Colin Cross44df5812019-02-15 23:06:46 -080040 return systemServerClasspathLocations
41 })
42}
43
44var systemServerClasspathKey = android.NewOnceKey("systemServerClasspath")
45
Colin Crossc11e0c52019-05-08 15:18:22 -070046// dexpreoptTargets returns the list of targets that are relevant to dexpreopting, which excludes architectures
47// supported through native bridge.
48func dexpreoptTargets(ctx android.PathContext) []android.Target {
49 var targets []android.Target
Colin Cross3b19f5d2019-09-17 14:45:31 -070050 for _, target := range ctx.Config().Targets[android.Android] {
Colin Crossc11e0c52019-05-08 15:18:22 -070051 if target.NativeBridge == android.NativeBridgeDisabled {
52 targets = append(targets, target)
53 }
54 }
55
56 return targets
57}
58
Jiyong Park0b238752019-10-29 11:23:10 +090059func stemOf(moduleName string) string {
60 // b/139391334: the stem of framework-minus-apex is framework
61 // This is hard coded here until we find a good way to query the stem
62 // of a module before any other mutators are run
63 if moduleName == "framework-minus-apex" {
64 return "framework"
65 }
66 return moduleName
67}
68
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000069var (
Ulya Trafimovich4cdada22020-02-10 15:29:28 +000070 bootImageConfigKey = android.NewOnceKey("bootImageConfig")
71 artBootImageName = "art"
72 frameworkBootImageName = "boot"
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000073)
Ulyana Trafimovichde534412019-11-08 10:51:01 +000074
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000075// Construct the global boot image configs.
76func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig {
77 return ctx.Config().Once(bootImageConfigKey, func() interface{} {
78
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +000079 global := dexpreopt.GetGlobalConfig(ctx)
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000080 targets := dexpreoptTargets(ctx)
81 deviceDir := android.PathForOutput(ctx, ctx.Config().DeviceName())
Nicolas Geoffray72892f12019-02-22 15:34:40 +000082
Martin Stjernholmcc4b0ad2019-07-05 22:38:25 +010083 artModules := global.ArtApexJars
Ulya Trafimovich44561882020-01-03 13:25:54 +000084 // With EMMA_INSTRUMENT_FRAMEWORK=true the Core libraries depend on jacoco.
85 if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
86 artModules = append(artModules, "jacocoagent")
87 }
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000088 frameworkModules := android.RemoveListFromList(global.BootJars,
Ulya Trafimovichf3ff0102019-12-03 15:39:23 +000089 concat(artModules, dexpreopt.GetJarsFromApexJarPairs(global.UpdatableBootJars)))
Nicolas Geoffray72892f12019-02-22 15:34:40 +000090
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000091 artSubdir := "apex/com.android.art/javalib"
92 frameworkSubdir := "system/framework"
Nicolas Geoffray72892f12019-02-22 15:34:40 +000093
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000094 var artLocations, frameworkLocations []string
Martin Stjernholmcc4b0ad2019-07-05 22:38:25 +010095 for _, m := range artModules {
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +000096 artLocations = append(artLocations, filepath.Join("/"+artSubdir, stemOf(m)+".jar"))
97 }
98 for _, m := range frameworkModules {
99 frameworkLocations = append(frameworkLocations, filepath.Join("/"+frameworkSubdir, stemOf(m)+".jar"))
Nicolas Geoffray72892f12019-02-22 15:34:40 +0000100 }
101
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000102 // ART config for the primary boot image in the ART apex.
103 // It includes the Core Libraries.
104 artCfg := bootImageConfig{
105 extension: false,
106 name: artBootImageName,
107 stem: "boot",
108 installSubdir: artSubdir,
109 modules: artModules,
110 dexLocations: artLocations,
111 dexLocationsDeps: artLocations,
112 }
Ulyana Trafimovichde534412019-11-08 10:51:01 +0000113
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000114 // Framework config for the boot image extension.
Ulyana Trafimovich5a4ccd12019-12-18 17:32:33 +0000115 // It includes framework libraries and depends on the ART config.
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000116 frameworkCfg := bootImageConfig{
Ulyana Trafimovich5a4ccd12019-12-18 17:32:33 +0000117 extension: true,
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000118 name: frameworkBootImageName,
119 stem: "boot",
120 installSubdir: frameworkSubdir,
Ulyana Trafimovich5a4ccd12019-12-18 17:32:33 +0000121 modules: frameworkModules,
122 dexLocations: frameworkLocations,
123 dexLocationsDeps: append(artLocations, frameworkLocations...),
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000124 }
125
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000126 configs := map[string]*bootImageConfig{
Ulya Trafimovich4cdada22020-02-10 15:29:28 +0000127 artBootImageName: &artCfg,
128 frameworkBootImageName: &frameworkCfg,
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000129 }
130
131 // common to all configs
132 for _, c := range configs {
133 c.targets = targets
134
135 c.dir = deviceDir.Join(ctx, "dex_"+c.name+"jars")
136 c.symbolsDir = deviceDir.Join(ctx, "dex_"+c.name+"jars_unstripped")
137
138 // expands to <stem>.art for primary image and <stem>-<1st module>.art for extension
139 imageName := c.firstModuleNameOrStem() + ".art"
140
141 c.imageLocations = []string{c.dir.Join(ctx, c.installSubdir, imageName).String()}
142
143 // The path to bootclasspath dex files needs to be known at module
144 // GenerateAndroidBuildAction time, before the bootclasspath modules have been compiled.
145 // Set up known paths for them, the singleton rules will copy them there.
146 // TODO(b/143682396): use module dependencies instead
147 inputDir := deviceDir.Join(ctx, "dex_"+c.name+"jars_input")
148 for _, m := range c.modules {
149 c.dexPaths = append(c.dexPaths, inputDir.Join(ctx, stemOf(m)+".jar"))
150 }
151 c.dexPathsDeps = c.dexPaths
152
153 c.images = make(map[android.ArchType]android.OutputPath)
154 c.imagesDeps = make(map[android.ArchType]android.OutputPaths)
155
156 for _, target := range targets {
157 arch := target.Arch.ArchType
158 imageDir := c.dir.Join(ctx, c.installSubdir, arch.String())
159 c.images[arch] = imageDir.Join(ctx, imageName)
160 c.imagesDeps[arch] = c.moduleFiles(ctx, imageDir, ".art", ".oat", ".vdex")
Ulyana Trafimovichde534412019-11-08 10:51:01 +0000161 }
Colin Cross31bf00d2019-12-04 13:16:01 -0800162
163 c.zip = c.dir.Join(ctx, c.name+".zip")
Nicolas Geoffrayfeef2ef2019-04-30 09:43:22 +0100164 }
165
Ulyana Trafimovich5a4ccd12019-12-18 17:32:33 +0000166 // specific to the framework config
167 frameworkCfg.dexPathsDeps = append(artCfg.dexPathsDeps, frameworkCfg.dexPathsDeps...)
Ulya Trafimovichb0a2d372020-01-28 14:42:41 +0000168 frameworkCfg.primaryImages = artCfg.images
Ulyana Trafimovich5a4ccd12019-12-18 17:32:33 +0000169 frameworkCfg.imageLocations = append(artCfg.imageLocations, frameworkCfg.imageLocations...)
170
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000171 return configs
172 }).(map[string]*bootImageConfig)
Nicolas Geoffray72892f12019-02-22 15:34:40 +0000173}
174
Ulyana Trafimovichde534412019-11-08 10:51:01 +0000175func artBootImageConfig(ctx android.PathContext) bootImageConfig {
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000176 return *genBootImageConfigs(ctx)[artBootImageName]
177}
178
Lingfeng Yang54191fa2019-12-19 16:40:09 +0000179func defaultBootImageConfig(ctx android.PathContext) bootImageConfig {
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000180 return *genBootImageConfigs(ctx)[frameworkBootImageName]
181}
182
Colin Cross44df5812019-02-15 23:06:46 -0800183func defaultBootclasspath(ctx android.PathContext) []string {
184 return ctx.Config().OnceStringSlice(defaultBootclasspathKey, func() []string {
Martin Stjernholm40f9f3c2020-01-20 18:12:23 +0000185 global := dexpreopt.GetGlobalConfig(ctx)
Colin Cross44df5812019-02-15 23:06:46 -0800186 image := defaultBootImageConfig(ctx)
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000187
Roshan Piusccc26ef2019-11-27 09:37:46 -0800188 updatableBootclasspath := make([]string, len(global.UpdatableBootJars))
189 for i, p := range global.UpdatableBootJars {
190 updatableBootclasspath[i] = dexpreopt.GetJarLocationFromApexJarPair(p)
191 }
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000192
193 bootclasspath := append(copyOf(image.dexLocationsDeps), updatableBootclasspath...)
Colin Cross44df5812019-02-15 23:06:46 -0800194 return bootclasspath
195 })
196}
197
198var defaultBootclasspathKey = android.NewOnceKey("defaultBootclasspath")
199
200var copyOf = android.CopyOf
201
202func init() {
203 android.RegisterMakeVarsProvider(pctx, dexpreoptConfigMakevars)
204}
205
206func dexpreoptConfigMakevars(ctx android.MakeVarsContext) {
207 ctx.Strict("PRODUCT_BOOTCLASSPATH", strings.Join(defaultBootclasspath(ctx), ":"))
Ulya Trafimovich4d2eeed2019-11-08 10:54:21 +0000208 ctx.Strict("PRODUCT_DEX2OAT_BOOTCLASSPATH", strings.Join(defaultBootImageConfig(ctx).dexLocationsDeps, ":"))
Colin Cross44df5812019-02-15 23:06:46 -0800209 ctx.Strict("PRODUCT_SYSTEM_SERVER_CLASSPATH", strings.Join(systemServerClasspath(ctx), ":"))
Colin Cross9be41522019-02-20 10:40:13 -0800210
211 ctx.Strict("DEXPREOPT_BOOT_JARS_MODULES", strings.Join(defaultBootImageConfig(ctx).modules, ":"))
Colin Cross44df5812019-02-15 23:06:46 -0800212}