blob: 43f5d6e07b65e4827de1ba4c4ec784c5cb9b6bf8 [file] [log] [blame]
#!/bin/bash
set -e
# This is a helper script to be called by androidx.sh
# This script locates, parses, and merges build profiling information from various report files
# A history of the results of running this script can be visualized at go/androidx-build-times
cd "$(dirname $0)"
if [ "$OUT_DIR" == "" ]; then
OUT_DIR=../../../../out
fi
if [ "$DIST_DIR" == "" ]; then
DIST_DIR="$OUT_DIR/dist"
fi
METRICS_DIR="$DIST_DIR/librarymetrics/build"
INTERMEDIATES_DIR=$OUT_DIR
# Find the metrics files that exist
METRICS_FILES="$(echo $OUT_DIR/androidx/*/build/build-metrics.json | grep -v '*' || true)"
# Look for a profile file and attempt to make a metrics json out of it
PROFILE_FILES="$OUT_DIR/androidx/build/reports/profile/*.html"
if ls $PROFILE_FILES >/dev/null 2>&1 ; then
# parse the profile file and generate a .json file summarizing it
PROFILE_JSON=$INTERMEDIATES_DIR/build_androidx.json
# Because we run Gradle twice (see TaskUpToDateValidator.kt), we want the second-to-last profile
./parse_profile_html.py --input-profile "$(ls $PROFILE_FILES | sort | tail -n 2 | head -n 1)" --output-summary $PROFILE_JSON
METRICS_FILES="$METRICS_FILES $PROFILE_JSON"
fi
# Identify which log file we want to parse
# Because we run Gradle twice (see TaskUpToDateValidator.kt), we want the second-to-last log
LOG_FILE="$DIST_DIR/logs/gradle.1.log"
# extract cache status from log file
if [ -e "$LOG_FILE" ]; then
summaryLine="$(grep ' actionable task' "$LOG_FILE")"
if [ "$summaryLine" != "" ]; then
# sample line to parse: 621 actionable tasks: 149 executed, 472 from cache
# we want to extract: ^^^ ^^^
numTasksExecuted="$(echo "$summaryLine" | sed 's/ executed.*//' | sed 's/.*, //' | sed 's/.*: //')"
if [ "$numTasksExecuted" == "" ]; then
numTasksExecuted="0"
fi
numTasksFromCache="$(echo "$summaryLine" | sed 's/ from cache//' | sed 's/.*, //' | sed 's/.*: //')"
if [ "$numTasksFromCache" == "" ]; then
numTasksFromCache="0"
fi
numTasksActionable="$(echo "$summaryLine" | sed 's/ actionable task.*//' | sed 's/.*, //' | sed 's/.*: //')"
if [ "$numTasksActionable" == "" ]; then
numTasksActionable="0"
fi
CACHE_STATS_FILE="$OUT_DIR/androidx/build/cache-stats.json"
echo -n "{ \"num_tasks_executed\": $numTasksExecuted, \"num_tasks_from_cache\": $numTasksFromCache , \"num_tasks_actionable\": $numTasksActionable }" > "$CACHE_STATS_FILE"
METRICS_FILES="$METRICS_FILES $CACHE_STATS_FILE"
fi
fi
if [ "$METRICS_FILES" != "" ]; then
# merge all profiles
mkdir -p "$METRICS_DIR"
# concatenate files, and replace "}{" with ", ", ignoring whitespace
cat $METRICS_FILES | sed 's/ *} *{ */, /g' > $METRICS_DIR/build_androidx.json
# remove metrics files so that next time if Gradle skips emitting them then we don't get old results
rm -f $METRICS_FILES
fi