2015-01-18 4 views
1

문제점이 있습니다. | -SubP1
| -SubP2결과 dex 파일에서 클래스를 제외하십시오.

모두 패키지로 android.media.IRemoteDisplay이 개 스텁 클래스 있습니다
P
:이처럼 보이는 프로젝트의 구조를 가지고있다. 그들은 구현이 다르지만 그건 중요하지 않습니다. Android에서 앱을 실행할 때 시스템 클래스로 대체 될 것입니다.

그러나 문제가 있습니다. dexMerger가 실패하기 때문에 프로젝트를 빌드 할 수 없습니다. 두 개의 충돌하는 클래스가 있다고합니다. 나는 그 오류를 이해할 수 - 결국, 정말이 개 충돌하는 클래스 :

있다하지만이 같은 build.gradle에서이 파일을 제외하려고하면 그것을 할 수 있기 때문에

sourceSets { 
    main { 
     java { 
      srcDir 'src' 
      exclude '**/android/media/**' 
     } 
    } 
} 

컴파일이 '실패 t android.media.IRemoteControlDisplay 클래스를 찾으십시오 (중첩 된 클래스 임).

어떻게 이러한 클래스를 계속 사용할 수 있지만 결과 DEX 파일에서 제외 할 수 있습니까?

DO NOT 문제는 컴파일 된 프로젝트에서 클래스를 제외 할 권리인지하시기 바랍니다 - 그것이 옳은 일이다, 나는 이미 그것을했지만 수동 - 다음 항아리에 SubP1 및 SubP2을 사전 컴파일하여 수동으로 제거를 IRemoteController.class 다음 P.에 그 항아리를 포함하여이 jar 파일에서

나는 또한 해당 솔루션에 만족 수 있습니다 :
1. 빌드 SubP1
2 SubP1.jar
에서 IRemoteControlDisplay.class를 제거 3 . SubP2 빌드
4. IRemoteControlDisplay.cla를 제거합니다. ss from SubP2.jar
5. 종속 항목으로 SubP1.jar 및 SubP2.jar를 P
에 추가하십시오. 6. 빌드 P
가능하면 알려주십시오.

+0

DEX에 포함시키지 않으면 사용하려는 클래스를 찾지 못하기 때문에 앱을 강제 종료하게됩니다. –

+0

왜 특정 폴더/파일뿐만 아니라 폴더 전체를 제외하고 있습니까? – Jim

+0

오이겐, 내가하는 일을 안다. IRemoteControlDisplay는 시스템 패키지 android.media에있는 클래스이기 때문에 응용 프로그램이 강제로 중단되지 않습니다.일반적으로 액세스 할 수는 없지만 액세스해야합니다. 동일한 메소드 서명을 사용하여 스텁 클래스를 작성하여 액세스했습니다. 따라서 앱을 제외하면 앱이 시스템 구현을 호출합니다. BTW, 나는 이미 그것을했다 - 병을 컴파일하고 거기에서 .class 파일을 삭제하고 프로젝트에 그 병들을 포함시킨다. 하지만 이제는 더 자동적으로 유지하려고합니다. –

답변

1

마지막으로, 나는 그것을 할 수있었습니다. 내가 필요로 무엇

런타임 의존하는 대신 컴파일 시간 의존했다. 그래서, SubSubP1 (예를 들어)이라는 SubP1에 대한 서브 모듈을 작성했습니다. android.media.IRemoteDisplay를 SubSubP1로 이동하고 SubP2에 대한 서브 모듈 SubSubP2를 작성하고 스텁 클래스와 동일한 작업을 수행했습니다. 그런 다음 SubP1 및 SubP2에 대해 다음과 같이 나는 의존성을 선언했습니다

dependencies { 
    provided project(':SubP1:SubSubP1') 
} 

dependencies { 
    provided project(':SubP2:SubSubP2') 
} 

을 그리고 그 속임수를 썼는지! Gradle은 클래스를 컴파일하는 대신 런타임에로드 될 것이라고 간주했습니다.

관련 문제