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

Commit 87ff51db authored by sophiez's avatar sophiez
Browse files

Automated NDK API coverage used by Mainline modules build integration.

Add gen_ndk_usedby_apex.sh script to generate NDK API list used by Mainlain modules when modules get build.

Test: TARGET_BUILD_APPS=com.android.adbd m dist apps_only

Change-Id: Ib1b2f0dd2f9ae85b1545c6cc5bb4c5bbdfac1c15
parent 55e8815f
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -422,12 +422,21 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData {
					fmt.Fprintf(w, dist)
				}

				if a.coverageOutputPath.String() != "" {
				if a.apisUsedByModuleFile.String() != "" {
					goal := "apps_only"
					distFile := a.coverageOutputPath.String()
					distFile := a.apisUsedByModuleFile.String()
					fmt.Fprintf(w, "ifneq (,$(filter $(my_register_name),$(TARGET_BUILD_APPS)))\n"+
						" $(call dist-for-goals,%s,%s:ndk_apis_usedby_apex/$(notdir %s))\n"+
						"endif",
						"endif\n",
						goal, distFile, distFile)
				}

				if a.apisBackedByModuleFile.String() != "" {
					goal := "apps_only"
					distFile := a.apisBackedByModuleFile.String()
					fmt.Fprintf(w, "ifneq (,$(filter $(my_register_name),$(TARGET_BUILD_APPS)))\n"+
						" $(call dist-for-goals,%s,%s:ndk_apis_backedby_apex/$(notdir %s))\n"+
						"endif\n",
						goal, distFile, distFile)
				}
			}
+2 −1
Original line number Diff line number Diff line
@@ -355,7 +355,8 @@ type apexBundle struct {
	prebuiltFileToDelete string

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

// apexFileClass represents a type of file that can be included in APEX.
+14 −2
Original line number Diff line number Diff line
@@ -686,7 +686,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
		implicitInputs = append(implicitInputs, unsignedOutputFile)

		// Run coverage analysis
		apisUsedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+".txt")
		apisUsedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_using.txt")
		ctx.Build(pctx, android.BuildParams{
			Rule:        generateAPIsUsedbyApexRule,
			Implicits:   implicitInputs,
@@ -697,7 +697,19 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) {
				"readelf":   "${config.ClangBin}/llvm-readelf",
			},
		})
		a.coverageOutputPath = apisUsedbyOutputFile
		a.apisUsedByModuleFile = apisUsedbyOutputFile

		apisBackedbyOutputFile := android.PathForModuleOut(ctx, a.Name()+"_backing.txt")
		ndkLibraryList := android.PathForSource(ctx, "system/core/rootdir/etc/public.libraries.android.txt")
		rule := android.NewRuleBuilder(pctx, ctx)
		rule.Command().
			Tool(android.PathForSource(ctx, "build/soong/scripts/gen_ndk_backedby_apex.sh")).
			Text(imageDir.String()).
			Implicits(implicitInputs).
			Output(apisBackedbyOutputFile).
			Input(ndkLibraryList)
		rule.Build("ndk_backedby_list", "Generate API libraries backed by Apex")
		a.apisBackedByModuleFile = apisBackedbyOutputFile

		bundleConfig := a.buildBundleConfig(ctx)

+55 −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 backed-by NDK symbols."
    echo ""
    echo "To run this script use: ./ndk_backedby_module.sh \$BINARY_IMAGE_DIRECTORY \$OUTPUT_FILE_PATH \$NDK_LIB_NAME_LIST"
    echo "For example: If all the module image files that you would like to run is under directory '/myModule' and output write to /backedby.txt then the command would be:"
    echo "./ndk_usedby_module.sh /myModule /backedby.txt /ndkLibList.txt"
    echo "If the module1 is backing lib1 then the backedby.txt would contains: "
    echo "lib1"
}

genBackedByList() {
  dir="$1"
  [[ ! -e "$2" ]] && echo "" >> "$2"
  while IFS= read -r line
  do
    soFileName=$(echo "$line" | sed 's/\(.*so\).*/\1/')
    if [[ ! -z "$soFileName" && "$soFileName" != *"#"* ]]
    then
      find "$dir" -type f -name "$soFileName" -exec echo "$soFileName" >> "$2" \;
    fi
  done < "$3"
}

if [[ "$1" == "help" ]]
then
  printHelp
elif [[ "$#" -ne 3 ]]
then
  echo "Wrong argument length. Expecting 3 argument representing image file directory, output path, path to ndk library list."
else
  [[ -e "$2" ]] && rm "$2"
  genBackedByList "$1" "$2" "$3"
fi