Merge "Revert "Append APEX version instead of build ID for APK-in-APEX ...""

This commit is contained in:
Treehugger Robot
2022-05-06 03:17:24 +00:00
committed by Gerrit Code Review
3 changed files with 76 additions and 36 deletions

View File

@@ -19,6 +19,7 @@ package apex
import ( import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"regexp"
"sort" "sort"
"strings" "strings"
@@ -1653,7 +1654,20 @@ type androidApp interface {
var _ androidApp = (*java.AndroidApp)(nil) var _ androidApp = (*java.AndroidApp)(nil)
var _ androidApp = (*java.AndroidAppImport)(nil) var _ androidApp = (*java.AndroidAppImport)(nil)
const APEX_VERSION_PLACEHOLDER = "__APEX_VERSION_PLACEHOLDER__" func sanitizedBuildIdForPath(ctx android.BaseModuleContext) string {
buildId := ctx.Config().BuildId()
// The build ID is used as a suffix for a filename, so ensure that
// the set of characters being used are sanitized.
// - any word character: [a-zA-Z0-9_]
// - dots: .
// - dashes: -
validRegex := regexp.MustCompile(`^[\w\.\-\_]+$`)
if !validRegex.MatchString(buildId) {
ctx.ModuleErrorf("Unable to use build id %s as filename suffix, valid characters are [a-z A-Z 0-9 _ . -].", buildId)
}
return buildId
}
func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp androidApp) apexFile { func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp androidApp) apexFile {
appDir := "app" appDir := "app"
@@ -1664,7 +1678,7 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp androidApp) apexF
// TODO(b/224589412, b/226559955): Ensure that the subdirname is suffixed // TODO(b/224589412, b/226559955): Ensure that the subdirname is suffixed
// so that PackageManager correctly invalidates the existing installed apk // so that PackageManager correctly invalidates the existing installed apk
// in favour of the new APK-in-APEX. See bugs for more information. // in favour of the new APK-in-APEX. See bugs for more information.
dirInApex := filepath.Join(appDir, aapp.InstallApkName()+"@"+APEX_VERSION_PLACEHOLDER) dirInApex := filepath.Join(appDir, aapp.InstallApkName()+"@"+sanitizedBuildIdForPath(ctx))
fileToCopy := aapp.OutputFile() fileToCopy := aapp.OutputFile()
af := newApexFile(ctx, fileToCopy, aapp.BaseModuleName(), dirInApex, app, aapp) af := newApexFile(ctx, fileToCopy, aapp.BaseModuleName(), dirInApex, app, aapp)
@@ -1903,7 +1917,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// suffixed so that PackageManager correctly invalidates the // suffixed so that PackageManager correctly invalidates the
// existing installed apk in favour of the new APK-in-APEX. // existing installed apk in favour of the new APK-in-APEX.
// See bugs for more information. // See bugs for more information.
appDirName := filepath.Join(appDir, ap.BaseModuleName()+"@"+APEX_VERSION_PLACEHOLDER) appDirName := filepath.Join(appDir, ap.BaseModuleName()+"@"+sanitizedBuildIdForPath(ctx))
af := newApexFile(ctx, ap.OutputFile(), ap.BaseModuleName(), appDirName, appSet, ap) af := newApexFile(ctx, ap.OutputFile(), ap.BaseModuleName(), appDirName, appSet, ap)
af.certificate = java.PresignedCertificate af.certificate = java.PresignedCertificate
filesInfo = append(filesInfo, af) filesInfo = append(filesInfo, af)

View File

@@ -223,6 +223,7 @@ var prepareForApexTest = android.GroupFixturePreparers(
// not because of these tests specifically (it's not used by the tests) // not because of these tests specifically (it's not used by the tests)
variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"} variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
variables.Platform_vndk_version = proptools.StringPtr("29") variables.Platform_vndk_version = proptools.StringPtr("29")
variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
}), }),
) )
@@ -682,7 +683,7 @@ func TestDefaults(t *testing.T) {
"etc/myetc", "etc/myetc",
"javalib/myjar.jar", "javalib/myjar.jar",
"lib64/mylib.so", "lib64/mylib.so",
"app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk", "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
"overlay/blue/rro.apk", "overlay/blue/rro.apk",
"etc/bpf/bpf.o", "etc/bpf/bpf.o",
"etc/bpf/bpf2.o", "etc/bpf/bpf2.o",
@@ -5682,8 +5683,8 @@ func TestApexWithApps(t *testing.T) {
apexRule := module.Rule("apexRule") apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureContains(t, copyCmds, "image.apex/app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk") ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@__APEX_VERSION_PLACEHOLDER__/AppFooPriv.apk") ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs") appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
// JNI libraries are uncompressed // JNI libraries are uncompressed
@@ -5700,6 +5701,36 @@ func TestApexWithApps(t *testing.T) {
} }
} }
func TestApexWithAppImportBuildId(t *testing.T) {
invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
for _, id := range invalidBuildIds {
message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
variables.BuildId = proptools.StringPtr(id)
})
testApexError(t, message, `apex {
name: "myapex",
key: "myapex.key",
apps: ["AppFooPrebuilt"],
updatable: false,
}
apex_key {
name: "myapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
android_app_import {
name: "AppFooPrebuilt",
apk: "PrebuiltAppFoo.apk",
presigned: true,
apex_available: ["myapex"],
}
`, fixture)
}
}
func TestApexWithAppImports(t *testing.T) { func TestApexWithAppImports(t *testing.T) {
ctx := testApex(t, ` ctx := testApex(t, `
apex { apex {
@@ -5745,8 +5776,8 @@ func TestApexWithAppImports(t *testing.T) {
apexRule := module.Rule("apexRule") apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@__APEX_VERSION_PLACEHOLDER__/AppFooPrebuilt.apk") ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@__APEX_VERSION_PLACEHOLDER__/AwesomePrebuiltAppFooPriv.apk") ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
} }
func TestApexWithAppImportsPrefer(t *testing.T) { func TestApexWithAppImportsPrefer(t *testing.T) {
@@ -5787,7 +5818,7 @@ func TestApexWithAppImportsPrefer(t *testing.T) {
})) }))
ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
"app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFooPrebuilt.apk", "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
}) })
} }
@@ -5820,7 +5851,7 @@ func TestApexWithTestHelperApp(t *testing.T) {
apexRule := module.Rule("apexRule") apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@__APEX_VERSION_PLACEHOLDER__/TesterHelpAppFoo.apk") ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
} }
func TestApexPropertiesShouldBeDefaultable(t *testing.T) { func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
@@ -6263,8 +6294,8 @@ func TestOverrideApex(t *testing.T) {
apexRule := module.Rule("apexRule") apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureNotContains(t, copyCmds, "image.apex/app/app@__APEX_VERSION_PLACEHOLDER__/app.apk") ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
ensureContains(t, copyCmds, "image.apex/app/override_app@__APEX_VERSION_PLACEHOLDER__/override_app.apk") ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o") ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o") ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
@@ -7168,7 +7199,7 @@ func TestAppBundle(t *testing.T) {
content := bundleConfigRule.Args["content"] content := bundleConfigRule.Args["content"]
ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`) ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk"}]}`) ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
} }
func TestAppSetBundle(t *testing.T) { func TestAppSetBundle(t *testing.T) {
@@ -7199,9 +7230,9 @@ func TestAppSetBundle(t *testing.T) {
if len(copyCmds) != 3 { if len(copyCmds) != 3 {
t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s) t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
} }
ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__$") ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__$") ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__ .*/AppSet.zip$") ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
} }
func TestAppSetBundlePrebuilt(t *testing.T) { func TestAppSetBundlePrebuilt(t *testing.T) {

View File

@@ -107,16 +107,14 @@ var (
`--canned_fs_config ${canned_fs_config} ` + `--canned_fs_config ${canned_fs_config} ` +
`--include_build_info ` + `--include_build_info ` +
`--payload_type image ` + `--payload_type image ` +
`--key ${key} ` + `--key ${key} ${opt_flags} ${image_dir} ${out} `,
`--apex_version_placeholder ${apex_version_placeholder} ` +
`${opt_flags} ${image_dir} ${out} `,
CommandDeps: []string{"${apexer}", "${avbtool}", "${e2fsdroid}", "${merge_zips}", CommandDeps: []string{"${apexer}", "${avbtool}", "${e2fsdroid}", "${merge_zips}",
"${mke2fs}", "${resize2fs}", "${sefcontext_compile}", "${make_f2fs}", "${sload_f2fs}", "${make_erofs}", "${mke2fs}", "${resize2fs}", "${sefcontext_compile}", "${make_f2fs}", "${sload_f2fs}", "${make_erofs}",
"${soong_zip}", "${zipalign}", "${aapt2}", "prebuilts/sdk/current/public/android.jar"}, "${soong_zip}", "${zipalign}", "${aapt2}", "prebuilts/sdk/current/public/android.jar"},
Rspfile: "${out}.copy_commands", Rspfile: "${out}.copy_commands",
RspfileContent: "${copy_commands}", RspfileContent: "${copy_commands}",
Description: "APEX ${image_dir} => ${out}", Description: "APEX ${image_dir} => ${out}",
}, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest", "payload_fs_type", "apex_version_placeholder") }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest", "payload_fs_type")
zipApexRule = pctx.StaticRule("zipApexRule", blueprint.RuleParams{ zipApexRule = pctx.StaticRule("zipApexRule", blueprint.RuleParams{
Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` + Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` +
@@ -124,13 +122,12 @@ var (
`APEXER_TOOL_PATH=${tool_path} ` + `APEXER_TOOL_PATH=${tool_path} ` +
`${apexer} --force --manifest ${manifest} ` + `${apexer} --force --manifest ${manifest} ` +
`--payload_type zip ` + `--payload_type zip ` +
`--apex_version_placeholder ${apex_version_placeholder} ` +
`${image_dir} ${out} `, `${image_dir} ${out} `,
CommandDeps: []string{"${apexer}", "${merge_zips}", "${soong_zip}", "${zipalign}", "${aapt2}"}, CommandDeps: []string{"${apexer}", "${merge_zips}", "${soong_zip}", "${zipalign}", "${aapt2}"},
Rspfile: "${out}.copy_commands", Rspfile: "${out}.copy_commands",
RspfileContent: "${copy_commands}", RspfileContent: "${copy_commands}",
Description: "ZipAPEX ${image_dir} => ${out}", Description: "ZipAPEX ${image_dir} => ${out}",
}, "tool_path", "image_dir", "copy_commands", "manifest", "apex_version_placeholder") }, "tool_path", "image_dir", "copy_commands", "manifest")
apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule", apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule",
blueprint.RuleParams{ blueprint.RuleParams{
@@ -661,15 +658,14 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
Output: unsignedOutputFile, Output: unsignedOutputFile,
Description: "apex (" + apexType.name() + ")", Description: "apex (" + apexType.name() + ")",
Args: map[string]string{ Args: map[string]string{
"tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir,
"image_dir": imageDir.String(), "image_dir": imageDir.String(),
"copy_commands": strings.Join(copyCommands, " && "), "copy_commands": strings.Join(copyCommands, " && "),
"manifest": a.manifestPbOut.String(), "manifest": a.manifestPbOut.String(),
"file_contexts": fileContexts.String(), "file_contexts": fileContexts.String(),
"canned_fs_config": cannedFsConfig.String(), "canned_fs_config": cannedFsConfig.String(),
"key": a.privateKeyFile.String(), "key": a.privateKeyFile.String(),
"opt_flags": strings.Join(optFlags, " "), "opt_flags": strings.Join(optFlags, " "),
"apex_version_placeholder": APEX_VERSION_PLACEHOLDER,
}, },
}) })
@@ -761,11 +757,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
Output: unsignedOutputFile, Output: unsignedOutputFile,
Description: "apex (" + apexType.name() + ")", Description: "apex (" + apexType.name() + ")",
Args: map[string]string{ Args: map[string]string{
"tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir,
"image_dir": imageDir.String(), "image_dir": imageDir.String(),
"copy_commands": strings.Join(copyCommands, " && "), "copy_commands": strings.Join(copyCommands, " && "),
"manifest": a.manifestPbOut.String(), "manifest": a.manifestPbOut.String(),
"apex_version_placeholder": APEX_VERSION_PLACEHOLDER,
}, },
}) })
} }