grpc-java/buildscripts/kokoro/android.sh

148 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
set -exu -o pipefail
BASE_DIR="$(pwd)"
# Install gRPC and codegen for the Android examples
# (a composite gradle build can't find protoc-gen-grpc-java)
cd "$BASE_DIR/github/grpc-java"
export OS_NAME=$(uname)
cat <<EOF >> gradle.properties
# defaults to -Xmx512m -XX:MaxMetaspaceSize=256m
# https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory
# Increased due to java.lang.OutOfMemoryError: Metaspace failures, "JVM heap
# space is exhausted", and to increase build speed
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=1024m
EOF
export ANDROID_HOME=/tmp/Android/Sdk
mkdir -p "${ANDROID_HOME}/cmdline-tools"
curl -Ls -o cmdline.zip \
"https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip"
unzip -qd "${ANDROID_HOME}/cmdline-tools" cmdline.zip
rm cmdline.zip
mv "${ANDROID_HOME}/cmdline-tools/cmdline-tools" "${ANDROID_HOME}/cmdline-tools/latest"
(yes || true) | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses
curl -Ls https://github.com/Kitware/CMake/releases/download/v3.26.3/cmake-3.26.3-linux-x86_64.tar.gz | \
tar xz -C /tmp
export PATH=/tmp/cmake-3.26.3-linux-x86_64/bin:$PATH
# Proto deps
buildscripts/make_dependencies.sh
sudo apt-get update && sudo apt-get install pkg-config
export LDFLAGS="$(PKG_CONFIG_PATH=/tmp/protobuf/lib/pkgconfig pkg-config --libs protobuf)"
export CXXFLAGS="$(PKG_CONFIG_PATH=/tmp/protobuf/lib/pkgconfig pkg-config --cflags protobuf)"
export LD_LIBRARY_PATH=/tmp/protobuf/lib
# Build Android with Java 11, this adds it to the PATH
sudo update-java-alternatives --set java-1.11.0-openjdk-amd64
# Unset any existing JAVA_HOME env var to stop Gradle from using it
unset JAVA_HOME
GRADLE_FLAGS="-Pandroid.useAndroidX=true"
./gradlew \
:grpc-android-interop-testing:build \
:grpc-android:build \
:grpc-cronet:build \
:grpc-binder:build \
assembleAndroidTest \
publishToMavenLocal \
$GRADLE_FLAGS
if [[ ! -z $(git status --porcelain) ]]; then
git status
echo "Error Working directory is not clean. Forget to commit generated files?"
exit 1
fi
# Build examples
cd ./examples/android/clientcache
../../gradlew build $GRADLE_FLAGS
cd ../routeguide
../../gradlew build $GRADLE_FLAGS
cd ../helloworld
../../gradlew build $GRADLE_FLAGS
cd ../strictmode
../../gradlew build $GRADLE_FLAGS
# Skip APK size and dex count comparisons for non-PR builds
if [[ -z "${KOKORO_GITHUB_PULL_REQUEST_COMMIT:-}" ]]; then
echo "Skipping APK size and dex count"
exit 0
fi
# Collect APK size and dex count stats for the helloworld example
HELLO_WORLD_OUTPUT_DIR="$BASE_DIR/github/grpc-java/examples/android/helloworld/app/build/outputs"
# Install dependencies of apkanalyzer
"${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --install "build-tools;35.0.0"
read -r ignored new_dex_count < \
<("${ANDROID_HOME}/cmdline-tools/latest/bin/apkanalyzer" dex references \
"$HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk")
set +x
all_new_methods=`"${ANDROID_HOME}/cmdline-tools/latest/bin/apkanalyzer" dex packages \
--proguard-mapping "$HELLO_WORLD_OUTPUT_DIR/mapping/release/mapping.txt" \
"$HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk" | grep ^M | cut -f4 | sort`
set -x
new_apk_size="$(stat --printf=%s $HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk)"
# Get the APK size and dex count stats using the pull request base commit
cd $BASE_DIR/github/grpc-java
./gradlew clean
git checkout HEAD^
./gradlew --stop # use a new daemon to build the previous commit
GRADLE_FLAGS="${GRADLE_FLAGS} -PskipCodegen=true" # skip codegen for build from previous commit since it wasn't built with --std=c++14 when making this change
./gradlew publishToMavenLocal $GRADLE_FLAGS
cd examples/android/helloworld/
../../gradlew build $GRADLE_FLAGS
read -r ignored old_dex_count < \
<("${ANDROID_HOME}/cmdline-tools/latest/bin/apkanalyzer" dex references app/build/outputs/apk/release/app-release-unsigned.apk)
set +x
all_old_methods=`"${ANDROID_HOME}/cmdline-tools/latest/bin/apkanalyzer" dex packages --proguard-mapping app/build/outputs/mapping/release/mapping.txt app/build/outputs/apk/release/app-release-unsigned.apk | grep ^M | cut -f4 | sort`
set -x
old_apk_size="$(stat --printf=%s app/build/outputs/apk/release/app-release-unsigned.apk)"
dex_count_delta="$((new_dex_count-old_dex_count))"
apk_size_delta="$((new_apk_size-old_apk_size))"
set +x
dex_method_diff=`diff -u <(echo "$all_old_methods") <(echo "$all_new_methods") || true`
set -x
if [[ -n "$dex_method_diff" ]]
then
echo "Method diff: ${dex_method_diff}"
fi
# Update the statuses with the deltas
gsutil cp gs://grpc-testing-secrets/github_credentials/oauth_token.txt ~/
desc="New DEX reference count: $(printf "%'d" "$new_dex_count") (delta: $(printf "%'d" "$dex_count_delta"))"
curl -f -s -X POST -H "Content-Type: application/json" \
-H "Authorization: token $(cat ~/oauth_token.txt | tr -d '\n')" \
-d '{"state": "success", "context": "android/dex_diff", "description": "'"${desc}"'"}' \
"https://api.github.com/repos/grpc/grpc-java/statuses/${KOKORO_GITHUB_PULL_REQUEST_COMMIT}"
desc="New APK size in bytes: $(printf "%'d" "$new_apk_size") (delta: $(printf "%'d" "$apk_size_delta"))"
curl -f -s -X POST -H "Content-Type: application/json" \
-H "Authorization: token $(cat ~/oauth_token.txt | tr -d '\n')" \
-d '{"state": "success", "context": "android/apk_diff", "description": "'"${desc}"'"}' \
"https://api.github.com/repos/grpc/grpc-java/statuses/${KOKORO_GITHUB_PULL_REQUEST_COMMIT}"