使用指定版本工具构建TensorFlow Android Demo失败求助
嘿,我之前在配置TensorFlow Android Demo的时候也踩过不少版本兼容的坑,结合你给出的环境信息,咱们来一步步拆解问题:
- Android Studio 3.1.1
- NDK 14.1.3816874(也就是r14b)
- Android SDK Platform-Tools 27.0.1
- Android SDK Tools 26.1.1
- SDK Build-Tools 28 rc-1
- Bazel 0.11.1
一、先确认TensorFlow与Bazel的版本兼容性
Bazel 0.11.1是比较老旧的版本,它只适配TensorFlow 1.x系列的特定版本(比如1.8.x)。如果你克隆的TensorFlow代码是较新的分支(比如2.x),肯定会直接构建失败。
解决方案:
切换到和Bazel 0.11.1兼容的TensorFlow标签,比如r1.8:
git checkout r1.8
二、NDK与SDK Build-Tools的版本冲突
你的NDK是r14b,这个版本对Android 8.1(API 27)及以下的支持更稳定,但你用了SDK Build-Tools 28 rc-1(对应Android 9.0 API 28),两者的兼容性很差,这大概率是构建失败的核心原因之一。
解决方案:
二选一即可:
- 降级SDK Build-Tools到27.0.3,和你的Platform-Tools 27.0.1保持版本一致;
- 升级NDK到r16b(这个版本对API 28的支持更完善,同时也兼容你现有的SDK版本)。
另外,一定要确保TensorFlow根目录下的WORKSPACE文件配置了正确的NDK/SDK路径和版本:
android_sdk_repository( name = "androidsdk", api_level = 27, build_tools_version = "27.0.3", # 对应你降级后的版本 path = "/Users/yourname/Library/Android/sdk", # 换成你的SDK实际路径 ) android_ndk_repository( name = "androidndk", path = "/Users/yourname/Library/Android/sdk/ndk/14.1.3816874", # 你的NDK路径 api_level = 21, # r14b支持的最低API级别是21 )
三、终端构建命令的细节优化
直接执行bazel build //tensorflow/examples/android:tensorflow_demo可能缺少必要的参数,试试加上明确的版本指定:
bazel build //tensorflow/examples/android:tensorflow_demo --android_api_level=27 --android_ndk_version=14.1.3816874 --android_build_tools_version=27.0.3
另外,首次构建Bazel会下载大量依赖,确保网络通畅,要是国内网络的话可以配置Bazel的国内镜像加速。
四、Gradle调用Bazel的配置排查
如果用Gradle调用Bazel只返回“non-zero exit value”,说明没拿到具体错误日志,先给Gradle加个日志输出配置,看看Bazel到底报了什么错:
在你的模块build.gradle中添加:
tasks.withType(Exec) { standardOutput = new ByteArrayOutputStream() errorOutput = new ByteArrayOutputStream() doLast { println "Bazel Output: " + standardOutput.toString() println "Bazel Error: " + errorOutput.toString() } }
重新运行构建,就能看到具体的错误信息了。另外还要检查:
/usr/local/bin/bazel这个路径是否真的存在,执行ls /usr/local/bin/bazel确认;- Gradle中传递给Bazel的参数是否和终端命令一致,比如API级别、Build-Tools版本等。
五、几个容易忽略的小坑
- 确保你的系统是64位的,NDK r14b完全不支持32位系统;
- 磁盘空间要够,Bazel构建会生成大量中间文件,至少留10GB以上空闲空间;
- 关掉Android Studio的Instant Run功能,它有时候会干扰Native代码的构建流程。
内容的提问来源于stack exchange,提问作者Nico Mortel

