无法使用i686-linux-android目标运行单元测试

时间:2018-12-17 11:27:07

标签: unit-testing rust cross-compiling rust-cargo

我在Linux本地计算机上运行Rust(工具链stable-x86_64-unknown-linux-gnu)。我的库可以使用Android应用程序构建并正常运行。但是,如果指定 i686-linux-android 目标,我将无法运行任何单元测试。

我可以在空项目中复制它。

我创建了新的rust项目

cargo new android_test --lib

通过 /android_test/.cargo/config

设置Android NDK ar 链接器
[target.i686-linux-android]
ar = "ndk/x86/bin/i686-linux-android-ar"
linker = "ndk/x86/bin/i686-linux-android-clang"

简单测试将成功。

cargo test

但是如果我将目标设置为三重,它将失败。

cargo test --target i686-linux-android
  

跑步   目标/ i686-linux-android / debug / deps / android_test-a71bf7c418798cd7   错误:无法执行进程   /home/zellius/Projects/android_test/target/i686-linux-android/debug/deps/android_test-a71bf7c418798cd7   (从未执行)原因:没有这样的文件或目录(操作系统错误2)

如果我通过adb手动将 android_test-a71bf7c418798cd7 文件推到Android模拟器中,则单元测试将运行并通过。

我试图创建自定义跑步者。但是结果是一样的。

android_runner.sh

#!/bin/sh

set -e
adb push "$1" "/data/local/tmp/$1"
adb shell "/data/local/tmp/$1"

/android_test/.cargo/config

[target.i686-linux-android]
ar = "ndk/x86/bin/i686-linux-android-ar"
linker = "ndk/x86/bin/i686-linux-android-clang"
runner = ["android_runner.sh"]

我想念什么吗?我可以使用货物测试在模拟器上运行测试吗?还是应该为此目的使用脚本?

1 个答案:

答案 0 :(得分:0)

通常错误很小且很愚蠢。

就我而言,我应该修复运行脚本的路径。

我的项目结构:

  • /。cargo

    • config
  • ndk

  • android_runner.sh

  • 其他文件和目录

/android_test/.cargo/config

[target.i686-linux-android]
ar = "./ndk/x86/bin/i686-linux-android-ar"
linker = "./ndk/x86/bin/i686-linux-android-clang"
# change android_runner.sh to ./android_runner.sh
runner = ["./android_runner.sh"]

我也修复了脚本。现在,我从路径中提取二进制文件名(例如 / home / zellius / Projects / android_test / target / i686-linux-android / debug / deps / android_test-a71bf7c418798cd7 )并将其推到设备上的某个位置。否则,adb将尝试将其推送到更长的目录。

  

/ data / local / tmp // home / zellius / Projects / android_test / target / i686-linux-android / debug / deps / android_test-a71bf7c418798cd7 *

/android_test/android_runner.sh

#!/bin/sh

test_file_name=$(basename -- "$1")
adb push "$1" "/data/local/tmp/$test_file_name"
adb shell "/data/local/tmp/$test_file_name"

现在,我可以通过 cargo test --target i686-linux-android 在本地x86模拟器上运行测试。

也许有更好的方法可以做到这一点,但目前它适用于我的情况。