Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中有条件地编译JAR?_Android_Gradle_Build_Compilation_Lint - Fatal编程技术网

如何在Android中有条件地编译JAR?

如何在Android中有条件地编译JAR?,android,gradle,build,compilation,lint,Android,Gradle,Build,Compilation,Lint,我试图在androidstudio中创建一个有条件的构建,如果特定发行版不需要,我可以通过删除任何多余的库依赖项来减小生成的APK的大小 我得到了一些代码,大致如下所示: public class MyClass { /* Static Declarations. */ public static final boolean USE_LIBRARY = false; public void doSomething() { // Are we using

我试图在androidstudio中创建一个有条件的构建,如果特定发行版不需要,我可以通过删除任何多余的库依赖项来减小生成的APK的大小

我得到了一些代码,大致如下所示:

public class MyClass {

    /* Static Declarations. */
    public static final boolean USE_LIBRARY = false;

    public void doSomething() {
        // Are we using the library?    
        if(MyClass.USE_LIBRARY) {
            // Do something with the library that we'd define in my build.gradle.
            com.some.gradle.library.MyLibrary.doSomethingWithLibrary();
        }
        else {
            // Do something else.
        }
    }

}
如果我从gradle依赖项中删除
com.some.gradle.library
,我会收到编译错误,指示无法编译上述代码。如您所见,只要
USE_LIBRARY
保持为false,我们就不需要引用
MyLibrary
;甚至在实例化时也没有,因为它没有引用导入;这些仅在运行时被占用

我可能应该注意到,在实践中,
USE\u LIBRARY
是一个程序生成的常量,与应用程序的
BuildConfig.java
有关

编译器肯定可以确定这段代码可以优化吗?这是我可以处理的某种预处理器检查吗

我试图在androidstudio中创建一个有条件的构建,如果特定发行版不需要,我可以通过删除任何多余的库依赖项来减小生成的APK的大小

步骤#1:为“特定分销”定义产品风味。为了回答这个问题,我将其称为
foo
。对于其他发行版,您还需要其他产品风格

步骤#2:将拉入此JAR的
compile
语句更改为
foocomile
语句,因此它将仅用于
foo
构建

步骤3:在每个产品风格的源集中(例如,
src/foo/java/
)有一个版本的
MyClass
,其中
foo
中的版本引用库,而其他版本则不引用库

我试图在androidstudio中创建一个有条件的构建,如果特定发行版不需要,我可以通过删除任何多余的库依赖项来减小生成的APK的大小

步骤#1:为“特定分销”定义产品风味。为了回答这个问题,我将其称为
foo
。对于其他发行版,您还需要其他产品风格

步骤#2:将拉入此JAR的
compile
语句更改为
foocomile
语句,因此它将仅用于
foo
构建


步骤3:在每个产品风格的源集中(例如,
src/foo/java/
)有一个版本的
MyClass
,其中
foo
中的一个引用库,而其他的不引用库。

我认为您可能混淆了java运行时和编译时进程的行为

在运行时,可以有条件地执行代码,并且可以忽略库调用,但在编译时,所有代码都会被处理

通过在编译时引用库,依赖关系在编译时是必需的


然而,有一个叫做Proguard的实用程序,它是android构建系统的一部分,可以从apk中删除未使用的字节码。另外,请选中@commonware answer,如果您根本没有在不同版本中使用该库,那么构建类型允许您在没有该库的情况下创建apk的单独版本

我认为您可能会混淆Java运行时和编译时进程的行为

在运行时,可以有条件地执行代码,并且可以忽略库调用,但在编译时,所有代码都会被处理

通过在编译时引用库,依赖关系在编译时是必需的


然而,有一个叫做Proguard的实用程序,它是android构建系统的一部分,可以从apk中删除未使用的字节码。此外,请选中@commonware answer,如果您根本没有在其他版本中使用该库,那么构建类型允许您创建apk的单独版本,而不需要该库找到解决方案。我采取的上述方法是可行的,前提是您可以保证在运行时不会与任何库代码交互;这包括确保没有运行时类扩展任何父类或实现作为库一部分的接口。我能够通过使用验证代码是否已被删除

“诀窍”是将库组件声明为
提供的
,用于您想要假装库对您可用的构建变体,并声明为
编译
,用于您想要导出库的时候

i、 e.使用两个构建变量
libraryVariant
emptyVariant
,通过
buildConfigField'boolean',Use_LIBRARY',X',以编程方式切换
Use_LIBRARY
的值。然后,您可以按如下方式定义依赖项:

dependencies {
    // Actually package the library with the compiled APK.
    libraryVariantCompile  "com.some.gradle.library:-1"
    // Ignore the library; just please the linting process.
    emptyVariantProvided   "com.some.gradle.library:-1"
}

找到了解决办法。我采取的上述方法是可行的,前提是您可以保证在运行时不会与任何库代码交互;这包括确保没有运行时类扩展任何父类或实现作为库一部分的接口。我能够通过使用验证代码是否已被删除

“诀窍”是将库组件声明为
提供的
,用于您想要假装库对您可用的构建变体,并声明为
编译
,用于您想要导出库的时候

i、 e.使用两个构建变量
libraryVariant
emptyVariant
,通过
buildConfigField'boolean',Use_LIBRARY',X',以编程方式切换
Use_LIBRARY
的值。然后,您可以按如下方式定义依赖项:

dependencies {
    // Actually package the library with the compiled APK.
    libraryVariantCompile  "com.some.gradle.library:-1"
    // Ignore the library; just please the linting process.
    emptyVariantProvided   "com.some.gradle.library:-1"
}

这听起来很有希望。我有第一阶段和第二阶段,但我不知道第三阶段甚至是一个选项!我会让你知道我是怎么得到你的