diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-07-02 01:10:03 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-07-02 01:10:03 +0000 |
commit | dc03d8e8f234235bb6e7bd4fce164a790eba8262 (patch) | |
tree | c525a5b39166148fa049a812fbf77dc2217e6f24 | |
parent | 0e6d9396ad6992ca92424c71871a88bf6fc4e885 (diff) | |
parent | f221e59429f5f68fc26e3653677ec61967af6ecd (diff) | |
download | build_soong-dc03d8e8f234235bb6e7bd4fce164a790eba8262.tar.gz build_soong-dc03d8e8f234235bb6e7bd4fce164a790eba8262.tar.bz2 build_soong-dc03d8e8f234235bb6e7bd4fce164a790eba8262.zip |
Snap for 6647388 from f221e59429f5f68fc26e3653677ec61967af6ecd to rvc-release
Change-Id: I43e90572c76464e3cb932132572da70c2b424bab
-rw-r--r-- | apex/prebuilt.go | 36 | ||||
-rw-r--r-- | cc/vendor_snapshot.go | 19 | ||||
-rw-r--r-- | cmd/extract_apks/main.go | 39 | ||||
-rw-r--r-- | cmd/extract_apks/main_test.go | 38 | ||||
-rw-r--r-- | java/androidmk.go | 1 | ||||
-rwxr-xr-x | java/app.go | 13 | ||||
-rw-r--r-- | java/app_test.go | 5 | ||||
-rw-r--r-- | java/builder.go | 3 |
8 files changed, 123 insertions, 31 deletions
diff --git a/apex/prebuilt.go b/apex/prebuilt.go index bf574dc6..794799ee 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -21,6 +21,7 @@ import ( "android/soong/android" "android/soong/java" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -238,6 +239,9 @@ type ApexSet struct { // list of commands to create symlinks for backward compatibility. // these commands will be attached as LOCAL_POST_INSTALL_CMD compatSymlinks []string + + hostRequired []string + postInstallCommands []string } type ApexSetProperties struct { @@ -322,21 +326,43 @@ func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { for _, overridden := range a.properties.Overrides { a.compatSymlinks = append(a.compatSymlinks, makeCompatSymlinks(overridden, ctx)...) } + + if ctx.Config().InstallExtraFlattenedApexes() { + // flattened apex should be in /system_ext/apex + flattenedApexDir := android.PathForModuleInstall(&systemExtContext{ctx}, "apex", a.BaseModuleName()) + a.postInstallCommands = append(a.postInstallCommands, + fmt.Sprintf("$(HOST_OUT_EXECUTABLES)/deapexer --debugfs_path $(HOST_OUT_EXECUTABLES)/debugfs extract %s %s", + a.outputApex.String(), + flattenedApexDir.ToMakePath().String(), + )) + a.hostRequired = []string{"deapexer", "debugfs"} + } +} + +type systemExtContext struct { + android.ModuleContext +} + +func (*systemExtContext) SystemExtSpecific() bool { + return true } func (a *ApexSet) AndroidMkEntries() []android.AndroidMkEntries { return []android.AndroidMkEntries{android.AndroidMkEntries{ - Class: "ETC", - OutputFile: android.OptionalPathForPath(a.outputApex), - Include: "$(BUILD_PREBUILT)", + Class: "ETC", + OutputFile: android.OptionalPathForPath(a.outputApex), + Include: "$(BUILD_PREBUILT)", + Host_required: a.hostRequired, ExtraEntries: []android.AndroidMkExtraEntriesFunc{ func(entries *android.AndroidMkEntries) { entries.SetString("LOCAL_MODULE_PATH", a.installDir.ToMakePath().String()) entries.SetString("LOCAL_MODULE_STEM", a.installFilename) entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !a.installable()) entries.AddStrings("LOCAL_OVERRIDES_MODULES", a.properties.Overrides...) - if len(a.compatSymlinks) > 0 { - entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(a.compatSymlinks, " && ")) + postInstallCommands := append([]string{}, a.postInstallCommands...) + postInstallCommands = append(postInstallCommands, a.compatSymlinks...) + if len(postInstallCommands) > 0 { + entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(postInstallCommands, " && ")) } }, }, diff --git a/cc/vendor_snapshot.go b/cc/vendor_snapshot.go index b89640a8..b11b1a82 100644 --- a/cc/vendor_snapshot.go +++ b/cc/vendor_snapshot.go @@ -569,7 +569,13 @@ func isVendorSnapshotModule(m *Module, moduleDir string) bool { return m.outputFile.Valid() && proptools.BoolDefault(m.VendorProperties.Vendor_available, true) } if l.shared() { - return m.outputFile.Valid() && !m.IsVndk() + if !m.outputFile.Valid() { + return false + } + if !m.IsVndk() { + return true + } + return m.isVndkExt() } return true } @@ -669,7 +675,16 @@ func (c *vendorSnapshotSingleton) GenerateBuildActions(ctx android.SingletonCont // Common properties among snapshots. prop.ModuleName = ctx.ModuleName(m) - prop.RelativeInstallPath = m.RelativeInstallPath() + if m.isVndkExt() { + // vndk exts are installed to /vendor/lib(64)?/vndk(-sp)? + if m.isVndkSp() { + prop.RelativeInstallPath = "vndk-sp" + } else { + prop.RelativeInstallPath = "vndk" + } + } else { + prop.RelativeInstallPath = m.RelativeInstallPath() + } prop.RuntimeLibs = m.Properties.SnapshotRuntimeLibs prop.Required = m.RequiredModuleNames() for _, path := range m.InitRc() { diff --git a/cmd/extract_apks/main.go b/cmd/extract_apks/main.go index e9a850ee..db54ffba 100644 --- a/cmd/extract_apks/main.go +++ b/cmd/extract_apks/main.go @@ -24,6 +24,7 @@ import ( "math" "os" "regexp" + "sort" "strings" "github.com/golang/protobuf/proto" @@ -355,7 +356,7 @@ type Zip2ZipWriter interface { // Writes out selected entries, renaming them as needed func (apkSet *ApkSet) writeApks(selected SelectionResult, config TargetConfig, - writer Zip2ZipWriter) error { + writer Zip2ZipWriter, partition string) ([]string, error) { // Renaming rules: // splits/MODULE-master.apk to STEM.apk // else @@ -389,10 +390,11 @@ func (apkSet *ApkSet) writeApks(selected SelectionResult, config TargetConfig, } entryOrigin := make(map[string]string) // output entry to input entry + var apkcerts []string for _, apk := range selected.entries { apkFile, ok := apkSet.entries[apk] if !ok { - return fmt.Errorf("TOC refers to an entry %s which does not exist", apk) + return nil, fmt.Errorf("TOC refers to an entry %s which does not exist", apk) } inName := apkFile.Name outName, ok := renamer(inName) @@ -405,10 +407,15 @@ func (apkSet *ApkSet) writeApks(selected SelectionResult, config TargetConfig, } entryOrigin[outName] = inName if err := writer.CopyFrom(apkFile, outName); err != nil { - return err + return nil, err + } + if partition != "" { + apkcerts = append(apkcerts, fmt.Sprintf( + `name="%s" certificate="PRESIGNED" private_key="" partition="%s"`, outName, partition)) } } - return nil + sort.Strings(apkcerts) + return apkcerts, nil } func (apkSet *ApkSet) extractAndCopySingle(selected SelectionResult, outFile *os.File) error { @@ -433,6 +440,9 @@ var ( } extractSingle = flag.Bool("extract-single", false, "extract a single target and output it uncompressed. only available for standalone apks and apexes.") + apkcertsOutput = flag.String("apkcerts", "", + "optional apkcerts.txt output file containing signing info of all outputted apks") + partition = flag.String("partition", "", "partition string. required when -apkcerts is used.") ) // Parse abi values @@ -485,7 +495,8 @@ func (s screenDensityFlagValue) Set(densityList string) error { func processArgs() { flag.Usage = func() { fmt.Fprintln(os.Stderr, `usage: extract_apks -o <output-file> -sdk-version value -abis value `+ - `-screen-densities value {-stem value | -extract-single} [-allow-prereleased] <APK set>`) + `-screen-densities value {-stem value | -extract-single} [-allow-prereleased] `+ + `[-apkcerts <apkcerts output file> -partition <partition>] <APK set>`) flag.PrintDefaults() os.Exit(2) } @@ -498,7 +509,8 @@ func processArgs() { "allow prereleased") flag.StringVar(&targetConfig.stem, "stem", "", "output entries base name in the output zip file") flag.Parse() - if (*outputFile == "") || len(flag.Args()) != 1 || *version == 0 || (targetConfig.stem == "" && !*extractSingle) { + if (*outputFile == "") || len(flag.Args()) != 1 || *version == 0 || + (targetConfig.stem == "" && !*extractSingle) || (*apkcertsOutput != "" && *partition == "") { flag.Usage() } targetConfig.sdkVersion = int32(*version) @@ -536,7 +548,20 @@ func main() { log.Fatal(err) } }() - err = apkSet.writeApks(sel, targetConfig, writer) + apkcerts, err := apkSet.writeApks(sel, targetConfig, writer, *partition) + if err == nil && *apkcertsOutput != "" { + apkcertsFile, err := os.Create(*apkcertsOutput) + if err != nil { + log.Fatal(err) + } + defer apkcertsFile.Close() + for _, a := range apkcerts { + _, err = apkcertsFile.WriteString(a + "\n") + if err != nil { + log.Fatal(err) + } + } + } } if err != nil { log.Fatal(err) diff --git a/cmd/extract_apks/main_test.go b/cmd/extract_apks/main_test.go index bdd4becc..c3e6a2de 100644 --- a/cmd/extract_apks/main_test.go +++ b/cmd/extract_apks/main_test.go @@ -16,10 +16,11 @@ package main import ( "fmt" - "github.com/golang/protobuf/proto" "reflect" "testing" + "github.com/golang/protobuf/proto" + bp "android/soong/cmd/extract_apks/bundle_proto" "android/soong/third_party/zip" ) @@ -430,48 +431,63 @@ func (w testZip2ZipWriter) CopyFrom(file *zip.File, out string) error { return nil } -type testCaseWriteZip struct { +type testCaseWriteApks struct { name string moduleName string stem string + partition string // what we write from what - expected map[string]string + expectedZipEntries map[string]string + expectedApkcerts []string } -func TestWriteZip(t *testing.T) { - testCases := []testCaseWriteZip{ +func TestWriteApks(t *testing.T) { + testCases := []testCaseWriteApks{ { name: "splits", moduleName: "mybase", stem: "Foo", - expected: map[string]string{ + partition: "system", + expectedZipEntries: map[string]string{ "Foo.apk": "splits/mybase-master.apk", "Foo-xhdpi.apk": "splits/mybase-xhdpi.apk", }, + expectedApkcerts: []string{ + `name="Foo-xhdpi.apk" certificate="PRESIGNED" private_key="" partition="system"`, + `name="Foo.apk" certificate="PRESIGNED" private_key="" partition="system"`, + }, }, { name: "universal", moduleName: "base", stem: "Bar", - expected: map[string]string{ + partition: "product", + expectedZipEntries: map[string]string{ "Bar.apk": "universal.apk", }, + expectedApkcerts: []string{ + `name="Bar.apk" certificate="PRESIGNED" private_key="" partition="product"`, + }, }, } for _, testCase := range testCases { apkSet := ApkSet{entries: make(map[string]*zip.File)} sel := SelectionResult{moduleName: testCase.moduleName} - for _, in := range testCase.expected { + for _, in := range testCase.expectedZipEntries { apkSet.entries[in] = &zip.File{FileHeader: zip.FileHeader{Name: in}} sel.entries = append(sel.entries, in) } writer := testZip2ZipWriter{make(map[string]string)} config := TargetConfig{stem: testCase.stem} - if err := apkSet.writeApks(sel, config, writer); err != nil { + apkcerts, err := apkSet.writeApks(sel, config, writer, testCase.partition) + if err != nil { t.Error(err) } - if !reflect.DeepEqual(testCase.expected, writer.entries) { - t.Errorf("expected %v, got %v", testCase.expected, writer.entries) + if !reflect.DeepEqual(testCase.expectedZipEntries, writer.entries) { + t.Errorf("expected zip entries %v, got %v", testCase.expectedZipEntries, writer.entries) + } + if !reflect.DeepEqual(testCase.expectedApkcerts, apkcerts) { + t.Errorf("expected apkcerts %v, got %v", testCase.expectedApkcerts, apkcerts) } } } diff --git a/java/androidmk.go b/java/androidmk.go index 75fb5fb0..8953c31c 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -716,6 +716,7 @@ func (apkSet *AndroidAppSet) AndroidMkEntries() []android.AndroidMkEntries { func(entries *android.AndroidMkEntries) { entries.SetBoolIfTrue("LOCAL_PRIVILEGED_MODULE", apkSet.Privileged()) entries.SetString("LOCAL_APK_SET_MASTER_FILE", apkSet.masterFile) + entries.SetPath("LOCAL_APKCERTS_FILE", apkSet.apkcertsFile) entries.AddStrings("LOCAL_OVERRIDES_PACKAGES", apkSet.properties.Overrides...) }, }, diff --git a/java/app.go b/java/app.go index e2e3a53d..3f12e91c 100755 --- a/java/app.go +++ b/java/app.go @@ -78,6 +78,7 @@ type AndroidAppSet struct { properties AndroidAppSetProperties packedOutput android.WritablePath masterFile string + apkcertsFile android.ModuleOutPath } func (as *AndroidAppSet) Name() string { @@ -129,6 +130,7 @@ func SupportedAbis(ctx android.ModuleContext) []string { func (as *AndroidAppSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { as.packedOutput = android.PathForModuleOut(ctx, ctx.ModuleName()+".zip") + as.apkcertsFile = android.PathForModuleOut(ctx, "apkcerts.txt") // We are assuming here that the master file in the APK // set has `.apk` suffix. If it doesn't the build will fail. // APK sets containing APEX files are handled elsewhere. @@ -141,16 +143,19 @@ func (as *AndroidAppSet) GenerateAndroidBuildActions(ctx android.ModuleContext) // TODO(asmundak): do we support device features ctx.Build(pctx, android.BuildParams{ - Rule: extractMatchingApks, - Description: "Extract APKs from APK set", - Output: as.packedOutput, - Inputs: android.Paths{as.prebuilt.SingleSourcePath(ctx)}, + Rule: extractMatchingApks, + Description: "Extract APKs from APK set", + Output: as.packedOutput, + ImplicitOutput: as.apkcertsFile, + Inputs: android.Paths{as.prebuilt.SingleSourcePath(ctx)}, Args: map[string]string{ "abis": strings.Join(SupportedAbis(ctx), ","), "allow-prereleased": strconv.FormatBool(proptools.Bool(as.properties.Prerelease)), "screen-densities": screenDensities, "sdk-version": ctx.Config().PlatformSdkVersion(), "stem": as.BaseModuleName(), + "apkcerts": as.apkcertsFile.String(), + "partition": as.PartitionTag(ctx.DeviceConfig()), }, }) } diff --git a/java/app_test.go b/java/app_test.go index 4d47496d..8ef31520 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -147,7 +147,7 @@ func TestAndroidAppSet(t *testing.T) { name: "foo", set: "prebuilts/apks/app.apks", prerelease: true, - }`) + }`) module := ctx.ModuleForTests("foo", "android_common") const packedSplitApks = "foo.zip" params := module.Output(packedSplitApks) @@ -157,6 +157,9 @@ func TestAndroidAppSet(t *testing.T) { if s := params.Args["allow-prereleased"]; s != "true" { t.Errorf("wrong allow-prereleased value: '%s', expected 'true'", s) } + if s := params.Args["partition"]; s != "system" { + t.Errorf("wrong partition value: '%s', expected 'system'", s) + } mkEntries := android.AndroidMkEntriesForTest(t, config, "", module.Module())[0] actualMaster := mkEntries.EntryMap["LOCAL_APK_SET_MASTER_FILE"] expectedMaster := []string{"foo.apk"} diff --git a/java/builder.go b/java/builder.go index a27e5c39..7318fcba 100644 --- a/java/builder.go +++ b/java/builder.go @@ -120,10 +120,11 @@ var ( `${config.ExtractApksCmd} -o "${out}" -allow-prereleased=${allow-prereleased} ` + `-sdk-version=${sdk-version} -abis=${abis} ` + `--screen-densities=${screen-densities} --stem=${stem} ` + + `-apkcerts=${apkcerts} -partition=${partition} ` + `${in}`, CommandDeps: []string{"${config.ExtractApksCmd}"}, }, - "abis", "allow-prereleased", "screen-densities", "sdk-version", "stem") + "abis", "allow-prereleased", "screen-densities", "sdk-version", "stem", "apkcerts", "partition") turbine, turbineRE = remoteexec.StaticRules(pctx, "turbine", blueprint.RuleParams{ |