2016-11-19 2 views
0

나는 logging (나도 개발 한) 용 별도 라이브러리를 사용하고있는 하나의 Android open source library project을 보유하고 있습니다.라이브러리 프로젝트의 종속성 처리

로깅 라이브러리는 그다지 중요하지 않지만 개발 및 디버깅을 더 쉽게 만듭니다 (나와 메인 라이브러리 사용자 모두). 두 라이브러리를 모두 사용하려면 gradle (및 Jitpack)을 사용하고 있습니다. 이제 로깅 라이브러리에는 실제로 매니페스트에서 몇 가지 추가 권한이 있습니다 (로그에 파일을 쓰는 경우, 기본 라이브러리에는 필요하지 않음).

사용자가 추가 권한을 제거하도록 요청했습니다. 로깅 라이브러리를 제거하거나 로깅 라이브러리 자체의 기능을 변경하지 않으면 어떻게 할 수 있는지 알 수 없습니다. 나는 심지어 로깅 라이브러리가 전혀 필요하지 않은 사람들이 거의 없다는 사실을 깨달았습니다. 사용자가 로깅 라이브러리를 build.gradle에 포함시키지 않으면 가져올 수없는 것처럼 선택적으로 만들 수있는 방법이 있습니다. 나는 탐지 할 수 있고 로깅 기능을 호출하지 않을 수 있습니까?

혼란 스럽지만 나는 두 라이브러리를 분리하는 방법을 알고 싶습니다. 실제로 어떤 대중적인 도서관에서 그런보기에 관하여 당신이 알고있는 경우에 저에게 알려주십시오.

+0

[Material Dialogs] (https://github.com/afollestad/material-dialogs)와 같은 라이브러리의 두 가지 버전을 만들 수 없으며 – Max

답변

0

네, 아마도 두 가지 방법을 사용할 수 있습니다.

부분 1. 사용 권한 매니페스트 권한 정보

. 매우 간단합니다. 로깅 라이브러리에 권한을 추가하지 말고 런타임에 확인하십시오. 이처럼 :

if (context.checkPermission(
       Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       android.os.Process.myPid(), 
       Process.myUid()) == PackageManager.PERMISSION_GRANTED) { 
     carry on with your write to disk operation ... 
} 

다음 문서에 라이브러리를 사용하는 개발자는 로컬 로깅을하고자하는 경우, 그들은 매니페스트에 WRITE_EXTERNAL_STORAGE를 선언해야한다는 쓰기

. lib 디렉토리

모든 여기 거 쓰기있어 가져 오기

2 부 (하지)를하지 테스트 마음과 100 %입니다. 약간의 오류가있을 수 있지만, 잘하면 솔리드 한 아이디어를 전달할 것입니다.

먼저 NoobCameraFlash 라이브러리에서 파일에 LumberJackcompile 대신 provided으로 정의합니다. 그러면 컴파일러가 LumberJack에 대해 알게되어 컴파일이 통과 할 수 있지만 실제 빌드에는 포함되지 않습니다.

그런 다음 NoobCameraFlash 라이브러리에 라이브러리 funcionalities의 미러 인 클래스를 작성하십시오. 즉, 방법을 의미합니다 d(String, String), e(String, String)

다음이 미러 클래스에서 당신은 lumberjack이 실제로 사용 가능한지 확인하기 위해 다음과 같이합니다.

private static boolean lumberJackAvailable = false; 
private static boolean lumberJackTested = false; 
private static boolean isLumberJackAvailable() { 
    if(lumberJackTested) return lumberJackAvailable; 
    lumberJackTested = true; 
    try { 
     if(Class.forName("") != null) { 
      lumberJackAvailable = true; 
     } 
    } catch(Throwable e){ 
     // ClassNotFoundException, LinkageError, ExceptionInInitializerError 
    } 
    return lumberJackAvailable; 
} 

public static LumberJackMirror create() { 
    // could also be a singleton 
    if(isLumberJackAvailable() return new LumberJackMirror(); 
    else return null; 
} 

물론 if(lumberJackMirror != null)을 확인해야합니다. 당신이 볼 수 있듯이 일을하는 가장 직접적인 방법은 아닙니다.

조금 더 간단하게하는 또 다른 방법은 다른 라이브러리에 인터페이스를 만드는 것입니다. 미러와 실제 LumberJack이 모두 구현되어 공장을 사용하면 null을 모두 사용하지 않고 인터페이스의 빈 구현을 반환 할 수 있습니다. 시간.

또한 개발자가 로깅 기능을 원할 경우 build.gradle에 추가해야한다는 문서에 포함하십시오. 그 일의 또 다른 일반적인 방법 compile 'your_groud_id:lumberjack:version'

편집

같은 뭔가가 NoobCameraFlash 초기화 코드에 명시하는 것입니다. 같은 뭔가 :

NoobCameraFlash.config() 
     .setLogger(new LumberJack()); 

그래서 그 나무꾼 대신 Class를 통해 확인에 대해 알고 개발자를 강제로. 그러나 그것은 단지 static 메소드가 아닌 LumberJack 버전이 필요하다는 것을 의미합니다.

행복 코딩] =

end_edit

그러나 희망 단지 권한 제거가 충분하고이 part.2 할 필요가 없습니다.

+0

다른 클래스 라이브러리에는'Class.forName (String) '당신이 그 수업을 지키기 위해 소비자 프로 가드 규칙을 추가하지 않는다면. –

+0

@ JaredRummler 당신이 옳습니다. @noob은 또한 ProGuard 규칙을 추가하기 위해 devs에게 명시 적으로 알려야합니다. 필자는 개인적으로 일부 로거 인터페이스가있는 'config()'옵션이 가장 깨끗하다고 ​​믿습니다. 하지만 Logger 라이브러리에 리팩터링을 추가하는 방법을 알 수 있습니다. – Budius