diff options
author | 2021-11-12 17:41:02 -0800 | |
---|---|---|
committer | 2021-11-17 19:55:33 -0800 | |
commit | 50ed1f9ccb42ce2faaf652fe1819dbd57f35b44d (patch) | |
tree | db3bafe39d558460e412bcd0b1d87038f604f3f0 | |
parent | ffbcd1d8a086c581a14a42e54fa0019c637f56e6 (diff) |
Install android_app_set modules in Soong
Add support for installing extra files from a zip file when installing
a primary file, and use it to support installing android_app_set modules,
which install a primary APK and then an unknown set of additional splits
APKs.
Test: app_set_test.go
Test: install test android_app_set
Bug: 204136549
Change-Id: Ia92f7e5c427adcef3bcf59c82a2f83450905c01d
-rw-r--r-- | android/defs.go | 8 | ||||
-rw-r--r-- | android/makevars.go | 14 | ||||
-rw-r--r-- | android/module.go | 42 | ||||
-rw-r--r-- | java/app_set.go | 10 |
4 files changed, 63 insertions, 11 deletions
diff --git a/android/defs.go b/android/defs.go index c8e2e9b3c..362b382b3 100644 --- a/android/defs.go +++ b/android/defs.go @@ -52,10 +52,10 @@ var ( // A copy rule. Cp = pctx.AndroidStaticRule("Cp", blueprint.RuleParams{ - Command: "rm -f $out && cp $cpPreserveSymlinks $cpFlags $in $out", + Command: "rm -f $out && cp $cpPreserveSymlinks $cpFlags $in $out$extraCmds", Description: "cp $out", }, - "cpFlags") + "cpFlags", "extraCmds") // A copy rule that only updates the output if it changed. CpIfChanged = pctx.AndroidStaticRule("CpIfChanged", @@ -68,10 +68,10 @@ var ( CpExecutable = pctx.AndroidStaticRule("CpExecutable", blueprint.RuleParams{ - Command: "rm -f $out && cp $cpPreserveSymlinks $cpFlags $in $out && chmod +x $out", + Command: "rm -f $out && cp $cpPreserveSymlinks $cpFlags $in $out && chmod +x $out$extraCmds", Description: "cp $out", }, - "cpFlags") + "cpFlags", "extraCmds") // A timestamp touch rule. Touch = pctx.AndroidStaticRule("Touch", diff --git a/android/makevars.go b/android/makevars.go index 665d57625..ece7091b6 100644 --- a/android/makevars.go +++ b/android/makevars.go @@ -456,6 +456,9 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by for _, dep := range install.implicitDeps { fmt.Fprintf(buf, " %s", dep.String()) } + if extraFiles := install.extraFiles; extraFiles != nil { + fmt.Fprintf(buf, " %s", extraFiles.zip.String()) + } if len(install.orderOnlyDeps) > 0 { fmt.Fprintf(buf, " |") } @@ -463,12 +466,14 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by fmt.Fprintf(buf, " %s", dep.String()) } fmt.Fprintln(buf) - - fmt.Fprintf(buf, "\trm -f $@ && cp -f %s $< $@", preserveSymlinksFlag) + fmt.Fprintln(buf, "\t@echo \"Install $@\"") + fmt.Fprintf(buf, "\trm -f $@ && cp -f %s $< $@\n", preserveSymlinksFlag) if install.executable { - fmt.Fprintf(buf, " && chmod +x $@") + fmt.Fprintf(buf, "\tchmod +x $@\n") + } + if extraFiles := install.extraFiles; extraFiles != nil { + fmt.Fprintf(buf, "\tunzip -qDD -d '%s' '%s'\n", extraFiles.dir.String(), extraFiles.zip.String()) } - fmt.Fprintln(buf) fmt.Fprintln(buf) } @@ -504,6 +509,7 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by fromStr = symlink.absFrom } + fmt.Fprintln(buf, "\t@echo \"Symlink $@\"") fmt.Fprintf(buf, "\trm -f $@ && ln -sfn %s $@", fromStr) fmt.Fprintln(buf) fmt.Fprintln(buf) diff --git a/android/module.go b/android/module.go index c778078d0..e100330de 100644 --- a/android/module.go +++ b/android/module.go @@ -381,6 +381,16 @@ type ModuleContext interface { // for which IsInstallDepNeeded returns true. InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath + // InstallFileWithExtraFilesZip creates a rule to copy srcPath to name in the installPath + // directory, and also unzip a zip file containing extra files to install into the same + // directory. + // + // The installed file will be returned by FilesToInstall(), and the PackagingSpec for the + // installed file will be returned by PackagingSpecs() on this module or by + // TransitivePackagingSpecs() on modules that depend on this module through dependency tags + // for which IsInstallDepNeeded returns true. + InstallFileWithExtraFilesZip(installPath InstallPath, name string, srcPath Path, extraZip Path, deps ...Path) InstallPath + // InstallSymlink creates a rule to create a symlink from src srcPath to name in the installPath // directory. // @@ -2235,10 +2245,16 @@ type katiInstall struct { implicitDeps Paths orderOnlyDeps Paths executable bool + extraFiles *extraFilesZip absFrom string } +type extraFilesZip struct { + zip Path + dir InstallPath +} + type katiInstalls []katiInstall // BuiltInstalled returns the katiInstalls in the form used by $(call copy-many-files) in Make, a @@ -2852,12 +2868,20 @@ func (m *moduleContext) skipInstall() bool { func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath { - return m.installFile(installPath, name, srcPath, deps, false) + return m.installFile(installPath, name, srcPath, deps, false, nil) } func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath { - return m.installFile(installPath, name, srcPath, deps, true) + return m.installFile(installPath, name, srcPath, deps, true, nil) +} + +func (m *moduleContext) InstallFileWithExtraFilesZip(installPath InstallPath, name string, srcPath Path, + extraZip Path, deps ...Path) InstallPath { + return m.installFile(installPath, name, srcPath, deps, false, &extraFilesZip{ + zip: extraZip, + dir: installPath, + }) } func (m *moduleContext) PackageFile(installPath InstallPath, name string, srcPath Path) PackagingSpec { @@ -2878,7 +2902,8 @@ func (m *moduleContext) packageFile(fullInstallPath InstallPath, srcPath Path, e return spec } -func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path, deps []Path, executable bool) InstallPath { +func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path, deps []Path, + executable bool, extraZip *extraFilesZip) InstallPath { fullInstallPath := installPath.Join(m, name) m.module.base().hooks.runInstallHooks(m, srcPath, fullInstallPath, false) @@ -2906,6 +2931,7 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat implicitDeps: implicitDeps, orderOnlyDeps: orderOnlyDeps, executable: executable, + extraFiles: extraZip, }) } else { rule := Cp @@ -2913,6 +2939,13 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat rule = CpExecutable } + extraCmds := "" + if extraZip != nil { + extraCmds += fmt.Sprintf(" && unzip -qDD -d '%s' '%s'", + extraZip.dir.String(), extraZip.zip.String()) + implicitDeps = append(implicitDeps, extraZip.zip) + } + m.Build(pctx, BuildParams{ Rule: rule, Description: "install " + fullInstallPath.Base(), @@ -2921,6 +2954,9 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat Implicits: implicitDeps, OrderOnly: orderOnlyDeps, Default: !m.Config().KatiEnabled(), + Args: map[string]string{ + "extraCmds": extraCmds, + }, }) } diff --git a/java/app_set.go b/java/app_set.go index 2e9a4abdc..694b1670e 100644 --- a/java/app_set.go +++ b/java/app_set.go @@ -143,8 +143,18 @@ func (as *AndroidAppSet) GenerateAndroidBuildActions(ctx android.ModuleContext) "zip": as.packedOutput.String(), }, }) + + var installDir android.InstallPath + if as.Privileged() { + installDir = android.PathForModuleInstall(ctx, "priv-app", as.BaseModuleName()) + } else { + installDir = android.PathForModuleInstall(ctx, "app", as.BaseModuleName()) + } + ctx.InstallFileWithExtraFilesZip(installDir, as.BaseModuleName()+".apk", as.primaryOutput, as.packedOutput) } +func (as *AndroidAppSet) InstallBypassMake() bool { return true } + // android_app_set extracts a set of APKs based on the target device // configuration and installs this set as "split APKs". // The extracted set always contains an APK whose name is |