Skip to content

Commit 3539156

Browse files
committed
android: Add bazel support
1 parent c62cdef commit 3539156

5 files changed

Lines changed: 183 additions & 3 deletions

File tree

.bazelrc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
11
build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17
2+
3+
# Android SDK tools require Java 17+, but older Bazel test runners crash on Java 21+
4+
# due to SecurityManager removal. JDK 17 provides the stable compatibility sweet spot.
5+
#
6+
# Usage: gbazelisk test --config=android //binder/...
7+
build:android --java_language_version=17
8+
build:android --java_runtime_version=17

MODULE.bazel

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4444
"org.mockito:mockito-core:4.4.0",
4545
"org.checkerframework:checker-qual:3.49.5",
4646
"org.codehaus.mojo:animal-sniffer-annotations:1.27",
47+
"androidx.annotation:annotation:1.3.0",
48+
"androidx.core:core:1.13.1",
49+
"androidx.lifecycle:lifecycle-common:2.6.2",
50+
"androidx.test:core:1.7.0",
51+
"org.robolectric:android-all:14-robolectric-10818077",
52+
"org.robolectric:robolectric:4.16.1",
53+
"org.robolectric:shadows-framework:4.16.1",
4754
]
4855
# GRPC_DEPS_END
4956

@@ -53,17 +60,26 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1")
5360
bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5", repo_name = "com_google_googleapis")
5461
bazel_dep(name = "grpc-proto", version = "0.0.0-20240627-ec30f58.bcr.1", repo_name = "io_grpc_grpc_proto")
5562
bazel_dep(name = "protobuf", version = "33.4", repo_name = "com_google_protobuf")
63+
bazel_dep(name = "rules_android", version = "0.7.2")
5664
bazel_dep(name = "rules_cc", version = "0.0.9")
5765
bazel_dep(name = "rules_java", version = "9.1.0")
5866
bazel_dep(name = "rules_jvm_external", version = "6.0")
5967

68+
android_sdk_repository_extension = use_extension(
69+
"@rules_android//rules/android_sdk_repository:rule.bzl",
70+
"android_sdk_repository_extension",
71+
)
72+
use_repo(android_sdk_repository_extension, "androidsdk")
73+
register_toolchains("@androidsdk//:sdk-toolchain", "@androidsdk//:all")
74+
6075
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
6176
maven.install(
6277
artifacts = IO_GRPC_GRPC_JAVA_ARTIFACTS,
6378
repositories = [
6479
"https://repo.maven.apache.org/maven2/",
80+
"https://maven.google.com",
6581
],
66-
strict_visibility = True,
82+
strict_visibility = False,
6783
)
6884
use_repo(maven, "maven")
6985

@@ -159,3 +175,7 @@ maven.override(
159175
coordinates = "io.grpc:grpc-util",
160176
target = "@io_grpc_grpc_java//util",
161177
)
178+
maven.override(
179+
coordinates = "io.grpc:grpc-binder",
180+
target = "@io_grpc_grpc_java//binder",
181+
)

