diff options
author | Jaewoong Jung <jungjw@google.com> | 2019-03-26 15:07:36 -0700 |
---|---|---|
committer | Jaewoong Jung <jungjw@google.com> | 2019-03-28 15:56:22 -0700 |
commit | 939ebd5f332b243f2921d26f16922cfa8750d862 (patch) | |
tree | eede38b9a5600ed2ca0d66180321f3f3c17298a2 /apex | |
parent | ac7f27eab0ca0574f14875416fa471137c8736f2 (diff) | |
download | build_soong-939ebd5f332b243f2921d26f16922cfa8750d862.tar.gz build_soong-939ebd5f332b243f2921d26f16922cfa8750d862.tar.bz2 build_soong-939ebd5f332b243f2921d26f16922cfa8750d862.zip |
Add prebuilt_apex.
Bug: 127789981
Test: apex_test.go + com.android.tzdata.apex
Change-Id: I09bb0a4b2acf310c55c789569da3c9d755638232
Diffstat (limited to 'apex')
-rw-r--r-- | apex/apex.go | 69 | ||||
-rw-r--r-- | apex/apex_test.go | 48 | ||||
-rw-r--r-- | apex/key.go | 2 |
3 files changed, 118 insertions, 1 deletions
diff --git a/apex/apex.go b/apex/apex.go index c1f52a60..685a7746 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -149,6 +149,7 @@ func init() { android.RegisterModuleType("apex", apexBundleFactory) android.RegisterModuleType("apex_test", testApexBundleFactory) android.RegisterModuleType("apex_defaults", defaultsFactory) + android.RegisterModuleType("prebuilt_apex", PrebuiltFactory) android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.TopDown("apex_deps", apexDepsMutator) @@ -1283,3 +1284,71 @@ func DefaultsFactory(props ...interface{}) android.Module { android.InitDefaultsModule(module) return module } + +// +// Prebuilt APEX +// +type Prebuilt struct { + android.ModuleBase + prebuilt android.Prebuilt + + properties PrebuiltProperties + + inputApex android.Path + installDir android.OutputPath +} + +type PrebuiltProperties struct { + // the path to the prebuilt .apex file to import. + Src string `android:"arch_variant"` + + // the name of the apex_key module that contains the matching public key to be installed. + Key *string +} + +func (p *Prebuilt) DepsMutator(ctx android.BottomUpMutatorContext) { + if String(p.properties.Key) == "" { + ctx.ModuleErrorf("key is missing") + return + } + ctx.AddDependency(ctx.Module(), keyTag, *p.properties.Key) +} + +func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { + // TODO(jungjw): Check the key validity. + p.inputApex = p.prebuilt.SingleSourcePath(ctx) + p.installDir = android.PathForModuleInstall(ctx, "apex") + ctx.InstallFile(p.installDir, ctx.ModuleName()+imageApexSuffix, p.inputApex) +} + +func (p *Prebuilt) Prebuilt() *android.Prebuilt { + return &p.prebuilt +} + +func (p *Prebuilt) Name() string { + return p.prebuilt.Name(p.ModuleBase.Name()) +} + +func (p *Prebuilt) AndroidMk() android.AndroidMkData { + return android.AndroidMkData{ + Class: "ETC", + OutputFile: android.OptionalPathForPath(p.inputApex), + Include: "$(BUILD_PREBUILT)", + Extra: []android.AndroidMkExtraFunc{ + func(w io.Writer, outputFile android.Path) { + fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", filepath.Join("$(OUT_DIR)", p.installDir.RelPathString())) + fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", p.BaseModuleName()+imageApexSuffix) + fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", String(p.properties.Key)) + }, + }, + } +} + +// prebuilt_apex imports an `.apex` file into the build graph as if it was built with apex. +func PrebuiltFactory() android.Module { + module := &Prebuilt{} + module.AddProperties(&module.properties) + android.InitSingleSourcePrebuiltModule(module, &module.properties.Src) + android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) + return module +} diff --git a/apex/apex_test.go b/apex/apex_test.go index 8a2e55af..2d9cca6f 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -15,6 +15,8 @@ package apex import ( + "bufio" + "bytes" "io/ioutil" "os" "strings" @@ -36,11 +38,14 @@ func testApex(t *testing.T, bp string) *android.TestContext { ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory)) ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) + ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory)) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.TopDown("apex_deps", apexDepsMutator) ctx.BottomUp("apex", apexMutator) + ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel() + ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel() }) ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory)) @@ -54,6 +59,9 @@ func testApex(t *testing.T, bp string) *android.TestContext { ctx.RegisterModuleType("sh_binary", android.ModuleFactoryAdaptor(android.ShBinaryFactory)) ctx.RegisterModuleType("android_app_certificate", android.ModuleFactoryAdaptor(java.AndroidAppCertificateFactory)) ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory)) + ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) { + ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel() + }) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("image", cc.ImageMutator).Parallel() ctx.BottomUp("link", cc.LinkageMutator).Parallel() @@ -163,6 +171,7 @@ func testApex(t *testing.T, bp string) *android.TestContext { "custom_notice": nil, "testkey2.avbpubkey": nil, "testkey2.pem": nil, + "myapex.apex": nil, }) _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) @@ -1229,3 +1238,42 @@ func TestApexKeyFromOtherModule(t *testing.T) { t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey) } } + +func TestPrebuilt(t *testing.T) { + ctx := testApex(t, ` + prebuilt_apex { + name: "myapex", + src: "myapex.apex", + key: "myapex.key" + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + product_specific: true, + } + `) + + prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt) + + // Check if the key module is added as a required module. + buf := &bytes.Buffer{} + prebuilt.AndroidMk().Extra[0](buf, nil) + found := false + scanner := bufio.NewScanner(bytes.NewReader(buf.Bytes())) + expected := "myapex.key" + for scanner.Scan() { + line := scanner.Text() + tok := strings.Split(line, " := ") + if tok[0] == "LOCAL_REQUIRED_MODULES" { + found = true + if tok[1] != "myapex.key" { + t.Errorf("Unexpected LOCAL_REQUIRED_MODULES '%s', expected '%s'", tok[1], expected) + } + } + } + if !found { + t.Errorf("Couldn't find a LOCAL_REQUIRED_MODULES entry") + } +} diff --git a/apex/key.go b/apex/key.go index 848e8ceb..fbd29bce 100644 --- a/apex/key.go +++ b/apex/key.go @@ -93,7 +93,7 @@ func (m *apexKey) GenerateAndroidBuildActions(ctx android.ModuleContext) { pubKeyName := m.public_key_file.Base()[0 : len(m.public_key_file.Base())-len(m.public_key_file.Ext())] privKeyName := m.private_key_file.Base()[0 : len(m.private_key_file.Base())-len(m.private_key_file.Ext())] - if pubKeyName != privKeyName { + if m.properties.Public_key != nil && m.properties.Private_key != nil && pubKeyName != privKeyName { ctx.ModuleErrorf("public_key %q (keyname:%q) and private_key %q (keyname:%q) do not have same keyname", m.public_key_file.String(), pubKeyName, m.private_key_file, privKeyName) return |