当我在本地环境中使用
nix-shell
设置所有内容时,我无法让bazel构建Android应用程序。
当我尝试构建时,出现以下错误:
$ bazel build //app/java:dnsproxy
ERROR: [...]/WORKSPACE:12:23: fetching android_sdk_repository rule //external:androidsdk: Bazel requires Android build tools version 30.0.0 or newer but none are installed. Please install a recent version through the Android SDK manager.
ERROR: Analysis of target '//app/java:dnsproxy' failed; build aborted: Bazel requires Android build tools version 30.0.0 or newer but none are installed. Please install a recent version through the Android SDK manager.
INFO: Elapsed time: 0.169s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)
sdkmanager
告诉我,安装了正确的版本。
$ sdkmanager --list_installed
[=======================================] 100% Fetch remote repository...
Installed packages:
Path | Version | Description | Location
------- | ------- | ------- | -------
build-tools;33.0.1 | 33.0.1 | Android SDK Build-Tools 33.0.1 | build-tools/33.0.1
cmdline-tools;8.0 | 8.0 | Android SDK Command-line Tools | cmdline-tools/8.0
patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4
platform-tools | 33.0.3 | Android SDK Platform-Tools | platform-tools
platforms;android-31 | 1 | Android SDK Platform 31 | platforms/android-31
设置了必要的环境变量,一切似乎都很好。
$ echo $ANDROID_HOME
/nix/store/vgcmyvfyqb7kz505r1x1n14lbma2f7ri-androidsdk/libexec/android-sdk
$ which sdkmanager
/nix/store/vgcmyvfyqb7kz505r1x1n14lbma2f7ri-androidsdk/bin/sdkmanager
通往一切的道路都在那里。
$ ls -lah /nix/store/vgcmyvfyqb7kz505r1x1n14lbma2f7ri-androidsdk/libexec/android-sdk/build-tools
Permissions Size User Date Modified Name
lrwxrwxrwx 101 root 1 1月 1970 33.0.1 -> /nix/store/ycc7k5p19ih0ky3pj0zviqk6mkghzgn7-build-tools-33.0.1/libexec/android-sdk/build-tools/33.0.1
$ ls -lah /nix/store/vgcmyvfyqb7kz505r1x1n14lbma2f7ri-androidsdk/libexec/android-sdk/platforms
Permissions Size User Date Modified Name
lrwxrwxrwx 97 root 1 1月 1970 android-31 -> /nix/store/20bc5fca6vkgyddhjm7l68ams9ccqr6y-platforms-31/libexec/android-sdk/platforms/android-31
我发现了这个 Pull Request:https://github.com/bazelbuild/bazel/pull/12626
bazel 中的符号链接检测存在问题,导致我现在遇到的确切问题,
但这已经修复了一段时间了。
以下是我尝试构建的
.nix
和 bazel 文件。
shell.nix
with (import <nixpkgs> {
config.allowUnfree = true;
config.android_sdk.accept_license = true;
});
let
jdk = jdk11;
android-composition = androidenv.composeAndroidPackages {
platformVersions = ["31"];
};
in
mkShell rec {
name = "android-shell";
buildInputs = [
jdk
android-composition.androidsdk
bazel
];
JAVA_HOME = jdk.home;
ANDROID_SDK_ROOT = "${android-composition.androidsdk}/libexec/android-sdk";
ANDROID_HOME = "${ANDROID_SDK_ROOT}";
}
工作空间
# Load the Android build rules
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "build_bazel_rules_android",
urls = ["https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip"],
sha256 = "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806",
strip_prefix = "rules_android-0.1.1",
)
# Configure Android SDK Path
load("@build_bazel_rules_android//android:rules.bzl", "android_sdk_repository")
android_sdk_repository(
name = "androidsdk",
)
应用程序/Java/构建
load("@build_bazel_rules_android//android:rules.bzl", "android_library", "android_binary")
android_library(
name = "main",
srcs = glob(["src/*.java"]),
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_binary(
name = "dnsproxy",
manifest = "AndroidManifest.xml",
deps = [":main"],
)
版本
$ nix --version
nix (Nix) 2.15.0
$ nix-channel --list
nixpkgs https://nixos.org/channels/nixpkgs-unstable
$ bazel --version
bazel 6.1.2- (@non-git)
$ uname -a
Linux archbook 6.2.13-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 26 Apr 2023 20:50:14 +0000 x86_64 GNU/Linux
buildFHSUserEnv
,但我在那里得到了完全相同的错误。
我不知道它是否仍然是 bazel 问题、nix 包问题或其他完全问题,我想不出任何其他我可以检查或尝试让它工作的东西。
附:
回复评论:
strace
返回具有与上述相同路径的相同环境变量。
回复评论:
我检查了提到的链接并得出结论,我使用的是来自 https://developer.android.com 的旧指南。从 https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip 加载 android 构建规则似乎不再需要了。 这似乎是来自https://bazel.build的更新指南,所以新文件内容是
工作空间
android_sdk_repository(
name = "androidsdk",
)
应用程序/Java/构建
android_library(
name = "main",
srcs = glob(["src/*.java"]),
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_binary(
name = "dnsproxy",
manifest = "AndroidManifest.xml",
deps = [":main"],
)
但我仍然遇到同样的错误,即没有安装构建工具。
ERROR: [...]/WORKSPACE:1:23: fetching android_sdk_repository rule //external:androidsdk: Bazel requires Android build tools version 30.0.0 or newer but none are installed. Please install a recent version through the Android SDK manager.
我仍然不确定这是 nix 还是 bazel 问题。