使用 bazel 构建 android 应用程序,在 nix-shell 环境中设置

问题描述 投票:0回答:0

当我在本地环境中使用

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 问题。

android bazel nix
© www.soinside.com 2019 - 2024. All rights reserved.