Android SDK Tool 20 버전 이상부터 Library Project의 AndroidManifest.xml 의 내용을 애플리케이션 프로젝트의 Manifest에 병합할 수 있게 되었다 (관련 링크 : http://tools.android.com/download/adt-20-preview)


  • Build System
    • Automatic merging of library project manifest files into the including project's manifest. Enable with the manifestmerger.enabled property.


이전에는 Library Project의 매니페스트에 서비스나 액티비티, 퍼미션 등을 등록하더라도 해당 Library Project를 사용하는 애플리케이션 프로젝트에는 아무런 적용이 되지 않았는데, ADT 20 부터는 이를 활용할 수 있게 된것이다.


지금 소마에서 개발하고 있는 Salina의 안드로이드 SDK에서 퍼미션이나, 서비스 사용을 위해서 애플리케이션 프로젝트에서 이래저래 설정해줘야 할 것들이 많았는데, 이것으로 SDK의 적용이 아주 쉬워졌다. 라이브러리를 개발하는 입장에서는 아주 큰 이점이 아닌가 싶다.


라이브러리 프로젝트와 애플리케이션 프로젝트의 Manifest의 내용이 중복되는 경우의 충돌은 확인해 봐야할 듯 하다.


적용방법은 간단하다.  프로젝트의 설정파일(project.preference)에서 manifestmerger.enabled=true 만 추가해주면 적용된다.

현재 진행 중인 Salina 프로젝트에서 나름 국제화를 적용하겠다고 상수 스트링을 values 리소스로 빼두고

final 키워드를 제거 후 멤버 변수 위치 그대로 두고 getString(int resourceId)를 호출하니 NullPointerException 발생


프로그래밍계의 지식인  StackOverflow느님께서 역시 해결책을 주셨다.


원인은 액티비티가 초기화되기 전에 리소스를 사용하려고 하면 NullPointerException이 발생할 수 있다고 한다.


즉 액티비티에서 사용하는 getString()은 Resources 객체의 getString()을 래핑한 메서드이고.

Resources는 Context 객체로부터 얻을 수 있는데, getString()을 풀어보면

getContext().getResources().getString()이 되는 셈이다.


따라서 해결책은 멤버 필드에서 바로 초기화를 하는 대신 onCreate 이 후 시점에 해야한다.

그냥 onCreate 안에서 하면 된다.

혹은 Application 클래스를 상속한 커스텀 Application을 만들고 거기에 static 메서드를 이용해서 컨텍스트를 통해 리소스를 가져오는 방법이다.

액티비티는 해당 액티비티가 onCreate 되어서야 초기화 후에 context를 갖지만 애플리케이션 단위에서는 처음 앱이 실행될 때 정보를 가지고 있기 때문에 가능하다.

+ Recent posts