Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d2449ef authored by Ulyana Trafimovich's avatar Ulyana Trafimovich Committed by Gerrit Code Review
Browse files

Merge "Share vdex files in the ART apex between architectures (via symlinks)."

parents b44b33a6 5b88fe36
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -2311,7 +2311,10 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	// Build rules are generated by the dexpreopt singleton, and here we access build artifacts
	// via the global boot image config.
	if a.artApex {
		for arch, files := range java.DexpreoptedArtApexJars(ctx) {
		artAndOatFiles, vdexFiles := java.DexpreoptedArtApexJars(ctx)

		// Copy *.art and *.oat files to arch-specific subdirectories.
		for arch, files := range artAndOatFiles {
			dirInApex := filepath.Join("javalib", arch.String())
			for _, f := range files {
				localModule := "javalib_" + arch.String() + "_" + filepath.Base(f.String())
@@ -2319,6 +2322,18 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
				filesInfo = append(filesInfo, af)
			}
		}

		// Copy *.vdex files to a common subdirectory.
		for _, file := range vdexFiles {
			dirInApex := "javalib"
			localModule := "javalib_" + filepath.Base(file.String())
			af := newApexFile(ctx, file, localModule, dirInApex, etc, nil)
			// Add a symlink to the *.vdex file for each arch-specific subdirectory.
			for arch := range artAndOatFiles {
				af.symlinks = append(af.symlinks, filepath.Join(arch.String(), filepath.Base(file.String())))
			}
			filesInfo = append(filesInfo, af)
		}
	}

	if a.private_key_file == nil {
+9 −1
Original line number Diff line number Diff line
@@ -333,6 +333,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
	for _, fi := range a.filesInfo {
		destPath := android.PathForModuleOut(ctx, "image"+suffix, fi.Path()).String()
		copyCommands = append(copyCommands, "mkdir -p "+filepath.Dir(destPath))

		if a.linkToSystemLib && fi.transitiveDep && fi.AvailableToPlatform() {
			// TODO(jiyong): pathOnDevice should come from fi.module, not being calculated here
			pathOnDevice := filepath.Join("/system", fi.Path())
@@ -341,10 +342,16 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
			copyCommands = append(copyCommands, "cp -f "+fi.builtFile.String()+" "+destPath)
			implicitInputs = append(implicitInputs, fi.builtFile)
		}

		// create additional symlinks pointing the file inside the APEX
		for _, symlinkPath := range fi.SymlinkPaths() {
			symlinkDest := android.PathForModuleOut(ctx, "image"+suffix, symlinkPath).String()
			copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest)
			symlinkTarget, err := filepath.Rel(filepath.Dir(symlinkDest), destPath)
			if err != nil {
				panic("Cannot compute relative path from " + destPath + " to " + filepath.Dir(symlinkDest))
			}
			copyCommands = append(copyCommands, "mkdir -p "+filepath.Dir(symlinkDest))
			copyCommands = append(copyCommands, "ln -sfn "+symlinkTarget+" "+symlinkDest)
		}
	}

@@ -407,6 +414,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
				}
			} else {
				readOnlyPaths = append(readOnlyPaths, pathInApex)
				readOnlyPaths = append(readOnlyPaths, f.SymlinkPaths()...)
			}
			dir := f.installDir
			for !android.InList(dir, executablePaths) && dir != "" {
+20 −8
Original line number Diff line number Diff line
@@ -186,19 +186,31 @@ type dexpreoptBootJars struct {
}

// Accessor function for the apex package. Returns nil if dexpreopt is disabled.
func DexpreoptedArtApexJars(ctx android.BuilderContext) map[android.ArchType]android.OutputPaths {
func DexpreoptedArtApexJars(ctx android.BuilderContext) (map[android.ArchType]android.OutputPaths, android.OutputPaths) {
	if skipDexpreoptBootJars(ctx) {
		return nil
		return nil, nil
	}
	// Include dexpreopt files for the primary boot image.
	files := map[android.ArchType]android.OutputPaths{}
	for _, variant := range artBootImageConfig(ctx).variants {

	image := artBootImageConfig(ctx)

	// Target-independent boot image files (*.vdex).
	anyTarget := image.variants[0].target
	vdexDir := image.dir.Join(ctx, anyTarget.Os.String(), image.installSubdir, anyTarget.Arch.ArchType.String())
	vdexFiles := image.moduleFiles(ctx, vdexDir, ".vdex")

	// Target-specific boot image files (*.oat, *.art).
	artAndOatFiles := map[android.ArchType]android.OutputPaths{}
	for _, variant := range image.variants {
		// We also generate boot images for host (for testing), but we don't need those in the apex.
		if variant.target.Os == android.Android {
			files[variant.target.Arch.ArchType] = variant.imagesDeps
		os := variant.target.Os
		if os == android.Android {
			arch := variant.target.Arch.ArchType
			archDir := image.dir.Join(ctx, os.String(), image.installSubdir, arch.String())
			artAndOatFiles[arch] = image.moduleFiles(ctx, archDir, ".art", ".oat")
		}
	}
	return files

	return artAndOatFiles, vdexFiles
}

// dexpreoptBoot singleton rules