Skip to content

Commit 3da892d

Browse files
committed
android: Add bazel support
1 parent 3f8eec6 commit 3da892d

5 files changed

Lines changed: 149 additions & 1 deletion

File tree

.bazelrc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17
2+
3+
# Enforce stable JDK 17 compilation globally (aligns with rules_android defaults)
4+
common --java_language_version=17
5+
common --java_runtime_version=17
6+
common --tool_java_language_version=17
7+
common --tool_java_runtime_version=17

MODULE.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1")
5252
bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5", repo_name = "com_google_googleapis")
5353
bazel_dep(name = "grpc-proto", version = "0.0.0-20240627-ec30f58.bcr.1", repo_name = "io_grpc_grpc_proto")
5454
bazel_dep(name = "protobuf", version = "33.4", repo_name = "com_google_protobuf")
55+
bazel_dep(name = "rules_android", version = "0.6.0")
5556
bazel_dep(name = "rules_cc", version = "0.0.9")
5657
bazel_dep(name = "rules_java", version = "9.1.0")
5758
bazel_dep(name = "rules_jvm_external", version = "6.0")

WORKSPACE

Lines changed: 116 additions & 1 deletion
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,11 @@ 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+
2834
load("@bazel_jar_jar//:jar_jar.bzl", "jar_jar_repositories")
2935

3036
jar_jar_repositories()
@@ -49,10 +55,119 @@ http_archive(
4955
load("@rules_jvm_external//:defs.bzl", "maven_install")
5056

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

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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ def grpc_java_repositories():
110110
strip_prefix = "bazel_jar_jar-0.1.6",
111111
url = "https://github.com/bazeltools/bazel_jar_jar/releases/download/v0.1.6/bazel_jar_jar-v0.1.6.tar.gz",
112112
)
113+
if not native.existing_rule("rules_android"):
114+
http_archive(
115+
name = "rules_android",
116+
sha256 = "af84b69ab3d16dd1a41056286e6511f147a94ccea995603e13e934c915c1631c",
117+
strip_prefix = "rules_android-0.6.0",
118+
urls = ["https://github.com/bazelbuild/rules_android/releases/download/v0.6.0/rules_android-v0.6.0.tar.gz"],
119+
)
113120

114121
def com_google_protobuf():
115122
# proto_library rules implicitly depend on @com_google_protobuf//:protoc,

0 commit comments

Comments
 (0)