2016-11-08 4 views
0

우리는 자바를 사용하여 안드로이드 라이브러리 (aar)를 개발했으며 안드로이드 지원 라이브러리 v4에 의존합니다. 실제로 ViewPager (android.support.v4.view.ViewPager) 클래스를 확장하여 라이브러리의 GUI에서 사용했습니다.안드로이드에서 멀티 덱스를 방지하는 방법

우리는 라이브러리에 proguard를 적용했으며 테스트 응용 프로그램에서도 잘 작동하지만 네이티브 C++로 안드로이드 응용 프로그램을 개발 한 고객이 있으며 응용 프로그램에 구성 요소를 통합하려고합니다. 짓다.

그들은 하나의 dex에 허용되는 거의 64K 개 이상의 메소드를 가지고 있다는 표시 인 빌드에서 com.android.dex.DexIndexOverflowException을 수신합니다.

그들은 빌드 설정에 구성 요소 종속성을 포함해야하므로 더 적은 또는 더 적은 종속성을 사용하도록 요청했으며 제안 사항 중 하나는 안드로이드 지원 소스에서 ViewPager을 추출하여 구성 요소 소스 코드에 넣어야한다는 것입니다. 우리는 다음이 언급 한 예외를 방지 에 방법의 양을 줄일 수 안드로이드 소스에서 ViewPager를 추출하고 우리의 라이브러리 소스 코드에 추가하는 경우

이제 질문은

  1. 이다? 그렇게하는 것이 좋은 습관입니까?
  2. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

감사

답변

3

우리는 안드로이드 소스에서 ViewPager를 추출하고 우리의 라이브러리 소스 코드에 추가 할 경우이 언급 한 예외를 방지하는 방법의 양을 줄일 것인가?

아마도 적어도 release 빌드의 경우. 고객은 ProGuard를 구성해야합니다. ProGuard는 라이브러리를 통해 가져온 불필요한 코드를 식별하고 제거합니다.

그렇게하는 것이 좋습니다.

아니요. 고객은 그 이상을 알아야합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

대부분 문제는 아닙니다. 고객의 문제입니다. 귀하의 고객이 당신을 비난하고 있지만, 귀하의 도서관이 고객의 DEX 방법 참조의 중요한 출처라는 귀하의 질문에 대한 증거는 없습니다.

귀하의 고객은 ProGuard를 구성해야하며 고객은 Android Studio 2.2 이상에서 APK 분석기를 사용하여 메소드 참조의 출처를 확인해야합니다.

당신은 당신의 라이브러리에, 수 :

  • 봅니다 support-v4보다 더 집중 종속성을 사용합니다. ViewPager 자체는 support-core-ui 인공물에 있습니다.그러나 FragmentPagerAdapter 또는 FragmentStatePagerAdapter을 사용하는 경우 support-fragment (해당 클래스의 v4 버전을 사용하는 경우) 또는 support-v13 (해당 클래스의 v13 버전을 사용하는 경우) 중 하나가 필요합니다.

  • 라이브러리를 사용하는 몇 가지 데모 프로젝트에서 APK Analyzer를 사용하면 라이브러리에서 사용하는 DEX 메서드 참조의 수를 볼 수 있으므로 실제로 이러한 참조의 중요한 출처인지 확인할 수 있습니다.

  • 자신의 앱에 ProGuard를 효과적으로 사용하는 데 필요한 필수 수업을 계속 유지할 수있는 ProGuard 설정을 제안하십시오.

0

이처럼 build.gradle 파일에 jumboMode을 설정할 수 있습니다

dexOptions { 
    jumboMode true 
} 

이 옵션은 당신이 당신의 .dex 파일에 32it 넓은 문자열 참조가있을 수 있습니다. 따라서 프로젝트에 2^32 개의 참조 문자열을 가질 수 있습니다.

희망이 있습니다.

+0

이 답변은 OP 질문에 어떻게 대답합니까? 전혀 읽었습니까? –

0

가능한 옵션은 다음과 같습니다

  1. 예, 지원 라이브러리에서 ViewPager를 추출 할 수 있습니다. ViewPager 추출해야하는 파일도 지원 라이브러리에서 가져옵니다. 이로써 메소드 수를 현저하게 줄입니다.
  2. 파일의 종속성에 exclude 매개 변수를 사용할 수도 있습니다.
 
    compile ('com.android.support:recyclerview-v7:+') { 
     exclude module: 'support-v4' 
    }