| #!/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}" |