2017-04-17 1 views
3

구현중인 앱의 레이아웃 항목에 액세스해야하는 라이브러리를 개발 중입니다. 내가 그것을하는 방법을 아는 유일한 방법은 반성과 함께이다.Android 라이브러리에서 앱 R 클래스에 액세스

public MyLibraryAPI(String packageName) { 
    Class appR = Class.forName(String.format("%s.R", packageName)); 
    ... 
} 

을 그리고 개발자는 생성자의 매개 변수로 자신의 패키지 이름과 라이브러리를 인스턴스화 것이다 : 즉,이처럼 내 라이브러리 API에 대한 생성자를 만드는 경우.

필자가 궁극적으로 필요로하는 것은 내 내부 클래스에 개발자 레이아웃 (.xml 파일)에 사용 된 Android보기 (ID와 유형 모두)를 알리는 것입니다. 리플렉션없이 이것을 달성하고 성능 오버 헤드를 피할 수있는 방법이 있습니까? 확신 할 수는 없지만, 내가 눈여겨 보지 못하는 것을 보는 전문가가있는 경우에 대비하여 묻습니다.

편집 : 또한 proguard는 기본적으로 보호 코드를 난독 처리하지만 결과적으로 JVM에 런타임시 반영을 수행 할 수있는 수단을 제공하지 못하므로 리플렉션을 사용하는 경우 개발자에게 방향을 바꾸도록 요청해야합니다 Rx 클래스에 대한 proguard 모호성을 제거합니다.

+1

주석 처리기를 사용할 수 있습니까? Butterknife의 작동 방식과 비슷한 것이 있습니까? –

+0

예, 주석 처리를 사용하여 실행을 컴파일 타임으로 이동할 수 있습니다. 그러나 바인딩에 대한 주석을 제공해야하므로 개발자의 관점에서 볼 때 더 많은 노력이 필요합니다. 아니면 내가 틀렸어? 나는 아직 논쟁 중이고, 나는 어느 쪽에도 기대지 않는다. 어쨌든 답장을 보내 주셔서 감사합니다. – NitroNbg

답변

1

Android에서의 리플렉션은 비용이 많이 듭니다. Roboguice과 같이 잘 의미 있고 인기있는 라이브러리의 일부는 리플렉션의 성능 비용 때문에 부분적으로 쓰러졌습니다.

나는 어떤 종류의 코드 생성이 올바른 해결책이라고 생각합니다. Dagger 2, Butter KnifeData Binding Library은 코드 생성을 사용하는 Android 라이브러리의 성공적인 사례입니다. 데이터 바인딩 라이브러리는 XML에 대한 검사를 수행하기 때문에 빌드의 해당 단계에서 코드 생성 라이브러리에 사용할 수 있어야하며 이에 대한 구현을 기반으로 할 수 있습니다. 여기에 source jars at Maven Central에 대한 링크가 있습니다.

그렇기 때문에 사용의 용이성과 구현의 어려움 사이에는 약간의 타협이있을 것입니다. 소비자가 주석을 사용하여 수업에 주석을 달도록 강요하면 사용하기가 어려워 지지만 구현하기가 훨씬 쉬울 것입니다. XML을 검사하고 생성 된 R 파일을 제한하고 코드 생성을 제한하면 작업이 훨씬 어려워 질 것입니다. 반면에 주석을 사용하는 것은 평범한 일이 아니며 사용자에게는 그다지 문제가되지 않을 수 있습니다.

행운을 빈다.

관련 문제