xref: /aosp_15_r20/external/grpc-grpc-java/buildscripts/kokoro/android.sh (revision e07d83d3ffcef9ecfc9f7f475418ec639ff0e5fe)
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