WORKSPACE

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ load("@com_google_protobuf//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "pr
1717

1818
protobuf_deps()
1919

20+
# Register remote JDK toolchains to safely compile Java targets under Bazel 8.
2021
load("@rules_java//java:rules_java_deps.bzl", "rules_java_dependencies")
2122

2223
rules_java_dependencies()
@@ -25,6 +26,15 @@ load("@bazel_features//:deps.bzl", "bazel_features_deps")
2526

2627
bazel_features_deps()
2728

29+
# Must be loaded after bazel_features_deps() to avoid circular deps.
30+
load("@rules_java//java:repositories.bzl", "rules_java_toolchains")
31+
32+
rules_java_toolchains()
33+
34+
load("@rules_android//rules:rules.bzl", "android_sdk_repository")
35+
36+
android_sdk_repository(name = "androidsdk")
37+
2838
load("@bazel_jar_jar//:jar_jar.bzl", "jar_jar_repositories")
2939

3040
jar_jar_repositories()
@@ -49,10 +59,119 @@ http_archive(
4959
load("@rules_jvm_external//:defs.bzl", "maven_install")
5060

5161
maven_install(
52-
artifacts = IO_GRPC_GRPC_JAVA_ARTIFACTS + PROTOBUF_MAVEN_ARTIFACTS,
62+
artifacts = IO_GRPC_GRPC_JAVA_ARTIFACTS + PROTOBUF_MAVEN_ARTIFACTS + [
63+
# Hack: Android compile-time worker ResourceProcessorBusyBox uses protos internally.
64+
# This ensures rules_jvm_external generates its namespace target alias,
65+
# enabling the IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS to override it correctly.
66+
"com.google.protobuf:protobuf-java-util:3.25.5",
67+
],
5368
override_targets = IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS,
5469
repositories = [
5570
"https://repo.maven.apache.org/maven2/",
71+
# For androidx deps (e.g. core) not published to Maven Central.
72+
"https://maven.google.com",
73+
],
74+
strict_visibility = False,
75+
)
76+
77+
# Define a custom rules_android_maven repository to override its com.google.protobuf
78+
# runtime dependency to point directly to our workspace compiled C++ target.
79+
# This resolves severe runtime-vs-gencode validation crashes inside the precompiled
80+
# ResourceProcessorBusyBox tool when executing under legacy workspace mode.
81+
maven_install(
82+
name = "rules_android_maven",
83+
artifacts = [
84+
"androidx.privacysandbox.tools:tools:1.0.0-alpha06",
85+
"androidx.privacysandbox.tools:tools-apigenerator:1.0.0-alpha06",
86+
"androidx.privacysandbox.tools:tools-apipackager:1.0.0-alpha06",
87+
"androidx.test:core:1.6.0-alpha01",
88+
"androidx.test.ext:junit:1.2.0-alpha01",
89+
"com.android.tools.apkdeployer:apkdeployer:8.8.0-alpha05",
90+
"org.gradle:gradle-core:4.2.1",
91+
"com.android.tools.build:bundletool:1.15.5",
92+
"com.android.tools:desugar_jdk_libs_minimal:2.0.4",
93+
"com.android.tools:desugar_jdk_libs_configuration_minimal:2.0.4",
94+
"com.android.tools:desugar_jdk_libs_nio:2.0.4",
95+
"com.android.tools:desugar_jdk_libs_configuration_nio:2.0.4",
96+
"com.android.tools.build:gradle:8.7.0",
97+
"com.android.tools:r8:8.5.35",
98+
"org.bouncycastle:bcprov-jdk18on:1.77",
99+
"org.hamcrest:hamcrest-core:2.2",
100+
"org.robolectric:robolectric:4.14.1",
101+
"com.google.flogger:flogger:0.8",
102+
"com.google.guava:guava:32.1.2-jre",
103+
"com.google.truth:truth:1.1.5",
104+
"info.picocli:picocli:4.7.4",
105+
"jakarta.inject:jakarta.inject-api:2.0.1",
106+
"junit:junit:4.13.2",
107+
"com.beust:jcommander:1.82",
108+
"com.google.protobuf:protobuf-java:3.25.5",
109+
"com.google.protobuf:protobuf-java-util:3.25.5",
110+
"com.google.code.findbugs:jsr305:3.0.2",
111+
"androidx.databinding:databinding-compiler:8.7.0",
112+
"org.ow2.asm:asm:9.6",
113+
"org.ow2.asm:asm-commons:9.6",
114+
"org.ow2.asm:asm-tree:9.6",
115+
"org.ow2.asm:asm-util:9.6",
116+
"com.android.tools.layoutlib:layoutlib-api:30.1.3",
117+
"com.android:zipflinger:8.7.0",
118+
"com.android.tools.build:manifest-merger:30.1.3",
119+
"com.android:signflinger:8.7.0",
120+
"com.android.tools.build:aapt2-proto:8.6.1-11315950",
121+
"com.android.tools.analytics-library:protos:30.1.3",
122+
"com.android.tools.analytics-library:shared:30.1.3",
123+
"com.android.tools.analytics-library:tracker:30.1.3",
124+
"com.android.tools:annotations:30.1.3",
125+
"com.android.tools.build:apksig:8.7.0",
126+
"com.android.tools.build:apkzlib:8.7.0",
127+
"com.android.tools.build:builder:8.7.0",
128+
"com.android.tools.build:builder-model:8.7.0",
129+
"com.google.auto.value:auto-value:1.11.0",
130+
"com.google.auto.value:auto-value-annotations:1.11.0",
131+
"com.google.auto:auto-common:1.2.2",
132+
"com.google.auto.service:auto-service:1.1.1",
133+
"com.google.auto.service:auto-service-annotations:1.1.1",
134+
"com.google.errorprone:error_prone_annotations:2.33.0",
135+
"com.google.errorprone:error_prone_type_annotations:2.33.0",
136+
"com.google.errorprone:error_prone_check_api:2.33.0",
137+
"com.google.errorprone:error_prone_core:2.33.0",
138+
],
139+
override_targets = {
140+
"com.google.protobuf:protobuf-java": "@com_google_protobuf//:protobuf_java",
141+
"com.google.protobuf:protobuf-java-util": "@com_google_protobuf//:protobuf_java_util",
142+
},
143+
repositories = [
144+
"https://repo1.maven.org/maven2",
145+
"https://maven.google.com",
146+
"https://repo.gradle.org/gradle/libs-releases",
56147
],
57-
strict_visibility = True,
148+
use_starlark_android_rules = True,
149+
aar_import_bzl_label = "@rules_android//rules:rules.bzl",
150+
)
151+
152+
# Download rules_android prerequisite repositories (such as @robolectric,
153+
# @io_bazel_rules_go, and @bazel_gazelle). This MUST be executed before loading
154+
# @rules_android//:defs.bzl to resolve top-level circular Starlark load statements.
155+
load("@rules_android//:prereqs.bzl", "rules_android_prereqs")
156+
157+
rules_android_prereqs()
158+
159+
load("@rules_android//:defs.bzl", "rules_android_workspace")
160+
161+
rules_android_workspace()
162+
163+
load("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository")
164+
165+
android_sdk_repository(
166+
name = "androidsdk",
167+
)
168+
169+
# Register Android and SDK toolchains.
170+
# Note: @rules_android//toolchains/android_sdk:android_sdk_tools is required
171+
# to bridge legacy generated `@androidsdk` toolchains to modern standalone
172+
# rules_android toolchain type expectations under legacy workspace mode.
173+
register_toolchains(
174+
"@androidsdk//:all",
175+
"@rules_android//toolchains/android:all",
176+
"@rules_android//toolchains/android_sdk:android_sdk_tools",
58177
)

android/BUILD.bazel

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
load("@rules_android//rules:rules.bzl", "android_library")
2+
load("@rules_jvm_external//:defs.bzl", "artifact")
3+
4+
android_library(
5+
name = "android",
6+
srcs = glob([
7+
"src/main/java/**/*.java",
8+
]),
9+
custom_package = "io.grpc.android",
10+
manifest = "src/main/AndroidManifest.xml",
11+
visibility = ["//visibility:public"],
12+
deps = [
13+
"//api",
14+
"//core:internal",
15+
artifact("com.google.code.findbugs:jsr305"),
16+
artifact("com.google.errorprone:error_prone_annotations"),
17+
artifact("com.google.guava:guava"),
18+
],
19+
)

repositories.bzl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
4848
"org.mockito:mockito-core:4.4.0",
4949
"org.checkerframework:checker-qual:3.49.5",
5050
"org.codehaus.mojo:animal-sniffer-annotations:1.27",
51+
"androidx.annotation:annotation:1.3.0",
52+
"androidx.core:core:1.13.1",
53+
"androidx.lifecycle:lifecycle-common:2.6.2",
54+
"androidx.test:core:1.7.0",
55+
"org.robolectric:android-all:14-robolectric-10818077",
56+
"org.robolectric:robolectric:4.16.1",
57+
"org.robolectric:shadows-framework:4.16.1",
5158
]
5259
# GRPC_DEPS_END
5360

@@ -86,6 +93,7 @@ IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS = {
8693
"io.grpc:grpc-testing": "@io_grpc_grpc_java//testing",
8794
"io.grpc:grpc-xds": "@io_grpc_grpc_java//xds:xds_maven",
8895
"io.grpc:grpc-util": "@io_grpc_grpc_java//util",
96+
"io.grpc:grpc-binder": "@io_grpc_grpc_java//binder",
8997
}
9098

9199
def grpc_java_repositories():
@@ -110,6 +118,13 @@ def grpc_java_repositories():
110118
strip_prefix = "bazel_jar_jar-0.1.6",
111119
url = "https://github.com/bazeltools/bazel_jar_jar/releases/download/v0.1.6/bazel_jar_jar-v0.1.6.tar.gz",
112120
)
121+
if not native.existing_rule("rules_android"):
122+
http_archive(
123+
name = "rules_android",
124+
sha256 = "0da7198c7c8bac7e11e08dca3c434617b8593075858716595672e9aeefbef2a7",
125+
strip_prefix = "rules_android-0.7.2",
126+
urls = ["https://github.com/bazelbuild/rules_android/releases/download/v0.7.2/rules_android-v0.7.2.tar.gz"],
127+
)
113128

114129
def com_google_protobuf():
115130
# proto_library rules implicitly depend on @com_google_protobuf//:protoc,

0 commit comments

Comments
 (0)