我正在做一个使用Flutter和Rust的项目,我正在尝试为Android构建它。然而,我面临着一个与arm-linux-androideabi-ranlib
没有找到相关的错误。下面是我得到的错误信息:
--- stderr
/home/user/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar: warning: creating libcrypto.a
/bin/sh: 1: arm-linux-androideabi-ranlib: not found
/home/user/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar: warning: creating libssl.a
/bin/sh: 1: arm-linux-androideabi-ranlib: not found
/bin/sh: 5: arm-linux-androideabi-ranlib: not found
make: *** [Makefile:313: install_dev] Error 127
thread 'main' panicked at '
Error installing OpenSSL:
Command: cd "/home/user/IdeaProjects/my_project/rust/target/armv7-linux-androideabi/debug/build/openssl-sys-c3d36b893b4843b2/out/openssl-build/build/src" && "make" "install_dev"
Exit status: exit status: 2
我已经检查了NDK目录,似乎所需的工具都存在,但不完全是文件arm-linux-androideabi-ranlib
。下面是工具链目录的ls输出:
prebuilt/linux-x86_64/bin via 🐍 v2.7.18 took 6s
❯ pwd
/home/user/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bi
prebuilt/linux-x86_64/bin via 🐍 v2.7.18
❯ ls
aarch64-linux-android21-clang i686-linux-android29-clang++
aarch64-linux-android21-clang++ i686-linux-android30-clang
aarch64-linux-android22-clang i686-linux-android30-clang++
aarch64-linux-android22-clang++ i686-linux-android31-clang
aarch64-linux-android23-clang i686-linux-android31-clang++
aarch64-linux-android23-clang++ i686-linux-android32-clang
aarch64-linux-android24-clang i686-linux-android32-clang++
aarch64-linux-android24-clang++ i686-linux-android33-clang
aarch64-linux-android26-clang i686-linux-android33-clang++
aarch64-linux-android26-clang++ ld
aarch64-linux-android27-clang ld64.lld
aarch64-linux-android27-clang++ ld.lld
aarch64-linux-android28-clang lld
aarch64-linux-android28-clang++ lldb
aarch64-linux-android29-clang lldb-argdumper
aarch64-linux-android29-clang++ lldb.sh
aarch64-linux-android30-clang lld-link
aarch64-linux-android30-clang++ llvm-addr2line
aarch64-linux-android31-clang llvm-ar
aarch64-linux-android31-clang++ llvm-as
aarch64-linux-android32-clang llvm-bolt
aarch64-linux-android32-clang++ llvm-cfi-verify
aarch64-linux-android33-clang llvm-config
aarch64-linux-android33-clang++ llvm-cov
armv7a-linux-androideabi19-clang llvm-cxxfilt
armv7a-linux-androideabi19-clang++ llvm-dis
armv7a-linux-androideabi21-clang llvm-dwarfdump
armv7a-linux-androideabi21-clang++ llvm-dwp
armv7a-linux-androideabi22-clang llvm-lib
armv7a-linux-androideabi22-clang++ llvm-link
armv7a-linux-androideabi23-clang llvm-lipo
armv7a-linux-androideabi23-clang++ llvm-modextract
armv7a-linux-androideabi24-clang llvm-nm
armv7a-linux-androideabi24-clang++ llvm-objcopy
armv7a-linux-androideabi26-clang llvm-objdump
armv7a-linux-androideabi26-clang++ llvm-profdata
armv7a-linux-androideabi27-clang llvm-ranlib
armv7a-linux-androideabi27-clang++ llvm-rc
armv7a-linux-androideabi28-clang llvm-readelf
armv7a-linux-androideabi28-clang++ llvm-readobj
armv7a-linux-androideabi29-clang llvm-size
armv7a-linux-androideabi29-clang++ llvm-strings
armv7a-linux-androideabi30-clang llvm-strip
armv7a-linux-androideabi30-clang++ llvm-symbolizer
armv7a-linux-androideabi31-clang llvm-windres
armv7a-linux-androideabi31-clang++ merge-fdata
armv7a-linux-androideabi32-clang remote_toolchain_inputs
armv7a-linux-androideabi32-clang++ sancov
armv7a-linux-androideabi33-clang sanstats
armv7a-linux-androideabi33-clang++ scan-build
bisect_driver.py scan-view
clang x86_64-linux-android21-clang
clang++ x86_64-linux-android21-clang++
clang-14 x86_64-linux-android22-clang
clang-check x86_64-linux-android22-clang++
clangd x86_64-linux-android23-clang
clang-format x86_64-linux-android23-clang++
clang-tidy x86_64-linux-android24-clang
dsymutil x86_64-linux-android24-clang++
git-clang-format x86_64-linux-android26-clang
i686-linux-android19-clang x86_64-linux-android26-clang++
i686-linux-android19-clang++ x86_64-linux-android27-clang
i686-linux-android21-clang x86_64-linux-android27-clang++
i686-linux-android21-clang++ x86_64-linux-android28-clang
i686-linux-android22-clang x86_64-linux-android28-clang++
i686-linux-android22-clang++ x86_64-linux-android29-clang
i686-linux-android23-clang x86_64-linux-android29-clang++
i686-linux-android23-clang++ x86_64-linux-android30-clang
i686-linux-android24-clang x86_64-linux-android30-clang++
i686-linux-android24-clang++ x86_64-linux-android31-clang
i686-linux-android26-clang x86_64-linux-android31-clang++
i686-linux-android26-clang++ x86_64-linux-android32-clang
i686-linux-android27-clang x86_64-linux-android32-clang++
i686-linux-android27-clang++ x86_64-linux-android33-clang
i686-linux-android28-clang x86_64-linux-android33-clang++
i686-linux-android28-clang++ yasm
i686-linux-android29-clang
我使用Flutter 3.7.6, Dart 2.19.3和cargo-ndk。我的它。属性文件将ANDROID_NDK变量设置为正确的路径:
ANDROID_NDK=/home/user/Android/Sdk/ndk/25.2.9519653/
在我的build.gradle
中,我有以下任务来构建Rust项目:
[
new Tuple2('Debug', ''),
new Tuple2('Profile', '--release'),
new Tuple2('Release', '--release')
].each {
def taskPostfix = it.first
def profileMode = it.second
tasks.whenTaskAdded { task ->
if (task.name == "javaPreCompile$taskPostfix") {
task.dependsOn "cargoBuild$taskPostfix"
}
}
tasks.register("cargoBuild$taskPostfix", Exec) {
commandLine 'sh', '-c', """cd ../../rust/my_lib &&
ANDROID_NDK_HOME="$ANDROID_NDK" cargo ndk
-t armeabi-v7a -t arm64-v8a -t x86 -t x86_64
-o ../android/app/src/main/jniLibs build $profileMode"""
}
}
我在我的项目中使用flutter_rust_bridge版本1.67.0。关于build.gradle
文件的文档在这里。
RustCargo.toml
:
[lib]
crate-type = ["lib", "staticlib", "cdylib"]
[dependencies]
openssl = { version = "0.10", features = ["vendored"] }
有没有人知道为什么构建失败的"arm-linux-androideabi-ranlib not found&;错误和如何修复它?任何帮助都会很感激。谢谢!
您可以通过CC_aarch64-linux-android
、RANLIB_aarch64-linux-android
等环境变量配置OpenSSL Android构建脚本使用的命令路径。下面是我用来配置这些变量的PowerShell脚本:
$ANDROID_HOME = "/path/to/Android/sdk";
$ANDROID_SUBDIRS = "emulator", "tools", "tools/bin", "platform-tools";
ForEach ($subdir in $ANDROID_SUBDIRS) {
${env:PATH} = "${env:PATH}:${ANDROID_HOME}/$subdir";
}
${env:ANDROID_HOME} = $ANDROID_HOME;
${env:ANDROID_SDK_ROOT} = $ANDROID_HOME;
${env:ANDROID_NDK_ROOT} = "$ANDROID_HOME/ndk/25.2.9519653";
function configureAndroidToolchain {
# "windows-x86_64" on Windows
# "darwin-x86_64" on macOS (even with Apple Silicon)
# "linux-x86_64" on Linux
$hostTag = "darwin-x86_64";
# Use the minSdkVersion you use
$sdkVersion = "29";
$archs = @{}
$archs["aarch64-linux-android"] = $null;
$archs["armv7-linux-androideabi"] = "armv7a-linux-androideabi";
$archs["x86_64-linux-android"] = $null;
$archs["i686-linux-android"] = $null;
$prebuiltDir = "${env:ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/$hostTag/bin";
foreach ($rustArch in $archs.Keys) {
$androidArch = $archs[$rustArch];
if ($androidArch -eq $null) {
$androidArch = $rustArch;
}
Set-Item "env:CC_$rustArch" -Value "$prebuiltDir/$androidArch$sdkVersion-clang";
Set-Item "env:CXX_$rustArch" -Value "$prebuiltDir/$androidArch$sdkVersion-clang++";
Set-Item "env:AR_$rustArch" -Value "$prebuiltDir/llvm-ar";
Set-Item "env:RANLIB_$rustArch" -Value "$prebuiltDir/llvm-ranlib";
Set-Item "env:CFLAGS_$rustArch" -Value "-D__ANDROID_MIN_SDK_VERSION__=$sdkVersion";
Set-Item "env:CXXFLAGS_$rustArch" -Value "-D__ANDROID_MIN_SDK_VERSION__=$sdkVersion";
}
}
configureAndroidToolchain;
使用这些变量后,OpenSSL构建将正常完成。
我遇到了这个类似的错误,我正在运行最新版本的Android Studio
,并使用它安装了NDK
。它安装了$HOME/Android/Sdk
中的所有内容。我是这样解决的:
首先你需要设置这些环境:
export ANDROID_HOME=$HOME/Android/Sdk
export ANDROID_NDK_HOME=$HOME/Android/Sdk/ndk/25.2.9519653
export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=33
export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$TOOLCHAIN/bin
之后,在$HOME/.cargo/config
中添加如下内容(如果配置文件不存在,则创建配置文件):
[target.aarch64-linux-android]
linker = "/<absolute path to home>/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android33-clang"
之后,运行cargo build --target aarch64-linux-android
或使用./gradlew build
应该工作。
尝试使用"openssl-src"版本低于或等于"111.24.0+1.1.1 "我在cargo .lock
中每次货物更新后手动设置它[[package]]
name = "openssl-src"
version = "111.24.0+1.1.1s"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd"
dependencies = [
"cc",
]