2016-09-20 3 views
0

나는 안드로이드 SDK를 개발입니다 내가 응용 프로그램 자체를 사용하여 타사 SDK의 CLASSE

참조하는 타사 SDK를 사용하려면 내 SDK에

(AAR 파일이나 jar 파일을 할 수 있습니다) 내 자신에 그것을 참조 할 필요없이

com.google.android.gms:play-services-ads:9.4.0 

내가 내 자신의 응용 프로그램에서 플레이 서비스 - 광고의 클래스와 메소드를 사용하려면 : 응용 프로그램의 build.gradle 자체가이 라인이있는 경우 예를 들어

aair

리플렉션을 사용하여 한 가지 방법을 생각했습니다.

다른 방법을 제안 할 수 있습니까?

+0

"뒤에 목적은 무엇입니까 내 자신의 AAR에 참조 할 필요없이 "? 개발자가 'play-services-ads' 의존성을 갖도록 강요하는 것을 피하려고합니까? – CommonsWare

+0

@CommonsWare는 가능한 한 aar/jar 파일 크기를 줄이려고 시도하고 있으며 다른 sdks 의존성을 포함하려고하지 않습니다. –

답변

0

나는 안전한 선택과 간단한 선택이라는 두 가지 선택을 안다.

안전한 방법은 두 개의 라이브러리 모듈을 갖는 것입니다. 하나는 대부분의 라이브러리 코드를 포함합니다. 다른 하나는 첫 번째 라이브러리와 타사 라이브러리에 종속되어 있으며 여기서 타사 라이브러리를 사용하는 코드가있는 곳입니다. 개발자가 타사 라이브러리를 사용하는 코드를 사용하려면 두 번째 라이브러리가 필요합니다. 그렇지 않으면 첫 번째 라이브러리 만 사용합니다.

apply plugin: 'com.android.library' 

dependencies { 
    androidTestCompile 'com.android.support.test:rules:0.5' 
    compile 'com.android.support:support-annotations:24.2.0' 
    provided 'com.squareup.okhttp3:okhttp:3.4.1' 
    androidTestCompile 'com.squareup.okhttp3:okhttp:3.4.1' 
} 

이 OkHttp에 선택적으로 HttpUrlConnection 영리를 추가 할 수 a librarybuild.gradle에서의 비트는 다음과

간단한 방법은 provided 범위를 사용하는 것이다. 개발자가 내 OkHttp 논리를 원한다면 호환 가능한 OkHttp 버전에 대한 자신의 compile 지시문이 있어야합니다. 내 라이브러리에 따라 OkHttp를 가져 오지 않습니다. 그러나 컴파일 시간에 여전히 OkHttp 클래스를 참조 할 수 있습니다.

provided과 위험의 몇 가지가 있습니다 개발자가 당신의 provided 의존성에 대한 compile 지침을 건너

  • 경우, 의존성을 필요로 당신의 논리를 사용하려고하면, 런타임에 충돌하는 클래스 때문에 또는 당신이 필요로하는 방법이 존재하지 않습니다. 리플렉션을 사용하여 앱에 컴파일 된 라이브러리를 감지하려고 시도 할 수 있습니다 (예 : Class.forName(), OkHttp의 항목이 있는지 확인).

  • 앱 개발자가 사용하는 종속성의 버전에 대한 제어 권한이 적을 수 있습니다. 첫 번째 접근 방식에서는 지원하는 버전을 선언하고 앱 개발자가 자신의 compile 문을 사용하여 오버라이드하려고하면 Gradle 경고 및 오류가 표시됩니다. compile 성명의 버전이 provided 성명의 버전과 충돌하는 경우 앱 개발자가 동일한 수준의 알림을 받을지 여부는 확실하지 않습니다.

이 라이브러리는 처음으로 provided을 시도합니다. 지금까지 많은 불만이 없었지만이 도서관은 상당히 새로운 것입니다.

0

어쩌면 나는 당신의 목표를 아주 잘 이해하지 못했을 것입니다.

그러나 사용할 클래스를 참조하지 않으면 어떻게 프로젝트를 컴파일 할 수 있습니까?

단순히 sdk aar를 사용하는 최종 앱 프로젝트에서 play-services-ads 의존성을 선언해야합니다.

또 다른 트릭은 당신처럼, 당신의 SDK의 build.gradle 파일에 의존 "이적"속성을 사용할 수 있다는 것입니다 다음

compile('com.google.android.gms:play-services-ads:[email protected]') { 
    transitive = true; 
}