2017-05-09 74 views
0

說,一個Android應用程序使用的jar庫,當庫被指定爲依賴一切正常:Android的工作室:如何編譯定製類,但仍使用模塊依賴

dependencies { 
    ... 
    ... 
    compile 'org.example:example:1.1.1' 
    ... 
} 

但是:需要調整org.example代碼中的其中一個類。

一種方法是獲取源代碼並將所有這些文件放在java文件夾中,然後刪除該模塊。當調整完成後,整個庫將被編譯。

另一種方法是對.jar文件中的.class文件進行調整,編譯和替換。

這兩種方法都有其缺點。

我的問題是:是否有更簡單的方法來調整庫中的代碼?

,當我試圖剛剛創建的包,放置在需要更換成java文件夾中的類,我得到了一個錯誤:

Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lorg/example/ClassNeedingChange;

如果有竅門能讓代碼Java文件夾我只是想知道重寫庫jar文件中的內容。

附加信息:

雖然上面具體沒有說明,需要的調整埋在圖書館和被庫的代碼中引用的類;我不直接打電話給他。對於需要調整的類是我的代碼(只有我的代碼)直接調用的類的簡單情況,那麼使用Java構造擴展類將是一件簡單的事情。但對於這個簡單的例子,我不需要發表這個問題。

+0

「我只是想知道是否有一個技巧讓Java文件夾中的代碼覆蓋庫jar文件中的內容。」 - 從JAR文件中刪除類。雖然,恕我直言,唯一可維護的選項是子類路徑或分叉庫(「獲得源代碼...」),儘管我會把它放在項目的一個單獨的模塊中,而不是直接放在項目本身。 – CommonsWare

+0

這樣做會使未來的維護成爲脖子上的痛苦。如果圖書館改變怎麼辦?你將不得不更新這個。你也可以在gradle中本地編譯它,並告訴gradle尋找本地版本,但是仍然會給出相同的維護問題。 – MaxPower

+0

創建一個PR來反映lib的行爲,讓它達到你想要的行爲?那麼每個人都會受益。 – AutonomousApps

回答

1

擴展需要在代碼中調整的類,並覆蓋適當的方法。

Class A extends TweakMe { 

@Override 
public void someTweakedMethod() { 
    //Do stuff 
    } 
} 
+0

如果該類是最終的或方法是私人的,那麼這將不起作用。 – AutonomousApps

+0

如果需要調整的類是從庫的各個其他部分使用的,它也不起作用;那些其他用途不會知道「A」,並會使用「TweakMe」的默認功能。 – Dale

相關問題