2011-02-10 21 views
11

所以,我在我的一些項目中有幾個"Utility"風格類。我很好奇,如果我可以將它們移動到一個Android庫項目,其中包含所有或大部分非特定於應用程序的膠水代碼(主要是包裝和界面)。關於Android庫項目,Eclipse/ADT有多聰明?

所以,我的問題是在該庫中不需要的文件會發生什麼情況。我知道Android庫項目基本上只是將他們的代碼複製到另一個項目中,所以如果我說在我的「通用」庫中使用25%的代碼,我的應用程序是否實際上包含所有100%的字節碼,它只是我需要的東西。

我曾與在過去未使用的類在Proguard的一些問題,所以我只是曾經被蛇咬,與現在的ADT怕井繩......

回答

4

不幸的是,當庫是所有項目將增長變得更大 - 即使該庫的大部分內容都未被使用。我通過創建一個應用程序A和一個庫L來自己測試它。如果L是A中使用的庫,那麼classes.dex文件(因此A.apk文件)會增加,如果我添加更多的類 - 即使它們不是用過的。總結:現在,我將創建一個基本的庫,用於某些小型項目,這些項目可能會被許多項目使用,併爲每個新的組件創建一個新的庫,這些新的組件將會變得更大,並且只會被使用由一些項目。新庫的一個很好的候選者將是一個新的UI組件,其中有多個圖像定義在資源中。例如,基礎庫的一個很好的候選者是常用的方法和諸如文件緩存之類的東西。對於Dalvik,編譯後的代碼被壓縮得相當嚴重,您可以看到here.(整個演示實際上很有趣:-)

編輯:如果激活ProGuard,它也會爲您刪除未使用的代碼。默認的proguard.cfg就足夠了。它不會在構建的(默認)調試版上運行,但是當最終的.apk被編譯時。所以它實際上是可能的!

+0

感謝您的好奇心,您是否使用ProGuard進行測試? - 我聽說它可以刪除未使用的類,我很好奇它是如何發揮作用的。我在圖書館裏的大部分東西都是代碼,而不是資源圖片,所以我認爲你說得對,這不是一個大問題。 – camperdave 2011-02-11 01:01:56

0

請注意,Android庫項目在處理資源時也會受到很大影響。 ADT將爲每個庫重建R.java一次,並且每個R.java將包含所有庫的所有資源ID的副本。這裏的核心問題是整個項目都會重新生成資源,並且沒有辦法爲依賴關係「構建jar」,正如普通「庫」所預期的那樣。我們嘗試與OpenFeint集成,並且處理各種圖書館和依賴關係。我想我們最終只是將所有OpenFeint源代碼和資源文件合併到我們自己的項目中,並放棄了「庫」項目,因爲它提供的價值不大。

Android庫項目是一種在項目之間共享代碼的笨重方式,並且有許多缺點。我發現用一個庫項目完成的一切都可以通過符號鏈接(符號鏈接源代碼到兩個項目)來完成。我還沒有找到一個用例,其中Android Library項目提供了一些不易用其他較脆弱手段複製的內容。

1

我已經成功地使用了3級深度的Android庫項目,儘管它有點痛苦。主要用例是當您想要在幾個項目中共享一組資源和類時。由於我使用版本控制系統,我寧願不使用符號鏈接。