2016-11-08 41 views
0

我們開發了一個使用Java的android庫(aar),它依賴於android支持庫v4。實際上,我們已經擴展了ViewPagerandroid.support.v4.view.ViewPager)類並在我們的圖書館GUI中使用它。如何在Android中防止多重Dex

我們已經在庫上應用了proguard,它和我們的測試應用程序一起工作正常,但是我們有一個客戶已經開發了本地C++的android應用程序,他們將把我們的組件集成到他們的應用程序中,建立。

他們收到com.android.dex.DexIndexOverflowException構建這是一個標誌,有超過幾乎64K的方法,允許在一個單一的dex

他們要求我們使用更少或更小的依賴關係,因爲他們必須將我們的組件依賴包括到他們的構建設置中,他們的建議之一是我們應該從android支持源中提取ViewPager並將其放入我們的組件源代碼中。

現在的問題是

  1. 如果我們提取出ViewPager Android的源,並把它添加到我們的 庫的源代碼,然後將它減少的量的方法,以防止 上述異常?這是一個很好的做法嗎?
  2. 解決此問題的最佳方法是什麼?

感謝

回答

3

如果我們提取出ViewPager Android的源,並把它添加到我們的源代碼庫,然後將它減少的量的方法,以防止上述異常?

可能不是,至少release構建。您的客戶應該已經配置了ProGuard,它可以識別並刪除通過庫引入的不必要的代碼。

這是一個很好的做法嗎?

不,您的客戶應該比這更清楚。

解決此問題的最佳方法是什麼?

大多數情況下,這不是你的問題。這是你的客戶的問題。您的客戶在指責您,但您的問題中沒有證據表明您的圖書館是客戶的DEX方法參考的重要來源。

你的客戶應該配置ProGuard,你的客戶應該使用Android Studio 2.2+中的APK分析器來查看他們的方法引用來自哪裏。

您,在您的圖書館,可以:

  • 嘗試使用更有針對性的依賴比support-v4ViewPager本身在support-core-ui神器中。但是,如果您使用FragmentPagerAdapterFragmentStatePagerAdapter,此外,您還需要support-fragment(如果您使用的是這些類的v4版)或support-v13(如果您使用的是這些類的v13版)。

  • 在您創建的使用您的庫的某個演示項目上使用APK分析器,以便您可以查看您的庫使用了多少個DEX方法引用,以查看您是否真的是此類引用的重要來源。

  • 爲您的客戶建議ProGuard設置,以保持您需要的類別,以幫助他們有效地使用ProGuard與他們的應用程序。

0

您可以在build.gradle文件中設置jumboMode這樣的:

dexOptions { 
    jumboMode true 
} 

此選項將允許你在你的.dex文件32it寬字符串引用。因此,您可以在項目中使用2^32個引用的字符串。

希望它有幫助。

+0

這個答案如何回答OP的問題?你讀過了嗎? –

0

可用選項有:

  1. 是的,您可以從支持庫中提取ViewPagerViewPager從支持庫中導入一些也需要提取的文件。這將減少方法數量,並有顯着差異。
  2. 您還可以在build.gradle文件的依賴關係中使用exclude參數。
 
    compile ('com.android.support:recyclerview-v7:+') { 
     exclude module: 'support-v4' 
    }