aboutsummaryrefslogtreecommitdiffstats
path: root/apex
diff options
context:
space:
mode:
authorJaewoong Jung <jungjw@google.com>2019-03-26 15:07:36 -0700
committerJaewoong Jung <jungjw@google.com>2019-03-28 15:56:22 -0700
commit939ebd5f332b243f2921d26f16922cfa8750d862 (patch)
treeeede38b9a5600ed2ca0d66180321f3f3c17298a2 /apex
parentac7f27eab0ca0574f14875416fa471137c8736f2 (diff)
downloadbuild_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.go69
-rw-r--r--apex/apex_test.go48
-rw-r--r--apex/key.go2
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