blob: 673ac2afe361816c8e41d859aacf0e64412e0b19 [file] [log] [blame]
Joe Onorato981c9262023-06-21 15:16:23 -07001// Copyright 2023 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
Yu Liueae7b362023-11-16 17:05:47 -080015package codegen
Joe Onorato981c9262023-06-21 15:16:23 -070016
17import (
Yu Liuf2b94012023-09-19 15:09:10 -070018 "android/soong/android"
Yu Liuf2b94012023-09-19 15:09:10 -070019 "android/soong/java"
Jihoon Kangcca3e0c2023-11-29 19:35:29 +000020
Joe Onorato981c9262023-06-21 15:16:23 -070021 "github.com/google/blueprint"
Yu Liuf2b94012023-09-19 15:09:10 -070022 "github.com/google/blueprint/proptools"
Joe Onorato981c9262023-06-21 15:16:23 -070023)
24
25type declarationsTagType struct {
26 blueprint.BaseDependencyTag
27}
28
29var declarationsTag = declarationsTagType{}
30
Zhi Dou70e21242023-12-20 23:14:34 +000031var aconfigSupportedModes = []string{"production", "test", "exported", "force-read-only"}
Zi Wang275f6542023-11-09 14:59:31 -080032
Joe Onorato981c9262023-06-21 15:16:23 -070033type JavaAconfigDeclarationsLibraryProperties struct {
34 // name of the aconfig_declarations module to generate a library for
35 Aconfig_declarations string
Joe Onoratob7c294a2023-07-28 05:30:25 -070036
Zi Wang275f6542023-11-09 14:59:31 -080037 // default mode is "production", the other accepted modes are:
38 // "test": to generate test mode version of the library
39 // "exported": to generate exported mode version of the library
Zhi Dou70e21242023-12-20 23:14:34 +000040 // "force-read-only": to generate force-read-only mode version of the library
Zi Wang275f6542023-11-09 14:59:31 -080041 // an error will be thrown if the mode is not supported
42 Mode *string
Joe Onorato981c9262023-06-21 15:16:23 -070043}
44
45type JavaAconfigDeclarationsLibraryCallbacks struct {
46 properties JavaAconfigDeclarationsLibraryProperties
47}
48
49func JavaDeclarationsLibraryFactory() android.Module {
50 callbacks := &JavaAconfigDeclarationsLibraryCallbacks{}
51 return java.GeneratedJavaLibraryModuleFactory("java_aconfig_library", callbacks, &callbacks.properties)
52}
53
54func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) DepsMutator(module *java.GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
55 declarations := callbacks.properties.Aconfig_declarations
56 if len(declarations) == 0 {
57 // TODO: Add test for this case
58 ctx.PropertyErrorf("aconfig_declarations", "aconfig_declarations property required")
59 } else {
60 ctx.AddDependency(ctx.Module(), declarationsTag, declarations)
61 }
Joe Onorato8f755852023-08-25 20:23:32 -070062
Victor Changbf0175e2023-12-18 17:36:34 +000063 // "libcore_aconfig_flags_lib" module has a circular dependency because the shared libraries
64 // are built on core_current and the module is used to flag the APIs in the core_current.
65 // http://b/316554963#comment2 has the details of the circular dependency chain.
66 // If a java_aconfig_library uses "none" sdk_version, it should include and build these
67 // annotation files as the shared library themselves.
68 var addLibraries bool = module.Library.Module.SdkVersion(ctx).Kind != android.SdkNone
69 if addLibraries {
70 // Add aconfig-annotations-lib as a dependency for the optimization / code stripping annotations
71 module.AddSharedLibrary("aconfig-annotations-lib")
72 // TODO(b/303773055): Remove the annotation after access issue is resolved.
73 module.AddSharedLibrary("unsupportedappusage")
74 }
Joe Onorato981c9262023-06-21 15:16:23 -070075}
76
Jihoon Kang3921f0b2024-03-12 23:51:37 +000077func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(module *java.GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) {
Joe Onorato981c9262023-06-21 15:16:23 -070078 // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
79 declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag)
80 if len(declarationsModules) != 1 {
Cole Faust779d41c2024-06-14 11:14:33 -070081 panic("Exactly one aconfig_declarations property required")
Joe Onorato981c9262023-06-21 15:16:23 -070082 }
LaMont Jonesaa005ae2023-12-19 19:01:57 +000083 declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
Joe Onorato981c9262023-06-21 15:16:23 -070084
Joe Onorato6fe59eb2023-07-16 13:20:33 -070085 // Generate the action to build the srcjar
Joe Onorato981c9262023-06-21 15:16:23 -070086 srcJarPath := android.PathForModuleGen(ctx, ctx.ModuleName()+".srcjar")
Zi Wang275f6542023-11-09 14:59:31 -080087
Zi Wang275f6542023-11-09 14:59:31 -080088 mode := proptools.StringDefault(callbacks.properties.Mode, "production")
89 if !isModeSupported(mode) {
90 ctx.PropertyErrorf("mode", "%q is not a supported mode", mode)
91 }
Zhi Doue11319d2024-03-05 22:21:03 +000092
93 if mode == "exported" && !declarations.Exportable {
94 // if mode is exported, the corresponding aconfig_declaration must mark its
95 // exportable property true
96 ctx.PropertyErrorf("mode", "exported mode requires its aconfig_declaration has exportable prop true")
97 }
Zi Wang275f6542023-11-09 14:59:31 -080098
Joe Onorato981c9262023-06-21 15:16:23 -070099 ctx.Build(pctx, android.BuildParams{
Joe Onorato37f900c2023-07-18 16:58:16 -0700100 Rule: javaRule,
Jihoon Kangcca3e0c2023-11-29 19:35:29 +0000101 Input: declarations.IntermediateCacheOutputPath,
Joe Onorato981c9262023-06-21 15:16:23 -0700102 Output: srcJarPath,
103 Description: "aconfig.srcjar",
Joe Onoratob7c294a2023-07-28 05:30:25 -0700104 Args: map[string]string{
Liana Kazanovadf1c59a2024-09-23 21:54:04 +0000105 "mode": mode,
Joe Onoratob7c294a2023-07-28 05:30:25 -0700106 },
Joe Onorato981c9262023-06-21 15:16:23 -0700107 })
108
Zi Wang0e5d16c2024-02-08 06:19:34 +0000109 if declarations.Exportable {
110 // Mark our generated code as possibly needing jarjar repackaging
111 // The repackaging only happens when the corresponding aconfig_declaration
112 // has property exportable true
113 module.AddJarJarRenameRule(declarations.Package+".Flags", "")
114 module.AddJarJarRenameRule(declarations.Package+".FeatureFlags", "")
115 module.AddJarJarRenameRule(declarations.Package+".FeatureFlagsImpl", "")
Jeff DeCew4fd15222024-04-24 14:25:38 +0000116 module.AddJarJarRenameRule(declarations.Package+".CustomFeatureFlags", "")
Zi Wang0e5d16c2024-02-08 06:19:34 +0000117 module.AddJarJarRenameRule(declarations.Package+".FakeFeatureFlagsImpl", "")
118 }
Joe Onorato349ae8d2024-02-05 22:46:00 +0000119
Yu Liu67a28422024-03-05 00:36:31 +0000120 android.SetProvider(ctx, android.CodegenInfoProvider, android.CodegenInfo{
Jihoon Kang2a43e562024-02-12 19:05:12 +0000121 AconfigDeclarations: []string{declarationsModules[0].Name()},
122 IntermediateCacheOutputPaths: android.Paths{declarations.IntermediateCacheOutputPath},
123 Srcjars: android.Paths{srcJarPath},
Yu Liu67a28422024-03-05 00:36:31 +0000124 ModeInfos: map[string]android.ModeInfo{
125 ctx.ModuleName(): {
126 Container: declarations.Container,
127 Mode: mode,
128 }},
Jihoon Kang2a43e562024-02-12 19:05:12 +0000129 })
130
Jihoon Kang3921f0b2024-03-12 23:51:37 +0000131 return srcJarPath, declarations.IntermediateCacheOutputPath
132}
133
Zi Wang275f6542023-11-09 14:59:31 -0800134func isModeSupported(mode string) bool {
135 return android.InList(mode, aconfigSupportedModes)
136}