Support java_sdk_library as java_libs of apex

When a java_sdk_library module is added, both impl jar and permission
xml files are packaged together.

For example, when a java_sdk_library "foo" is listed, following two
entries will be in an APEX package.

/javalibs/foo.jar
/etc/permissions/foo.xml

Bug: 145474221
Test: m com.android.cronet
      deapexer list com.android.cronet.apex

Change-Id: If5883c02255e9309f20810b1532d3fbe73bf4e95
This commit is contained in:
Jooyung Han
2019-12-18 15:34:32 +09:00
parent 6b295312f6
commit 58f26aba4e
5 changed files with 115 additions and 31 deletions

View File

@@ -29,12 +29,31 @@ import (
"github.com/google/blueprint/proptools"
)
var (
const (
sdkStubsLibrarySuffix = ".stubs"
sdkSystemApiSuffix = ".system"
sdkTestApiSuffix = ".test"
sdkDocsSuffix = ".docs"
sdkXmlFileSuffix = ".xml"
permissionTemplate = `<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<permissions>
<library name="%s" file="%s"/>
</permissions>
`
)
type stubsLibraryDependencyTag struct {
@@ -134,6 +153,8 @@ type SdkLibrary struct {
publicApiFilePath android.Path
systemApiFilePath android.Path
testApiFilePath android.Path
permissionFile android.Path
}
var _ Dependency = (*SdkLibrary)(nil)
@@ -163,6 +184,10 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
module.Library.GenerateAndroidBuildActions(ctx)
if module.ApexName() != "" {
module.buildPermissionFile(ctx)
}
// Record the paths to the header jars of the library (stubs and impl).
// When this java_sdk_library is dependened from others via "libs" property,
// the recorded paths will be returned depending on the link type of the caller.
@@ -198,6 +223,21 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
})
}
func (module *SdkLibrary) buildPermissionFile(ctx android.ModuleContext) {
xmlContent := strings.ReplaceAll(fmt.Sprintf(permissionTemplate, module.BaseModuleName(), module.implPath()), "\n", "\\n")
permissionFile := android.PathForModuleOut(ctx, module.xmlFileName())
rule := android.NewRuleBuilder()
rule.Command().Text("echo -e ").Text(proptools.ShellEscape(xmlContent)).Text(">").Output(permissionFile)
rule.Build(pctx, ctx, "gen_permission_xml", "Generate permission")
module.permissionFile = permissionFile
}
func (module *SdkLibrary) PermissionFile() android.Path {
return module.permissionFile
}
func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries {
entriesList := module.Library.AndroidMkEntries()
entries := &entriesList[0]
@@ -290,6 +330,12 @@ func (module *SdkLibrary) implName() string {
// File path to the runtime implementation library
func (module *SdkLibrary) implPath() string {
if apexName := module.ApexName(); apexName != "" {
// TODO(b/146468504): ApexName() is only a soong module name, not apex name.
// In most cases, this works fine. But when apex_name is set or override_apex is used
// this can be wrong.
return fmt.Sprintf("/apex/%s/javalib/%s.jar", apexName, module.implName())
}
partition := "system"
if module.SocSpecific() {
partition = "vendor"
@@ -532,31 +578,11 @@ func (module *SdkLibrary) createDocs(mctx android.LoadHookContext, apiScope apiS
// Creates the xml file that publicizes the runtime library
func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) {
template := `
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<permissions>
<library name="%s" file="%s"/>
</permissions>
`
// genrule to generate the xml file content from the template above
// TODO: preserve newlines in the generate xml file. Newlines are being squashed
// in the ninja file. Do we need to have an external tool for this?
xmlContent := fmt.Sprintf(template, module.BaseModuleName(), module.implPath())
xmlContent := fmt.Sprintf(permissionTemplate, module.BaseModuleName(), module.implPath())
genruleProps := struct {
Name *string
Cmd *string
@@ -666,10 +692,12 @@ func javaSdkLibraries(config android.Config) *[]string {
func (module *SdkLibrary) CreateInternalModules(mctx android.LoadHookContext) {
if len(module.Library.Module.properties.Srcs) == 0 {
mctx.PropertyErrorf("srcs", "java_sdk_library must specify srcs")
return
}
if len(module.sdkLibraryProperties.Api_packages) == 0 {
mctx.PropertyErrorf("api_packages", "java_sdk_library must specify api_packages")
return
}
missing_current_api := false
@@ -745,6 +773,7 @@ func (module *SdkLibrary) InitSdkLibraryProperties() {
func SdkLibraryFactory() android.Module {
module := &SdkLibrary{}
module.InitSdkLibraryProperties()
android.InitApexModule(module)
InitJavaModule(module, android.HostAndDeviceSupported)
android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.CreateInternalModules(ctx) })
return module