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

Commit 8baa8b50 authored by Sophie Zheng's avatar Sophie Zheng Committed by Gerrit Code Review
Browse files

Merge "Automated NDK API coverage used by Mainline modules build integration."

parents 4396c01a c80a2b39
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -353,6 +353,9 @@ type apexBundle struct {
	lintReports android.Paths

	prebuiltFileToDelete string

	// Path of API coverage generate file
	coverageOutputPath android.ModuleOutPath
}

// apexFileClass represents a type of file that can be included in APEX.
+24 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ var (

func init() {
	pctx.Import("android/soong/android")
	pctx.Import("android/soong/cc/config")
	pctx.Import("android/soong/java")
	pctx.HostBinToolVariable("apexer", "apexer")
	// ART minimal builds (using the master-art manifest) do not have the "frameworks/base"
@@ -65,6 +66,7 @@ func init() {
	pctx.HostBinToolVariable("extract_apks", "extract_apks")
	pctx.HostBinToolVariable("make_f2fs", "make_f2fs")
	pctx.HostBinToolVariable("sload_f2fs", "sload_f2fs")
	pctx.SourcePathVariable("genNdkUsedbyApexPath", "build/soong/scripts/gen_ndk_usedby_apex.sh")
}

var (
@@ -176,6 +178,12 @@ var (
		Description: "Diff ${image_content_file} and ${allowed_files_file}",
	}, "image_content_file", "allowed_files_file", "apex_module_name")

	generateAPIsUsedbyApexRule = pctx.StaticRule("generateAPIsUsedbyApexRule", blueprint.RuleParams{
		Command:     "$genNdkUsedbyApexPath ${image_dir} ${readelf} ${out}",
		CommandDeps: []string{"${genNdkUsedbyApexPath}"},
		Description: "Generate symbol list used by Apex",
	}, "image_dir", "readelf")

	// Don't add more rules here. Consider using android.NewRuleBuilder instead.
)

@@ -675,6 +683,22 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
			Description: "apex proto convert",
		})

		implicitInputs = append(implicitInputs, unsignedOutputFile)

		// Run coverage analysis
		apisUsedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+".txt")
		ctx.Build(pctx, android.BuildParams{
			Rule:        generateAPIsUsedbyApexRule,
			Implicits:   implicitInputs,
			Description: "coverage",
			Output:      apisUsedbyOutputFile,
			Args: map[string]string{
				"image_dir": imageDir.String(),
				"readelf":   "${config.ClangBin}/llvm-readelf",
			},
		})
		a.coverageOutputPath = apisUsedbyOutputFile

		bundleConfig := a.buildBundleConfig(ctx)

		var abis []string
+72 −0
Original line number Diff line number Diff line
#!/bin/bash -e

# Copyright 2020 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Generates NDK API txt file used by Mainline modules. NDK APIs would have value
# "UND" in Ndx column and have suffix "@LIB_NAME" in Name column.
# For example, current line llvm-readelf output is:
# 1: 00000000     0     FUNC      GLOBAL  DEFAULT   UND   dlopen@LIBC
# After the parse function below "dlopen" would be write to the output file.
printHelp() {
    echo "**************************** Usage Instructions ****************************"
    echo "This script is used to generate the Mainline modules used-by NDK symbols."
    echo ""
    echo "To run this script use: ./ndk_usedby_module.sh \$BINARY_IMAGE_DIRECTORY \$BINARY_LLVM_PATH \$OUTPUT_FILE_PATH"
    echo "For example: If all the module image files that you would like to run is under directory '/myModule' and output write to /myModule.txt then the command would be:"
    echo "./ndk_usedby_module.sh /myModule \$BINARY_LLVM_PATH /myModule.txt"
}

parseReadelfOutput() {
  while IFS= read -r line
  do
      if [[ $line = *FUNC*GLOBAL*UND*@* ]] ;
      then
          echo "$line" | sed -r 's/.*UND (.*)@.*/\1/g' >> "$2"
      fi
  done < "$1"
  echo "" >> "$2"
}

unzipJarAndApk() {
  tmpUnzippedDir="$1"/tmpUnzipped
  [[ -e "$tmpUnzippedDir" ]] && rm -rf "$tmpUnzippedDir"
  mkdir -p "$tmpUnzippedDir"
  find "$1" -name "*.jar" -exec unzip -o {} -d "$tmpUnzippedDir" \;
  find "$1" -name "*.apk" -exec unzip -o {} -d "$tmpUnzippedDir" \;
  find "$tmpUnzippedDir" -name "*.MF" -exec rm {} \;
}

lookForExecFile() {
  dir="$1"
  readelf="$2"
  find "$dir" -type f -name "*.so"  -exec "$2" --dyn-symbols {} >> "$dir"/../tmpReadelf.txt \;
  find "$dir" -type f -perm /111 ! -name "*.so"  -exec "$2" --dyn-symbols {} >> "$dir"/../tmpReadelf.txt \;
}

if [[ "$1" == "help" ]]
then
  printHelp
elif [[ "$#" -ne 3 ]]
then
  echo "Wrong argument length. Expecting 3 argument representing image file directory, llvm-readelf tool path, output path."
else
  unzipJarAndApk "$1"
  lookForExecFile "$1" "$2"
  tmpReadelfOutput="$1/../tmpReadelf.txt"
  [[ -e "$3" ]] && rm "$3"
  parseReadelfOutput "$tmpReadelfOutput" "$3"
  [[ -e "$tmpReadelfOutput" ]] && rm "$tmpReadelfOutput"
  rm -rf "$1/tmpUnzipped"
fi
 No newline at end of file