选择不同的库进行编译和运行时

问题描述:

我有两个库,每个库中定义了相同的类。然而他们有一些不同的内容(方法/常量)。选择不同的库进行编译和运行时

例如:

库1:

package com.test.package; 
Class A { 
    // only method signatures 
    public void methodA() { 
    } 

    public void methodB() { 
    } 
} 

库2:

package com.test.package; 
Class A { 
    public void methodA() { 
      // some logic that MUST be executed to provide backward compatibility 
    } 
} 

我的应用程序使用库1和库2,并且其中具有com.test.package.ClassA设备上运行,但com.test.package.ClassA.methodB()将只存在于框架中的新版本中。说,我需要库1来编译我的应用程序,库2需要执行methodA()的不同实现。

我试图在Android Studio中使用.jar和.aar库格式来做到这一点,但他们都没有为我工作。

是否可以在Android Studio项目中设置此配置?

我建立这两个库1和2,我不能在图书馆2

添加的methodB()对于一个简单的Java应用程序,你可以通过取消链接的compileruntime配置做到这一点。我建立了一个示例资源库here

该想法显示在this commit中,但可以描述为手动重置runtime配置,以使其不包含compile配置的内容。完成后,您可以将运行时库变体包含在runtime配置中。

应用程序的build.gradle变成类似:

apply plugin: 'application' 

mainClassName = 'my.package.MyAppClass' 

configurations.runtime.extendsFrom = [] // Reset runtime configuration 

dependencies { 
    compile 'my.group:my.artifact:2.0' // Library 1, with the new method 
    runtime 'my.group:my.artifact:1.0' // Library 2, without the method 
} 

对于Android,这可能是一个更复杂一点。问题在于Android没有配置runtime(因为除非您使用Robolectric或其他类似软件,否则不会在计算机上执行它)。

我认为有几种解决方法可以使用,但最初的建议是创建一个封装库,以抽象出对其他库的依赖关系。这个包装库可以用最新的库版本(库1,用新方法)编译。然后,您可以包括在Android应用中的包装库,同时将其设置为一个非过渡依赖,包括其他库版本:

dependencies { 
    compile 'my.group:my.wrapped.artifact:0.1' { 
     transitive = false // Don't include dependencies of the wrapper 
          // i.e., don't include version 2.0 of the lib. 
    } 
    compile 'my.group:my.artifact:1.0' 
} 

这应该通过设置依赖非传递摇篮不会因为工作递归地包含包装器库的依赖关系,因此用于编译包装器的版本不包括在APK中(理论上)。因此,您可以添加旧版本而不会导致冲突。

一个示例在Android branch下设置在同一个存储库中。首先,创建两个Java库。然后用an Android library is created来包装编译时库。一个example activity is created显示如何使用包装库使用编译时库。然后,latest commit显示应用程序如何配置为使用包装程序库(它使用最新的库编译),但强制将旧库包含在运行时中。

希望这有助于=)