我可以在 Gradle 中设置变量并在编译时将其传递给 Java 吗?

Can I set a variable in Gradle and pass it to Java at compile time?

提问人:Bungles 提问时间:5/15/2021 最后编辑:derpirscherBungles 更新时间:5/15/2021 访问量:494

问:

我从 Android Studio 和 Visual Studio 构建相同的 Android 代码,我需要在 Java 代码中 #define,以便根据执行构建的环境以不同的方式编译一行代码。当 Java 没有 #defines 时,我该怎么做?

看来,最好的方法是根据构建环境在 Gradle 中定义一个变量,并让 Java 代码在编译时使用该变量来切换构建哪一行代码。不幸的是,我无法弄清楚如何做到这一点。

我需要类似于以下伪代码的功能

#ifdef $(VisualStudio) 
  LoadLibrary("libVS.so"); 
#elif $(AndroidStudio) 
  LoadLibrary("libAS.so"); 
#endif

这真的可能吗?有没有其他/更好的方法可以实现我的目标?

visual-studio android-studio android-gradle-plugin android-build

评论

0赞 derpirscher 5/15/2021
“以不同的方式编译一行”是什么意思。你能举个例子吗?是否可以在 android studio 中使用不同的构建变体来解决这个问题?
0赞 Bungles 5/15/2021
#ifdef $(VisualStudio) LoadLibrary(libVS.so);#elif $(AndroidStudio) LoadLibrary(libAS.so);#endif
0赞 Bungles 5/15/2021
为什么注释不能有换行符?

答:

1赞 derpirscher 5/15/2021 #1

我不熟悉在 Visual Studio 中构建 java Android 应用程序,但在 android studio 中使用 Gradle,您可能会使用不同的构建变体解决此类需求。所以我想这应该也可以使用 VS 和 Gradle。

一种可能性是定义一个类来保存库的名称(也可能有其他值)Environment

public final class Environment {
  public static final String LIBRARY= "libAS.so";
}

然后,在您的类中,按给定名称加载库

   LoadLibrary (Environment.LIBRARY);

然后,您可以为 vs code 生成添加另一个生成变体。对于不同的构建变体,您可以在构建期间使用不同版本的文件。只需为变体创建一个子文件夹,然后创建一个不同的类,保存正确的文件名。Environment

public final class Environment {
  public static final String LIBRARY= "libVS.so";
}

现在,根据您选择构建的变体,将使用相应的类,从而加载正确的库。Environment

这种方法的一个缺点是,您可能需要复制所有现有的构建变体。但另一方面,你可以有一个点,你可以把所有环境特定的值放在其中,而不必担心在不同的 java 文件中使用正确的值,因为你没有任何条件编译。

评论

0赞 Bungles 5/15/2021
我已经将变体用于其他目的,因此这种方法将导致变体/口味的大量扩散。
0赞 derpirscher 5/15/2021
我知道,创建许多新变体可能是一项繁琐的任务。因此,也许您可以利用这种方法来替换库的名称,例如基于环境变量 stackoverflow.com/questions/33464577/...
0赞 derpirscher 5/15/2021
您甚至可以将那里的替换与我答案的环境类方法结合起来。因此,您仍然可以使用一个中心类来保存您的环境相关值,并且替换的 gradle 任务只需通过单个文件