2016-11-25 63 views
0

我有兩個庫,每個庫中定義了相同的類。然而他們有一些不同的內容(方法/常量)。選擇不同的庫進行編譯和運行時

例如:

庫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

回答

0

添加的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顯示應用程序如何配置爲使用包裝程序庫(它使用最新的庫編譯),但強制將舊庫包含在運行時中。

希望這有助於=)