diff options
| author | 2020-01-27 17:01:16 +0000 | |
|---|---|---|
| committer | 2020-02-05 13:33:50 +0000 | |
| commit | 6e12625c0f630572df7af224deed99e2f8bb88aa (patch) | |
| tree | e909af4627723ae86e27fe840ed86f62c288c8d0 | |
| parent | 50fea3b6a7ade1bb0191a0022534c19b3afed3ab (diff) | |
Add support for compat config in APEX.
apex module accepts PlatformCompatConfigIntf as prebuilt,
and places it in the etc folder of the apex.
Test: m
Test: flash device with dummy config in mediaprovider APEX -
the config is present
Change-Id: Ifc62cd262f6c6571c1bf6c2943879aa20877ecad
| -rw-r--r-- | apex/apex.go | 10 | ||||
| -rw-r--r-- | apex/apex_test.go | 36 | ||||
| -rw-r--r-- | java/platform_compat_config.go | 23 |
3 files changed, 63 insertions, 6 deletions
diff --git a/apex/apex.go b/apex/apex.go index 48cdedf3d..53bdc1249 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1194,6 +1194,12 @@ func apexFileForPrebuiltEtc(ctx android.BaseModuleContext, prebuilt android.Preb return newApexFile(ctx, fileToCopy, depName, dirInApex, etc, prebuilt) } +func apexFileForCompatConfig(ctx android.BaseModuleContext, config java.PlatformCompatConfigIntf, depName string) apexFile { + dirInApex := filepath.Join("etc", config.SubDir()) + fileToCopy := config.CompatConfig() + return newApexFile(ctx, fileToCopy, depName, dirInApex, etc, config) +} + func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { android.Module Privileged() bool @@ -1361,8 +1367,10 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { case prebuiltTag: if prebuilt, ok := child.(android.PrebuiltEtcModule); ok { filesInfo = append(filesInfo, apexFileForPrebuiltEtc(ctx, prebuilt, depName)) + } else if prebuilt, ok := child.(java.PlatformCompatConfigIntf); ok { + filesInfo = append(filesInfo, apexFileForCompatConfig(ctx, prebuilt, depName)) } else { - ctx.PropertyErrorf("prebuilts", "%q is not a prebuilt_etc module", depName) + ctx.PropertyErrorf("prebuilts", "%q is not a prebuilt_etc and not a platform_compat_config module", depName) } case testTag: if ccTest, ok := child.(*cc.Module); ok { diff --git a/apex/apex_test.go b/apex/apex_test.go index c7ecbc998..22f0f6f7d 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -299,6 +299,7 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory) ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory) ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory) + ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory) ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) java.RegisterJavaBuildComponents(ctx) @@ -3451,6 +3452,41 @@ func TestJavaSDKLibrary(t *testing.T) { ensureContains(t, xml.Args["content"], `<library name="foo" file="/apex/myapex/javalib/foo.jar"`) } +func TestCompatConfig(t *testing.T) { + ctx, _ := testApex(t, ` + apex { + name: "myapex", + key: "myapex.key", + prebuilts: ["myjar-platform-compat-config"], + java_libs: ["myjar"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + platform_compat_config { + name: "myjar-platform-compat-config", + src: ":myjar", + } + + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "none", + system_modules: "none", + compile_dex: true, + apex_available: [ "myapex" ], + } + `) + ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ + "etc/compatconfig/myjar-platform-compat-config.xml", + "javalib/myjar.jar", + }) +} + func TestRejectNonInstallableJavaLibrary(t *testing.T) { testApexError(t, `"myjar" is not configured to be compiled into dex`, ` apex { diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index 95c0574da..cb8e6841a 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -21,7 +21,7 @@ import ( func init() { android.RegisterSingletonType("platform_compat_config_singleton", platformCompatConfigSingletonFactory) - android.RegisterModuleType("platform_compat_config", platformCompatConfigFactory) + android.RegisterModuleType("platform_compat_config", PlatformCompatConfigFactory) android.RegisterModuleType("global_compat_config", globalCompatConfigFactory) } @@ -50,11 +50,24 @@ func (p *platformCompatConfig) compatConfigMetadata() android.OutputPath { return p.metadataFile } -type platformCompatConfigIntf interface { +func (p *platformCompatConfig) CompatConfig() android.OutputPath { + return p.configFile +} + +func (p *platformCompatConfig) SubDir() string { + return "compatconfig" +} + +type PlatformCompatConfigIntf interface { + android.Module + compatConfigMetadata() android.OutputPath + CompatConfig() android.OutputPath + // Sub dir under etc dir. + SubDir() string } -var _ platformCompatConfigIntf = (*platformCompatConfig)(nil) +var _ PlatformCompatConfigIntf = (*platformCompatConfig)(nil) // compat singleton rules func (p *platformCompatConfigSingleton) GenerateBuildActions(ctx android.SingletonContext) { @@ -62,7 +75,7 @@ func (p *platformCompatConfigSingleton) GenerateBuildActions(ctx android.Singlet var compatConfigMetadata android.Paths ctx.VisitAllModules(func(module android.Module) { - if c, ok := module.(platformCompatConfigIntf); ok { + if c, ok := module.(PlatformCompatConfigIntf); ok { metadata := c.compatConfigMetadata() compatConfigMetadata = append(compatConfigMetadata, metadata) } @@ -130,7 +143,7 @@ func platformCompatConfigSingletonFactory() android.Singleton { return &platformCompatConfigSingleton{} } -func platformCompatConfigFactory() android.Module { +func PlatformCompatConfigFactory() android.Module { module := &platformCompatConfig{} module.AddProperties(&module.properties) android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) |