Loading apex/apex.go +6 −4 Original line number Diff line number Diff line Loading @@ -343,6 +343,10 @@ type apexBundleProperties struct { // Whenever apex_payload.img of the APEX should include dm-verity hashtree. // Should be only used in tests#. Test_only_no_hashtree *bool // Whether this APEX should support Android10. Default is false. If this is set true, then apex_manifest.json is bundled as well // because Android10 requires legacy apex_manifest.json instead of apex_manifest.pb Legacy_android10_support *bool } type apexTargetBundleProperties struct { Loading Loading @@ -507,9 +511,7 @@ type apexBundle struct { artApex bool primaryApexType bool // intermediate path for apex_manifest.json manifestJsonOut android.WritablePath manifestJsonFullOut android.WritablePath manifestPbOut android.WritablePath // list of commands to create symlinks for backward compatibility Loading apex/apex_test.go +26 −5 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel() }) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("link", cc.LinkageMutator).Parallel() ctx.BottomUp("vndk", cc.VndkMutator).Parallel() ctx.BottomUp("link", cc.LinkageMutator).Parallel() ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel() ctx.BottomUp("version", cc.VersionMutator).Parallel() ctx.BottomUp("begin", cc.BeginMutator).Parallel() Loading Loading @@ -547,9 +547,10 @@ func TestApexManifest(t *testing.T) { `) module := ctx.ModuleForTests("myapex", "android_common_myapex_image") module.Output("apex_manifest.pb") module.Output("apex_manifest.json") module.Output("apex_manifest_full.json") args := module.Rule("apexRule").Args if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() { t.Error("manifest should be apex_manifest.pb, but " + manifest) } } func TestBasicZipApex(t *testing.T) { Loading Loading @@ -2452,7 +2453,7 @@ func TestApexWithTests(t *testing.T) { ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.json.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n") } Loading Loading @@ -3034,6 +3035,26 @@ func TestOverrideApex(t *testing.T) { ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex") } func TestLegacyAndroid10Support(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", legacy_android10_support: true, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex_image") args := module.Rule("apexRule").Args ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String()) } func TestMain(m *testing.M) { run := func() int { setUp() Loading apex/builder.go +39 −36 Original line number Diff line number Diff line Loading @@ -103,7 +103,6 @@ var ( `(. ${out}.copy_commands) && ` + `APEXER_TOOL_PATH=${tool_path} ` + `${apexer} --force --manifest ${manifest} ` + `--manifest_json ${manifest_json} --manifest_json_full ${manifest_json_full} ` + `--file_contexts ${file_contexts} ` + `--canned_fs_config ${canned_fs_config} ` + `--payload_type image ` + Loading @@ -114,22 +113,20 @@ var ( Rspfile: "${out}.copy_commands", RspfileContent: "${copy_commands}", Description: "APEX ${image_dir} => ${out}", }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest", "manifest_json", "manifest_json_full", ) }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest") zipApexRule = pctx.StaticRule("zipApexRule", blueprint.RuleParams{ Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` + `(. ${out}.copy_commands) && ` + `APEXER_TOOL_PATH=${tool_path} ` + `${apexer} --force --manifest ${manifest} --manifest_json_full ${manifest_json_full} ` + `${apexer} --force --manifest ${manifest} ` + `--payload_type zip ` + `${image_dir} ${out} `, CommandDeps: []string{"${apexer}", "${merge_zips}", "${soong_zip}", "${zipalign}", "${aapt2}"}, Rspfile: "${out}.copy_commands", RspfileContent: "${copy_commands}", Description: "ZipAPEX ${image_dir} => ${out}", }, "tool_path", "image_dir", "copy_commands", "manifest", "manifest_json_full") }, "tool_path", "image_dir", "copy_commands", "manifest") apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule", blueprint.RuleParams{ Loading Loading @@ -171,7 +168,7 @@ var ( func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, requireNativeLibs []string) { manifestSrc := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "apex_manifest.json")) a.manifestJsonFullOut = android.PathForModuleOut(ctx, "apex_manifest_full.json") manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json") // put dependency({provide|require}NativeLibs) in apex_manifest.json provideNativeLibs = android.SortedUniqueStrings(provideNativeLibs) Loading @@ -186,7 +183,7 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, ctx.Build(pctx, android.BuildParams{ Rule: apexManifestRule, Input: manifestSrc, Output: a.manifestJsonFullOut, Output: manifestJsonFullOut, Args: map[string]string{ "provideNativeLibs": strings.Join(provideNativeLibs, " "), "requireNativeLibs": strings.Join(requireNativeLibs, " "), Loading @@ -194,20 +191,22 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, }, }) if proptools.Bool(a.properties.Legacy_android10_support) { // b/143654022 Q apexd can't understand newly added keys in apex_manifest.json // prepare stripped-down version so that APEX modules built from R+ can be installed to Q a.manifestJsonOut = android.PathForModuleOut(ctx, "apex_manifest.json") ctx.Build(pctx, android.BuildParams{ Rule: stripApexManifestRule, Input: a.manifestJsonFullOut, Input: manifestJsonFullOut, Output: a.manifestJsonOut, }) } // from R+, protobuf binary format (.pb) is the standard format for apex_manifest a.manifestPbOut = android.PathForModuleOut(ctx, "apex_manifest.pb") ctx.Build(pctx, android.BuildParams{ Rule: pbApexManifestRule, Input: a.manifestJsonFullOut, Input: manifestJsonFullOut, Output: a.manifestPbOut, }) } Loading Loading @@ -256,7 +255,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { copyCommands := []string{} emitCommands := []string{} imageContentFile := android.PathForModuleOut(ctx, a.Name()+"-content.txt") emitCommands = append(emitCommands, "echo ./apex_manifest.pb >> "+imageContentFile.String()) if proptools.Bool(a.properties.Legacy_android10_support) { emitCommands = append(emitCommands, "echo ./apex_manifest.json >> "+imageContentFile.String()) } for i, src := range filesToCopy { dest := filepath.Join(a.filesInfo[i].installDir, src.Base()) emitCommands = append(emitCommands, "echo './"+dest+"' >> "+imageContentFile.String()) Loading @@ -271,7 +273,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { emitCommands = append(emitCommands, "sort -o "+imageContentFile.String()+" "+imageContentFile.String()) implicitInputs := append(android.Paths(nil), filesToCopy...) implicitInputs = append(implicitInputs, a.manifestPbOut, a.manifestJsonFullOut, a.manifestJsonOut) implicitInputs = append(implicitInputs, a.manifestPbOut) if a.properties.Whitelisted_files != nil { ctx.Build(pctx, android.BuildParams{ Loading Loading @@ -394,6 +396,11 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { optFlags = append(optFlags, "--do_not_check_keyname") } if proptools.Bool(a.properties.Legacy_android10_support) { implicitInputs = append(implicitInputs, a.manifestJsonOut) optFlags = append(optFlags, "--manifest_json "+a.manifestJsonOut.String()) } ctx.Build(pctx, android.BuildParams{ Rule: apexRule, Implicits: implicitInputs, Loading @@ -403,8 +410,6 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, "image_dir": android.PathForModuleOut(ctx, "image"+suffix).String(), "copy_commands": strings.Join(copyCommands, " && "), "manifest_json_full": a.manifestJsonFullOut.String(), "manifest_json": a.manifestJsonOut.String(), "manifest": a.manifestPbOut.String(), "file_contexts": a.fileContexts.String(), "canned_fs_config": cannedFsConfig.String(), Loading Loading @@ -444,7 +449,6 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { "image_dir": android.PathForModuleOut(ctx, "image"+suffix).String(), "copy_commands": strings.Join(copyCommands, " && "), "manifest": a.manifestPbOut.String(), "manifest_json_full": a.manifestJsonFullOut.String(), }, }) } Loading Loading @@ -505,9 +509,8 @@ func (a *apexBundle) setCertificateAndPrivateKey(ctx android.ModuleContext) { func (a *apexBundle) buildFilesInfo(ctx android.ModuleContext) { if a.installable() { // For flattened APEX, do nothing but make sure that apex_manifest.json and apex_pubkey are also copied along // For flattened APEX, do nothing but make sure that APEX manifest and apex_pubkey are also copied along // with other ordinary files. a.filesInfo = append(a.filesInfo, newApexFile(a.manifestJsonOut, "apex_manifest.json."+a.Name()+a.suffix, ".", etc, nil)) a.filesInfo = append(a.filesInfo, newApexFile(a.manifestPbOut, "apex_manifest.pb."+a.Name()+a.suffix, ".", etc, nil)) // rename to apex_pubkey Loading Loading
apex/apex.go +6 −4 Original line number Diff line number Diff line Loading @@ -343,6 +343,10 @@ type apexBundleProperties struct { // Whenever apex_payload.img of the APEX should include dm-verity hashtree. // Should be only used in tests#. Test_only_no_hashtree *bool // Whether this APEX should support Android10. Default is false. If this is set true, then apex_manifest.json is bundled as well // because Android10 requires legacy apex_manifest.json instead of apex_manifest.pb Legacy_android10_support *bool } type apexTargetBundleProperties struct { Loading Loading @@ -507,9 +511,7 @@ type apexBundle struct { artApex bool primaryApexType bool // intermediate path for apex_manifest.json manifestJsonOut android.WritablePath manifestJsonFullOut android.WritablePath manifestPbOut android.WritablePath // list of commands to create symlinks for backward compatibility Loading
apex/apex_test.go +26 −5 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel() }) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("link", cc.LinkageMutator).Parallel() ctx.BottomUp("vndk", cc.VndkMutator).Parallel() ctx.BottomUp("link", cc.LinkageMutator).Parallel() ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel() ctx.BottomUp("version", cc.VersionMutator).Parallel() ctx.BottomUp("begin", cc.BeginMutator).Parallel() Loading Loading @@ -547,9 +547,10 @@ func TestApexManifest(t *testing.T) { `) module := ctx.ModuleForTests("myapex", "android_common_myapex_image") module.Output("apex_manifest.pb") module.Output("apex_manifest.json") module.Output("apex_manifest_full.json") args := module.Rule("apexRule").Args if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() { t.Error("manifest should be apex_manifest.pb, but " + manifest) } } func TestBasicZipApex(t *testing.T) { Loading Loading @@ -2452,7 +2453,7 @@ func TestApexWithTests(t *testing.T) { ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.json.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n") ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n") } Loading Loading @@ -3034,6 +3035,26 @@ func TestOverrideApex(t *testing.T) { ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex") } func TestLegacyAndroid10Support(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", legacy_android10_support: true, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex_image") args := module.Rule("apexRule").Args ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String()) } func TestMain(m *testing.M) { run := func() int { setUp() Loading
apex/builder.go +39 −36 Original line number Diff line number Diff line Loading @@ -103,7 +103,6 @@ var ( `(. ${out}.copy_commands) && ` + `APEXER_TOOL_PATH=${tool_path} ` + `${apexer} --force --manifest ${manifest} ` + `--manifest_json ${manifest_json} --manifest_json_full ${manifest_json_full} ` + `--file_contexts ${file_contexts} ` + `--canned_fs_config ${canned_fs_config} ` + `--payload_type image ` + Loading @@ -114,22 +113,20 @@ var ( Rspfile: "${out}.copy_commands", RspfileContent: "${copy_commands}", Description: "APEX ${image_dir} => ${out}", }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest", "manifest_json", "manifest_json_full", ) }, "tool_path", "image_dir", "copy_commands", "file_contexts", "canned_fs_config", "key", "opt_flags", "manifest") zipApexRule = pctx.StaticRule("zipApexRule", blueprint.RuleParams{ Command: `rm -rf ${image_dir} && mkdir -p ${image_dir} && ` + `(. ${out}.copy_commands) && ` + `APEXER_TOOL_PATH=${tool_path} ` + `${apexer} --force --manifest ${manifest} --manifest_json_full ${manifest_json_full} ` + `${apexer} --force --manifest ${manifest} ` + `--payload_type zip ` + `${image_dir} ${out} `, CommandDeps: []string{"${apexer}", "${merge_zips}", "${soong_zip}", "${zipalign}", "${aapt2}"}, Rspfile: "${out}.copy_commands", RspfileContent: "${copy_commands}", Description: "ZipAPEX ${image_dir} => ${out}", }, "tool_path", "image_dir", "copy_commands", "manifest", "manifest_json_full") }, "tool_path", "image_dir", "copy_commands", "manifest") apexProtoConvertRule = pctx.AndroidStaticRule("apexProtoConvertRule", blueprint.RuleParams{ Loading Loading @@ -171,7 +168,7 @@ var ( func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, requireNativeLibs []string) { manifestSrc := android.PathForModuleSrc(ctx, proptools.StringDefault(a.properties.Manifest, "apex_manifest.json")) a.manifestJsonFullOut = android.PathForModuleOut(ctx, "apex_manifest_full.json") manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json") // put dependency({provide|require}NativeLibs) in apex_manifest.json provideNativeLibs = android.SortedUniqueStrings(provideNativeLibs) Loading @@ -186,7 +183,7 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, ctx.Build(pctx, android.BuildParams{ Rule: apexManifestRule, Input: manifestSrc, Output: a.manifestJsonFullOut, Output: manifestJsonFullOut, Args: map[string]string{ "provideNativeLibs": strings.Join(provideNativeLibs, " "), "requireNativeLibs": strings.Join(requireNativeLibs, " "), Loading @@ -194,20 +191,22 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, }, }) if proptools.Bool(a.properties.Legacy_android10_support) { // b/143654022 Q apexd can't understand newly added keys in apex_manifest.json // prepare stripped-down version so that APEX modules built from R+ can be installed to Q a.manifestJsonOut = android.PathForModuleOut(ctx, "apex_manifest.json") ctx.Build(pctx, android.BuildParams{ Rule: stripApexManifestRule, Input: a.manifestJsonFullOut, Input: manifestJsonFullOut, Output: a.manifestJsonOut, }) } // from R+, protobuf binary format (.pb) is the standard format for apex_manifest a.manifestPbOut = android.PathForModuleOut(ctx, "apex_manifest.pb") ctx.Build(pctx, android.BuildParams{ Rule: pbApexManifestRule, Input: a.manifestJsonFullOut, Input: manifestJsonFullOut, Output: a.manifestPbOut, }) } Loading Loading @@ -256,7 +255,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { copyCommands := []string{} emitCommands := []string{} imageContentFile := android.PathForModuleOut(ctx, a.Name()+"-content.txt") emitCommands = append(emitCommands, "echo ./apex_manifest.pb >> "+imageContentFile.String()) if proptools.Bool(a.properties.Legacy_android10_support) { emitCommands = append(emitCommands, "echo ./apex_manifest.json >> "+imageContentFile.String()) } for i, src := range filesToCopy { dest := filepath.Join(a.filesInfo[i].installDir, src.Base()) emitCommands = append(emitCommands, "echo './"+dest+"' >> "+imageContentFile.String()) Loading @@ -271,7 +273,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { emitCommands = append(emitCommands, "sort -o "+imageContentFile.String()+" "+imageContentFile.String()) implicitInputs := append(android.Paths(nil), filesToCopy...) implicitInputs = append(implicitInputs, a.manifestPbOut, a.manifestJsonFullOut, a.manifestJsonOut) implicitInputs = append(implicitInputs, a.manifestPbOut) if a.properties.Whitelisted_files != nil { ctx.Build(pctx, android.BuildParams{ Loading Loading @@ -394,6 +396,11 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { optFlags = append(optFlags, "--do_not_check_keyname") } if proptools.Bool(a.properties.Legacy_android10_support) { implicitInputs = append(implicitInputs, a.manifestJsonOut) optFlags = append(optFlags, "--manifest_json "+a.manifestJsonOut.String()) } ctx.Build(pctx, android.BuildParams{ Rule: apexRule, Implicits: implicitInputs, Loading @@ -403,8 +410,6 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { "tool_path": outHostBinDir + ":" + prebuiltSdkToolsBinDir, "image_dir": android.PathForModuleOut(ctx, "image"+suffix).String(), "copy_commands": strings.Join(copyCommands, " && "), "manifest_json_full": a.manifestJsonFullOut.String(), "manifest_json": a.manifestJsonOut.String(), "manifest": a.manifestPbOut.String(), "file_contexts": a.fileContexts.String(), "canned_fs_config": cannedFsConfig.String(), Loading Loading @@ -444,7 +449,6 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { "image_dir": android.PathForModuleOut(ctx, "image"+suffix).String(), "copy_commands": strings.Join(copyCommands, " && "), "manifest": a.manifestPbOut.String(), "manifest_json_full": a.manifestJsonFullOut.String(), }, }) } Loading Loading @@ -505,9 +509,8 @@ func (a *apexBundle) setCertificateAndPrivateKey(ctx android.ModuleContext) { func (a *apexBundle) buildFilesInfo(ctx android.ModuleContext) { if a.installable() { // For flattened APEX, do nothing but make sure that apex_manifest.json and apex_pubkey are also copied along // For flattened APEX, do nothing but make sure that APEX manifest and apex_pubkey are also copied along // with other ordinary files. a.filesInfo = append(a.filesInfo, newApexFile(a.manifestJsonOut, "apex_manifest.json."+a.Name()+a.suffix, ".", etc, nil)) a.filesInfo = append(a.filesInfo, newApexFile(a.manifestPbOut, "apex_manifest.pb."+a.Name()+a.suffix, ".", etc, nil)) // rename to apex_pubkey Loading