From 19972c793537fa7292613585519938cf84dd140f Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 28 Jan 2020 20:05:29 +0900 Subject: [PATCH] License info for APEXes are correctly gathered This change fixes a bug that license info for non-flattened APEXes are not captured in /system/etc/NOTICE.xml.gz file. For non-flatted APEXes, we have been creating NOTICE.html.gz file by concatenating all the license infos of the modules that contributes to the APEX and embedding the file into the asset directory of the APEX. Then at runtime, the info is shown through the "Google Play System Update Licenses" UI. However, this was problematic because the UI only shows license info for the Google-signed APEXes, leaving OEM-signed APEXes (a.k.a. optional modules). The problem is now fixed by associating a merged license file with each APEX and exporting them to Make, so that the merged license files are included in the partition level /system/etc/NOTICE.xml.gz file regardless of whether the APEX is a Google-signed one or not. This also fixes a bug that license info entries are created for the runtime paths /apex//, which is not necessary as they are already included in the license info of the containing APEX. Bug: N/A Test: Go to Settings->About Phone->Legal information and check that a) /system/apex/*.apex files are shown and b) /apex//* files are not shown Change-Id: I2c25c803b6a4c39b24bb3f724502699382fab50c --- apex/androidmk.go | 10 ++++++++++ apex/apex.go | 3 +++ apex/builder.go | 14 +++++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/apex/androidmk.go b/apex/androidmk.go index 5fa5bf062..be9383511 100644 --- a/apex/androidmk.go +++ b/apex/androidmk.go @@ -112,6 +112,11 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexName, moduleDir string) } } else { fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", pathWhenActivated) + + // For non-flattend APEXes, the merged notice file is attached to the APEX itself. + // We don't need to have notice file for the individual modules in it. Otherwise, + // we will have duplicated notice entries. + fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true") } fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String()) fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.NameInMake()) @@ -271,6 +276,11 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { if len(postInstallCommands) > 0 { fmt.Fprintln(w, "LOCAL_POST_INSTALL_CMD :=", strings.Join(postInstallCommands, " && ")) } + + if a.mergedNotices.Merged.Valid() { + fmt.Fprintln(w, "LOCAL_NOTICE_FILE :=", a.mergedNotices.Merged.Path().String()) + } + fmt.Fprintln(w, "include $(BUILD_PREBUILT)") if apexType == imageApex { diff --git a/apex/apex.go b/apex/apex.go index f925066d4..ae9379093 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -818,6 +818,9 @@ type apexBundle struct { // Whether to create symlink to the system file instead of having a file // inside the apex or not linkToSystemLib bool + + // Struct holding the merged notice file paths in different formats + mergedNotices android.NoticeOutputs } func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, diff --git a/apex/builder.go b/apex/builder.go index 8ae2b5c4f..17edf7c32 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -211,7 +211,7 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, }) } -func (a *apexBundle) buildNoticeFile(ctx android.ModuleContext, apexFileName string) android.OptionalPath { +func (a *apexBundle) buildNoticeFiles(ctx android.ModuleContext, apexFileName string) android.NoticeOutputs { noticeFiles := []android.Path{} for _, f := range a.filesInfo { if f.module != nil { @@ -227,10 +227,10 @@ func (a *apexBundle) buildNoticeFile(ctx android.ModuleContext, apexFileName str } if len(noticeFiles) == 0 { - return android.OptionalPath{} + return android.NoticeOutputs{} } - return android.BuildNoticeOutput(ctx, a.installDir, apexFileName, android.FirstUniquePaths(noticeFiles)).HtmlGzOutput + return android.BuildNoticeOutput(ctx, a.installDir, apexFileName, android.FirstUniquePaths(noticeFiles)) } func (a *apexBundle) buildInstalledFilesFile(ctx android.ModuleContext, builtApex android.Path, imageDir android.Path) android.OutputPath { @@ -394,11 +394,11 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { optFlags = append(optFlags, "--target_sdk_version "+targetSdkVersion) optFlags = append(optFlags, "--min_sdk_version "+minSdkVersion) - noticeFile := a.buildNoticeFile(ctx, a.Name()+suffix) - if noticeFile.Valid() { + a.mergedNotices = a.buildNoticeFiles(ctx, a.Name()+suffix) + if a.mergedNotices.HtmlGzOutput.Valid() { // If there's a NOTICE file, embed it as an asset file in the APEX. - implicitInputs = append(implicitInputs, noticeFile.Path()) - optFlags = append(optFlags, "--assets_dir "+filepath.Dir(noticeFile.String())) + implicitInputs = append(implicitInputs, a.mergedNotices.HtmlGzOutput.Path()) + optFlags = append(optFlags, "--assets_dir "+filepath.Dir(a.mergedNotices.HtmlGzOutput.String())) } if ctx.ModuleDir() != "system/apex/apexd/apexd_testdata" && ctx.ModuleDir() != "system/apex/shim/build" && a.testOnlyShouldSkipHashtreeGeneration() {