1#!/bin/bash 2 3set -exu -o pipefail 4cat /VERSION 5 6BASE_DIR="$(pwd)" 7 8# Install gRPC and codegen for the Android examples 9# (a composite gradle build can't find protoc-gen-grpc-java) 10 11cd "$BASE_DIR/github/grpc-java" 12 13export LDFLAGS=-L/tmp/protobuf/lib 14export CXXFLAGS=-I/tmp/protobuf/include 15export LD_LIBRARY_PATH=/tmp/protobuf/lib 16export OS_NAME=$(uname) 17 18cat <<EOF >> gradle.properties 19# defaults to -Xmx512m -XX:MaxMetaspaceSize=256m 20# https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory 21# Increased due to java.lang.OutOfMemoryError: Metaspace failures, "JVM heap 22# space is exhausted", and to increase build speed 23org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=1024m 24EOF 25 26echo y | ${ANDROID_HOME}/tools/bin/sdkmanager "build-tools;28.0.3" 27 28# Proto deps 29buildscripts/make_dependencies.sh 30 31# Build Android with Java 11, this adds it to the PATH 32sudo update-java-alternatives --set java-1.11.0-openjdk-amd64 33# Unset any existing JAVA_HOME env var to stop Gradle from using it 34unset JAVA_HOME 35 36GRADLE_FLAGS="-Pandroid.useAndroidX=true" 37 38./gradlew \ 39 :grpc-android-interop-testing:build \ 40 :grpc-android:build \ 41 :grpc-cronet:build \ 42 :grpc-binder:build \ 43 assembleAndroidTest \ 44 publishToMavenLocal \ 45 $GRADLE_FLAGS 46 47if [[ ! -z $(git status --porcelain) ]]; then 48 git status 49 echo "Error Working directory is not clean. Forget to commit generated files?" 50 exit 1 51fi 52 53# Build examples 54 55cd ./examples/android/clientcache 56../../gradlew build 57cd ../routeguide 58../../gradlew build 59cd ../helloworld 60../../gradlew build 61cd ../strictmode 62../../gradlew build 63 64# Skip APK size and dex count comparisons for non-PR builds 65 66if [[ -z "${KOKORO_GITHUB_PULL_REQUEST_COMMIT:-}" ]]; then 67 echo "Skipping APK size and dex count" 68 exit 0 69fi 70 71# Save a copy of set_github_status.py (it may differ from the base commit) 72 73SET_GITHUB_STATUS="$TMPDIR/set_github_status.py" 74cp "$BASE_DIR/github/grpc-java/buildscripts/set_github_status.py" "$SET_GITHUB_STATUS" 75 76 77# Collect APK size and dex count stats for the helloworld example 78sudo update-java-alternatives --set java-1.8.0-openjdk-amd64 79 80HELLO_WORLD_OUTPUT_DIR="$BASE_DIR/github/grpc-java/examples/android/helloworld/app/build/outputs" 81 82read -r ignored new_dex_count < \ 83 <("${ANDROID_HOME}/tools/bin/apkanalyzer" dex references \ 84 "$HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk") 85 86set +x 87all_new_methods=`"${ANDROID_HOME}/tools/bin/apkanalyzer" dex packages \ 88 --proguard-mapping "$HELLO_WORLD_OUTPUT_DIR/mapping/release/mapping.txt" \ 89 "$HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk" | grep ^M | cut -f4 | sort` 90set -x 91 92new_apk_size="$(stat --printf=%s $HELLO_WORLD_OUTPUT_DIR/apk/release/app-release-unsigned.apk)" 93 94 95# Get the APK size and dex count stats using the pull request base commit 96sudo update-java-alternatives --set java-1.11.0-openjdk-amd64 97 98cd $BASE_DIR/github/grpc-java 99./gradlew clean 100git checkout HEAD^ 101./gradlew --stop # use a new daemon to build the previous commit 102./gradlew publishToMavenLocal $GRADLE_FLAGS 103cd examples/android/helloworld/ 104../../gradlew build 105 106sudo update-java-alternatives --set java-1.8.0-openjdk-amd64 107read -r ignored old_dex_count < \ 108 <("${ANDROID_HOME}/tools/bin/apkanalyzer" dex references app/build/outputs/apk/release/app-release-unsigned.apk) 109 110set +x 111all_old_methods=`"${ANDROID_HOME}/tools/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` 112set -x 113 114old_apk_size="$(stat --printf=%s app/build/outputs/apk/release/app-release-unsigned.apk)" 115 116dex_count_delta="$((new_dex_count-old_dex_count))" 117 118apk_size_delta="$((new_apk_size-old_apk_size))" 119 120set +x 121dex_method_diff=`diff -u <(echo "$all_old_methods") <(echo "$all_new_methods") || true` 122set -x 123 124if [[ -n "$dex_method_diff" ]] 125then 126 echo "Method diff: ${dex_method_diff}" 127fi 128 129# Update the statuses with the deltas 130 131gsutil cp gs://grpc-testing-secrets/github_credentials/oauth_token.txt ~/ 132 133"$SET_GITHUB_STATUS" \ 134 --sha1 "$KOKORO_GITHUB_PULL_REQUEST_COMMIT" \ 135 --state success \ 136 --description "New DEX reference count: $(printf "%'d" "$new_dex_count") (delta: $(printf "%'d" "$dex_count_delta"))" \ 137 --context android/dex_diff --oauth_file ~/oauth_token.txt 138 139"$SET_GITHUB_STATUS" \ 140 --sha1 "$KOKORO_GITHUB_PULL_REQUEST_COMMIT" \ 141 --state success \ 142 --description "New APK size in bytes: $(printf "%'d" "$new_apk_size") (delta: $(printf "%'d" "$apk_size_delta"))" \ 143 --context android/apk_diff --oauth_file ~/oauth_token.txt 144