如何解决bazel build android_binary with Guava 依赖抱怨 min_sdk_version 尽管在清单中设置
更新:
我决定尝试一个实验。我通过了 bazel android tutorial 并让它开始工作。然后我尝试做一个小改动来添加对 Guava 的依赖,并将 dep 添加到 BUILD
文件中。结果 - 我也能够在那里重现该问题。所以这肯定与包含 Guava 有关,但为什么我不知道为什么要决定我想要 API 级别 13。
使用 Java/Android 的主要优点之一是我可以重用代码,因此如果我必须分离/复制构建目标以获得引入 android 版本的 Guava 的 android 特定版本,这并不好。如果我避免使用 Java8,也许这是有道理的,但我的意图是将 minSdkVersion
保持在 24 以上并使用 Java8 功能......我不明白“当前版本 13”是从哪里来的,从而阻止了这一点.
TL:DR;
运行 bazel build [android_binary_target]
失败
ERROR: C:/_bazel_out/z2b54lqx/external/maven/BUILD:829:1: Dexing external/maven/_dx/com_google_guava_guava/guava-30.0-jre.jar_desugared.jar with applicable dexopts [] failed (Exit 1)
java.util.concurrent.ExecutionException: com.android.dx.cf.code.SimException: ERROR in com.google.common.collect.CollectCollectors.toImmutableBiMap:(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;: invoking a static interface method java.util.
stream.Collector.of:(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector; strictly requires --min-sdk-version >= 24 (blocked at current A
PI level 13)
尽管所有包含的 AndroidManifest.xml
文件都指定了 minSdkVersion="28"
,但仍会发生这种情况。我不知道“当前的 API 级别 13”从何而来。
长版:
我正在将我的个人代码库从 gradle 移植到 bazel。我已经到了移植第一个 android 应用程序的地步,这只是另一个库的一个小演示,我有一些 LaTeX 风格的格式。该库具有非 android 特定的通用核心代码,并且有一个单独的 android 实现目标。目录结构、BUILD
文件和 AndroidManifest.xml
描述如下。
公共代码大量使用 Guava
并且由于它不是特定于 android 的,因此不使用特定于 android 的 guava 版本。我不希望这对于足够高的 minSdkVersion 很重要。我认识到 Guava 很大,作为一个完整的块对于 android 来说并不好......我正在考虑尝试改变我对它的依赖,这样我就可以在 Guava 中挑选单个包而不是整个包,但这似乎与我所看到的内容无关,其中构建坚持使用 API 级别 13,而这似乎没有在任何地方指定。
我真的很想避免为公共代码设置单独的目标/deps,这些代码有时会用于android,有时则不会……例如我依赖于 guava 的 java/com/bdl/latex/core 包不应该使用特定于 android 的 guava deps,因为它不是特定于 android。
知道为什么系统认为它使用 API 级别 13 吗? 我需要做什么才能让它识别出我的 AndroidManifest 中的 minSdkVersion?
WORKSPACE 只包含 android_sdk_repository(name = "androidsdk")
而不指定版本,所以它应该使用我安装的最高版本 (30)。我已经确认我安装了 24 以上的版本(一切 25-30),
工具版本:
Android SDK 工具:26.1.1
平台工具:30.0.5
目录结构:
java/com/bdl
latex - the public API of the latex package.
core - main classes for common functionality,some public stuff that I haven't separated yet.
graphics - interfaces allowing for implementations support both Android and AWT
android - Android-specific implementations
demo - where all my demo app code lives.
以及相关文件:
java/com/bdl/latex/android/BUILD:
- 为特定于 android 的实现构建
android_library(
name = "android",srcs = glob(["*.java"]),manifest = "AndroidManifest.xml",resource_files = glob(["res/**/*.*"]),visibility = ["//visibility:public"],deps = [
"//ext/google:guava",# //ext are local exports of maven repos
"//ext/google/dagger","//ext/java:jsr305_annotations","//ext/javax:inject","//java/com/bdl/android/dagger","//java/com/bdl/latex","//java/com/bdl/latex/core","//java/com/bdl/latex/graphics:common",],)
java/com/bdl/latex/android/AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bdl.latex.android">
<uses-sdk android:minSdkVersion="28"/>
</manifest>
java/com/bdl/latex/android/demo/BUILD:
- 应用程序的根目录...也许这可以与演示/应用程序包结合使用,但现在我正在遵循二进制和库目标所在的 bazel android 教程中的模式单独的包与单独的 AndroidManifest.xml
文件。
android_binary(
name = "app",multidex = "native",deps = ["//java/com/bdl/latex/android/demo/app:demo"],)
java/com/bdl/latex/android/demo/AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bdl.latex.android.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="28"
android:targetSdkVersion="28" />
</manifest>
最后是应用程序包:
java/com/bdl/latex/android/demo/app/BUILD:
android_library(
name = "demo",resource_files = glob(["res/**/*"]),visibility = ["//java/com/bdl/latex/android/demo:__subpackages__"],deps = [
"//ext/android:support","//ext/google/dagger","//ext/google/dagger:android","//java/com/bdl/latex/android",)
java/com/bdl/latex/android/demo/app/AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bdl.latex.android.demo.app">
<uses-sdk
android:minSdkVersion="28"
android:targetSdkVersion="28"/>
<application
android:name=".AndroidLatexDemoApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".LaTeXActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
我可能只是理解错了,所以我希望有一个简单的解决方法:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com(将#修改为@)