2016-12-03 98 views
0

我的應用依賴於託管在服務器存儲庫中的遠程包。該軟件包是獨立維護的。Android如何用本地類覆蓋遠程包中的類

現在我想擴展一個遠程包中的類。我創建了同一個類的本地副本,並對其進行了修改以用於實驗目的。通過這種方式,我不需要修改庫,將其推送到存儲庫並在每個調試周期內編譯我的應用程序。

但是,應用程序編譯仍然使用遠程類而不是本地擴展副本。並報告錯誤。

error: cannot find symbol variable XXX_XX1 
error: cannot find symbol variable XXX_XX2 

這些變量XXX_XX1和XXX_XX2是新添加到本地CLASSA

庫進行遠程回購:org.example.packagename.datamodel.classA

本地源路徑 \機器人\程序\。 src \ mock \ java \ org \ example \ packagename \ datamodel \ classA.java

我的問題是如何讓Android Studio在編譯期間使用classA的本地副本而不是遠程副本?

UPDATE

仔細檢查後,只在單元測試文件夾報告錯誤,這些類。主程序類不報告錯誤(但是,也許它會在編譯單元測試類之後)。

Error:Execution failed for task ':app:compileMockDebugUnitTestJavaWithJavac'. Compilation failed; see the compiler error output for details. 
+0

你是否擁有圖書館? – Karakuri

+0

@Karakuri我是一位貢獻者,但不是唯一的擁有者。 – HarryQ

+0

因此,您試圖測試您對庫所做的更改,但爲此,您需要根據本地版本進行編譯,而不是從jcenter/maven central/etc中獲得的已發佈版本。我的理解正確嗎? – Karakuri

回答

0

你應該程度在庫中的類(使用成分也是一種選擇,如果類是final)

public class LocalClassA extends RemoteClassA { 
} 

都可以被命名爲ClassA,因爲他們會在不同的包,但這可能會導致混淆。

+0

目前,classA在應用程序中被廣泛使用,因此將它們放入不同的包中需要更改其他十幾個文件中的依賴關係。我試圖實現的就像選擇一種構建風格,但在本地classA和遠程classA之間。 – HarryQ

0

一個相當直接的方法就是將模塊添加到您的測試項目,其源文件是您的庫的修改版本。然後,您將刪除二進制依賴關係,並將其替換爲對此新模塊的依賴關係。它應該是這個樣子......

settings.gradle添加

include ':libraryName' 
project(':libraryName').projectDir = new File('/path/to/library/sources') 

build.gradle的應用

// compile 'groupId:artifactId:version' // <-- comment out the published binary 
compile project(':shared') // <-- add your local module 

做一個gradle這個同步,你應該是在良好的狀態。只要記住而不是完成後在您的測試項目中提交這些更改。


另一種方法我已在過去是使用一個Maven插件的gradle到圖書館發佈到我的本地倉庫(用新版本的名稱)。然後在測試項目中我將更新版本名稱,並添加

repositories { 
    mavenLocal() 
} 

這可能是一個比較複雜一點,但還沒有與模塊亂搞的優勢 - you're二進制依賴仍然拉動,它只是從你的Maven倉庫本地提供,而不是從網上下載。您只需要記住而不是就可以提交對庫源所做的任何更改並生成與本地發佈相關的文件。