Loading apex/androidmk.go +5 −5 Original line number Diff line number Diff line Loading @@ -82,9 +82,9 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo var moduleName string if linkToSystemLib { moduleName = fi.moduleName moduleName = fi.androidMkModuleName } else { moduleName = fi.moduleName + "." + apexBundleName + a.suffix moduleName = fi.androidMkModuleName + "." + apexBundleName + a.suffix } if !android.InList(moduleName, moduleNames) { Loading Loading @@ -250,9 +250,9 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo } // m <module_name> will build <module_name>.<apex_name> as well. if fi.moduleName != moduleName && a.primaryApexType { fmt.Fprintln(w, ".PHONY: "+fi.moduleName) fmt.Fprintln(w, fi.moduleName+": "+moduleName) if fi.androidMkModuleName != moduleName && a.primaryApexType { fmt.Fprintf(w, ".PHONY: %s\n", fi.androidMkModuleName) fmt.Fprintf(w, "%s: %s\n", fi.androidMkModuleName, moduleName) } } return moduleNames Loading apex/apex.go +38 −33 Original line number Diff line number Diff line Loading @@ -1136,7 +1136,9 @@ func (class apexFileClass) NameInMake() string { type apexFile struct { builtFile android.Path stem string moduleName string // Module name of `module` in AndroidMk. Note the generated AndroidMk module for // apexFile is named something like <AndroidMk module name>.<apex name>[<apex suffix>] androidMkModuleName string installDir string class apexFileClass module android.Module Loading @@ -1158,10 +1160,10 @@ type apexFile struct { isJniLib bool } func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, moduleName string, installDir string, class apexFileClass, module android.Module) apexFile { func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidMkModuleName string, installDir string, class apexFileClass, module android.Module) apexFile { ret := apexFile{ builtFile: builtFile, moduleName: moduleName, androidMkModuleName: androidMkModuleName, installDir: installDir, class: class, module: module, Loading Loading @@ -1621,7 +1623,8 @@ func apexFileForNativeLibrary(ctx android.BaseModuleContext, ccMod *cc.Module, h } fileToCopy := ccMod.OutputFile().Path() return newApexFile(ctx, fileToCopy, ccMod.Name(), dirInApex, nativeSharedLib, ccMod) androidMkModuleName := ccMod.BaseModuleName() + ccMod.Properties.SubName return newApexFile(ctx, fileToCopy, androidMkModuleName, dirInApex, nativeSharedLib, ccMod) } func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFile { Loading @@ -1631,7 +1634,8 @@ func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFil } dirInApex = filepath.Join(dirInApex, cc.RelativeInstallPath()) fileToCopy := cc.OutputFile().Path() af := newApexFile(ctx, fileToCopy, cc.Name(), dirInApex, nativeExecutable, cc) androidMkModuleName := cc.BaseModuleName() + cc.Properties.SubName af := newApexFile(ctx, fileToCopy, androidMkModuleName, dirInApex, nativeExecutable, cc) af.symlinks = cc.Symlinks() af.dataPaths = cc.DataPaths() return af Loading @@ -1640,7 +1644,7 @@ func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFil func apexFileForPyBinary(ctx android.BaseModuleContext, py *python.Module) apexFile { dirInApex := "bin" fileToCopy := py.HostToolPath().Path() return newApexFile(ctx, fileToCopy, py.Name(), dirInApex, pyBinary, py) return newApexFile(ctx, fileToCopy, py.BaseModuleName(), dirInApex, pyBinary, py) } func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb bootstrap.GoBinaryTool) apexFile { dirInApex := "bin" Loading @@ -1659,12 +1663,14 @@ func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb boots func apexFileForShBinary(ctx android.BaseModuleContext, sh *sh.ShBinary) apexFile { dirInApex := filepath.Join("bin", sh.SubDir()) fileToCopy := sh.OutputFile() af := newApexFile(ctx, fileToCopy, sh.Name(), dirInApex, shBinary, sh) af := newApexFile(ctx, fileToCopy, sh.BaseModuleName(), dirInApex, shBinary, sh) af.symlinks = sh.Symlinks() return af } type javaDependency interface { type javaModule interface { android.Module BaseModuleName() string DexJarBuildPath() android.Path JacocoReportClassesFile() android.Path LintDepSets() java.LintDepSets Loading @@ -1672,20 +1678,18 @@ type javaDependency interface { Stem() string } var _ javaDependency = (*java.Library)(nil) var _ javaDependency = (*java.SdkLibrary)(nil) var _ javaDependency = (*java.DexImport)(nil) var _ javaDependency = (*java.SdkLibraryImport)(nil) var _ javaModule = (*java.Library)(nil) var _ javaModule = (*java.SdkLibrary)(nil) var _ javaModule = (*java.DexImport)(nil) var _ javaModule = (*java.SdkLibraryImport)(nil) func apexFileForJavaLibrary(ctx android.BaseModuleContext, lib javaDependency, module android.Module) apexFile { func apexFileForJavaLibrary(ctx android.BaseModuleContext, module javaModule) apexFile { dirInApex := "javalib" fileToCopy := lib.DexJarBuildPath() // Remove prebuilt_ if necessary so the source and prebuilt modules have the same name. name := strings.TrimPrefix(module.Name(), "prebuilt_") af := newApexFile(ctx, fileToCopy, name, dirInApex, javaSharedLib, module) af.jacocoReportClassesFile = lib.JacocoReportClassesFile() af.lintDepSets = lib.LintDepSets() af.stem = lib.Stem() + ".jar" fileToCopy := module.DexJarBuildPath() af := newApexFile(ctx, fileToCopy, module.BaseModuleName(), dirInApex, javaSharedLib, module) af.jacocoReportClassesFile = module.JacocoReportClassesFile() af.lintDepSets = module.LintDepSets() af.stem = module.Stem() + ".jar" return af } Loading @@ -1708,6 +1712,7 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { OutputFile() android.Path JacocoReportClassesFile() android.Path Certificate() java.Certificate BaseModuleName() string }) apexFile { appDir := "app" if aapp.Privileged() { Loading @@ -1715,7 +1720,7 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { } dirInApex := filepath.Join(appDir, aapp.InstallApkName()) fileToCopy := aapp.OutputFile() af := newApexFile(ctx, fileToCopy, aapp.Name(), dirInApex, app, aapp) af := newApexFile(ctx, fileToCopy, aapp.BaseModuleName(), dirInApex, app, aapp) af.jacocoReportClassesFile = aapp.JacocoReportClassesFile() af.certificate = aapp.Certificate() Loading Loading @@ -2040,7 +2045,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { case javaLibTag: switch child.(type) { case *java.Library, *java.SdkLibrary, *java.DexImport, *java.SdkLibraryImport: af := apexFileForJavaLibrary(ctx, child.(javaDependency), child.(android.Module)) af := apexFileForJavaLibrary(ctx, child.(javaModule)) if !af.Ok() { ctx.PropertyErrorf("java_libs", "%q is not configured to be compiled into dex", depName) return false Loading @@ -2063,7 +2068,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { if ap.Privileged() { appDir = "priv-app" } af := newApexFile(ctx, ap.OutputFile(), ap.Name(), af := newApexFile(ctx, ap.OutputFile(), ap.BaseModuleName(), filepath.Join(appDir, ap.BaseModuleName()), appSet, ap) af.certificate = java.PresignedCertificate filesInfo = append(filesInfo, af) Loading Loading @@ -2173,7 +2178,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // use the name of the generated test binary (`fileToCopy`) instead of the name // of the original test module (`depName`, shared by all `test_per_src` // variations of that module). af.moduleName = filepath.Base(af.builtFile.String()) af.androidMkModuleName = filepath.Base(af.builtFile.String()) // these are not considered transitive dep af.transitiveDep = false filesInfo = append(filesInfo, af) Loading apex/apex_test.go +51 −0 Original line number Diff line number Diff line Loading @@ -5179,6 +5179,57 @@ func TestSymlinksFromApexToSystem(t *testing.T) { ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file } func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) { ctx, config := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library_shared { name: "mylib", srcs: ["mylib.cpp"], shared_libs: ["myotherlib"], system_shared_libs: [], stl: "none", apex_available: [ "myapex", "//apex_available:platform", ], } cc_prebuilt_library_shared { name: "myotherlib", srcs: ["prebuilt.so"], system_shared_libs: [], stl: "none", apex_available: [ "myapex", "//apex_available:platform", ], } `) apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, config, "", apexBundle) var builder strings.Builder data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) androidMk := builder.String() // `myotherlib` is added to `myapex` as symlink ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n") ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n") ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n") // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib` ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n") } func TestApexWithJniLibs(t *testing.T) { ctx, _ := testApex(t, ` apex { Loading Loading
apex/androidmk.go +5 −5 Original line number Diff line number Diff line Loading @@ -82,9 +82,9 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo var moduleName string if linkToSystemLib { moduleName = fi.moduleName moduleName = fi.androidMkModuleName } else { moduleName = fi.moduleName + "." + apexBundleName + a.suffix moduleName = fi.androidMkModuleName + "." + apexBundleName + a.suffix } if !android.InList(moduleName, moduleNames) { Loading Loading @@ -250,9 +250,9 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo } // m <module_name> will build <module_name>.<apex_name> as well. if fi.moduleName != moduleName && a.primaryApexType { fmt.Fprintln(w, ".PHONY: "+fi.moduleName) fmt.Fprintln(w, fi.moduleName+": "+moduleName) if fi.androidMkModuleName != moduleName && a.primaryApexType { fmt.Fprintf(w, ".PHONY: %s\n", fi.androidMkModuleName) fmt.Fprintf(w, "%s: %s\n", fi.androidMkModuleName, moduleName) } } return moduleNames Loading
apex/apex.go +38 −33 Original line number Diff line number Diff line Loading @@ -1136,7 +1136,9 @@ func (class apexFileClass) NameInMake() string { type apexFile struct { builtFile android.Path stem string moduleName string // Module name of `module` in AndroidMk. Note the generated AndroidMk module for // apexFile is named something like <AndroidMk module name>.<apex name>[<apex suffix>] androidMkModuleName string installDir string class apexFileClass module android.Module Loading @@ -1158,10 +1160,10 @@ type apexFile struct { isJniLib bool } func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, moduleName string, installDir string, class apexFileClass, module android.Module) apexFile { func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidMkModuleName string, installDir string, class apexFileClass, module android.Module) apexFile { ret := apexFile{ builtFile: builtFile, moduleName: moduleName, androidMkModuleName: androidMkModuleName, installDir: installDir, class: class, module: module, Loading Loading @@ -1621,7 +1623,8 @@ func apexFileForNativeLibrary(ctx android.BaseModuleContext, ccMod *cc.Module, h } fileToCopy := ccMod.OutputFile().Path() return newApexFile(ctx, fileToCopy, ccMod.Name(), dirInApex, nativeSharedLib, ccMod) androidMkModuleName := ccMod.BaseModuleName() + ccMod.Properties.SubName return newApexFile(ctx, fileToCopy, androidMkModuleName, dirInApex, nativeSharedLib, ccMod) } func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFile { Loading @@ -1631,7 +1634,8 @@ func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFil } dirInApex = filepath.Join(dirInApex, cc.RelativeInstallPath()) fileToCopy := cc.OutputFile().Path() af := newApexFile(ctx, fileToCopy, cc.Name(), dirInApex, nativeExecutable, cc) androidMkModuleName := cc.BaseModuleName() + cc.Properties.SubName af := newApexFile(ctx, fileToCopy, androidMkModuleName, dirInApex, nativeExecutable, cc) af.symlinks = cc.Symlinks() af.dataPaths = cc.DataPaths() return af Loading @@ -1640,7 +1644,7 @@ func apexFileForExecutable(ctx android.BaseModuleContext, cc *cc.Module) apexFil func apexFileForPyBinary(ctx android.BaseModuleContext, py *python.Module) apexFile { dirInApex := "bin" fileToCopy := py.HostToolPath().Path() return newApexFile(ctx, fileToCopy, py.Name(), dirInApex, pyBinary, py) return newApexFile(ctx, fileToCopy, py.BaseModuleName(), dirInApex, pyBinary, py) } func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb bootstrap.GoBinaryTool) apexFile { dirInApex := "bin" Loading @@ -1659,12 +1663,14 @@ func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb boots func apexFileForShBinary(ctx android.BaseModuleContext, sh *sh.ShBinary) apexFile { dirInApex := filepath.Join("bin", sh.SubDir()) fileToCopy := sh.OutputFile() af := newApexFile(ctx, fileToCopy, sh.Name(), dirInApex, shBinary, sh) af := newApexFile(ctx, fileToCopy, sh.BaseModuleName(), dirInApex, shBinary, sh) af.symlinks = sh.Symlinks() return af } type javaDependency interface { type javaModule interface { android.Module BaseModuleName() string DexJarBuildPath() android.Path JacocoReportClassesFile() android.Path LintDepSets() java.LintDepSets Loading @@ -1672,20 +1678,18 @@ type javaDependency interface { Stem() string } var _ javaDependency = (*java.Library)(nil) var _ javaDependency = (*java.SdkLibrary)(nil) var _ javaDependency = (*java.DexImport)(nil) var _ javaDependency = (*java.SdkLibraryImport)(nil) var _ javaModule = (*java.Library)(nil) var _ javaModule = (*java.SdkLibrary)(nil) var _ javaModule = (*java.DexImport)(nil) var _ javaModule = (*java.SdkLibraryImport)(nil) func apexFileForJavaLibrary(ctx android.BaseModuleContext, lib javaDependency, module android.Module) apexFile { func apexFileForJavaLibrary(ctx android.BaseModuleContext, module javaModule) apexFile { dirInApex := "javalib" fileToCopy := lib.DexJarBuildPath() // Remove prebuilt_ if necessary so the source and prebuilt modules have the same name. name := strings.TrimPrefix(module.Name(), "prebuilt_") af := newApexFile(ctx, fileToCopy, name, dirInApex, javaSharedLib, module) af.jacocoReportClassesFile = lib.JacocoReportClassesFile() af.lintDepSets = lib.LintDepSets() af.stem = lib.Stem() + ".jar" fileToCopy := module.DexJarBuildPath() af := newApexFile(ctx, fileToCopy, module.BaseModuleName(), dirInApex, javaSharedLib, module) af.jacocoReportClassesFile = module.JacocoReportClassesFile() af.lintDepSets = module.LintDepSets() af.stem = module.Stem() + ".jar" return af } Loading @@ -1708,6 +1712,7 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { OutputFile() android.Path JacocoReportClassesFile() android.Path Certificate() java.Certificate BaseModuleName() string }) apexFile { appDir := "app" if aapp.Privileged() { Loading @@ -1715,7 +1720,7 @@ func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { } dirInApex := filepath.Join(appDir, aapp.InstallApkName()) fileToCopy := aapp.OutputFile() af := newApexFile(ctx, fileToCopy, aapp.Name(), dirInApex, app, aapp) af := newApexFile(ctx, fileToCopy, aapp.BaseModuleName(), dirInApex, app, aapp) af.jacocoReportClassesFile = aapp.JacocoReportClassesFile() af.certificate = aapp.Certificate() Loading Loading @@ -2040,7 +2045,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { case javaLibTag: switch child.(type) { case *java.Library, *java.SdkLibrary, *java.DexImport, *java.SdkLibraryImport: af := apexFileForJavaLibrary(ctx, child.(javaDependency), child.(android.Module)) af := apexFileForJavaLibrary(ctx, child.(javaModule)) if !af.Ok() { ctx.PropertyErrorf("java_libs", "%q is not configured to be compiled into dex", depName) return false Loading @@ -2063,7 +2068,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { if ap.Privileged() { appDir = "priv-app" } af := newApexFile(ctx, ap.OutputFile(), ap.Name(), af := newApexFile(ctx, ap.OutputFile(), ap.BaseModuleName(), filepath.Join(appDir, ap.BaseModuleName()), appSet, ap) af.certificate = java.PresignedCertificate filesInfo = append(filesInfo, af) Loading Loading @@ -2173,7 +2178,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // use the name of the generated test binary (`fileToCopy`) instead of the name // of the original test module (`depName`, shared by all `test_per_src` // variations of that module). af.moduleName = filepath.Base(af.builtFile.String()) af.androidMkModuleName = filepath.Base(af.builtFile.String()) // these are not considered transitive dep af.transitiveDep = false filesInfo = append(filesInfo, af) Loading
apex/apex_test.go +51 −0 Original line number Diff line number Diff line Loading @@ -5179,6 +5179,57 @@ func TestSymlinksFromApexToSystem(t *testing.T) { ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file } func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) { ctx, config := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library_shared { name: "mylib", srcs: ["mylib.cpp"], shared_libs: ["myotherlib"], system_shared_libs: [], stl: "none", apex_available: [ "myapex", "//apex_available:platform", ], } cc_prebuilt_library_shared { name: "myotherlib", srcs: ["prebuilt.so"], system_shared_libs: [], stl: "none", apex_available: [ "myapex", "//apex_available:platform", ], } `) apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, config, "", apexBundle) var builder strings.Builder data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) androidMk := builder.String() // `myotherlib` is added to `myapex` as symlink ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n") ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n") ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n") // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib` ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n") } func TestApexWithJniLibs(t *testing.T) { ctx, _ := testApex(t, ` apex { Loading