일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 카페오냥
- 타이쿤
- Kotlin
- firebase
- GIT
- java
- submodule sourcetree
- github
- gitlab submodule
- 안드로이드개발
- Android
- 2d게임
- 유니티
- 서브모듈 pull
- 쿼터뷰
- 안드로이이드 submodule
- 내 맘대로 정리한 안드로이드
- 개발
- DataBinding
- 코틀린
- 앱
- github submodule
- 목서버
- Android Studio
- Unity
- 게임개발
- 앱개발
- 서브모듈 sourcetree
- 안드로이드
- 티스토리
- Today
- Total
Uing? Uing!!
[안드로이드 팁] public.xml: 라이브러리 리소스 숨기기 본문
라이브러리와 리소스
안드로이드 라이브러리를 개발할 때에는 리소스와 관련해서 신중하게 접근할 필요가 있다.
앱에서 라이브러리를 implementation했을 때, 라이브러리에서 정의한 리소스명들이 그대로 노출 및 사용되기 때문이다.
이때 라이브러리 내부의 리소스와 실제 앱 개발 작업이 직접적으로 엮이는 부분은 두 가지가 있다.
1) 앱과 라이브러리에 동일한 이름을 갖는 리소스가 있다면, 라이브러리의 리소스는 무시된다.
2) 앱 개발 중 라이브러리의 color, string 등 리소스가 자동완성 등에 직접 노출되고, 실제로 사용할 수도 있다.
1번의 경우 간단한 이야기이지만 이 포스팅의 논점은 아니니 다른 포스팅에서 다루는 것으로 하고,
2번이 일어나는 이유는 라이브러리 내부의 모든 리소스는 기본적으로 공개되기 때문이다.
아래는 라이브러리의 리소스가 공개되어 있어서 혼동이 생기는 대표적인 경우이다.
이 예시에서는 라이브러리의 cancel에 library_라는 prefix가 있기 때문에 그나마 큰 혼동 없이 적용할 수 있겠지만,
만일 라이브러리의 리소스 이름이 alert_cancel 이었다면 어떨까?
cance까지 쳤을 때 cancel과 alert_cancel이 동시에 나오니, 어떤 것이 실제 의도와 맞는지 혼란스럽다.
오른쪽 이미지처럼 실제로 라이브러리의 리소스가 적용된 경우에는 더 난감한 것이, 나중에 다른 사람이 이 코드를 보았을 때에도 앱에서 의도한 cancel 문구가 사용되지 않았다는 것을 알아차리기 어렵다.
이 상황에서 alert_cancel이라는 스트링을 가진 라이브러리가 버전을 업데이트하며 alert_cancel의 문구를 '취소'에서 '종료'로 바꿨다고 하자.
같은 리소스를 사용하는 이 앱이 라이브러리 버전을 업데이트하게 되면, 갑자기 취소 버튼이 '종료'라는 문구로 바뀔 것이다.
그리고 개발자는 왜 갑자기 버튼의 텍스트가 바뀌었는지를 이해하기 위해 레이아웃 파일을 들여다 보면서 '아..! 라이브러리의 것을 가져다 썼구나'하고, 그제서야 상황을 이해하게 될 것이다.
이런 상황을 방지하기 위해서, 라이브러리에서는 꼭 공개해야 하는 리소스를 제외하고는 숨기는 것이 좋다.
public.xml
'꼭 공개해야 하는 리소스를 제외하고는 숨기는 것이 좋다'라고는 했지만,
실제로 이를 적용하는 방식은 '모든 리소스를 숨기되 꼭 공개해야 하는 리소스만 공개한다'에 가깝다.
라이브러리 리소스를 숨기기 위해서는 public.xml이라는 파일을 사용한다.
이 xml 파일 내부에 공개할 리소스를 지정하면, 지정되지 않은 리소스들은 자동완성에서 제외된다.
public.xml의 작성 방식은 간단하다.
1) res/values 폴더 안에 public.xml 파일을 생성한다.
2) public.xml에서 공개할 리소스를 지정한다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public name="library_cancel" type="string"/>
</resources>
이렇게 public.xml을 작성한 버전을 배포하면, 라이브러리를 사용하는 앱에서도 버전을 업데이트해야 리소스 숨기기가 적용된다.
라이브러리 버전을 업그레이드했다면, 이전의 캐시가 남아 있을 수 있으므로 invalidate caches & restart 하는 것이 좋다. (라이브러리를 최초로 implementation하는 상황이라면 이 과정은 필요 없다.)
이렇게 설정하고 나면, public으로 설정한 libary_ok 외에는 더이상 레이아웃의 자동완성에 표시되지 않는다.
주의사항
public.xml을 통해 리소스를 숨기는 방식에는 두 가지 허점이 있다.
1) 앱 내 레이아웃 상에서의 자동 완성은 막아주지만, 코드 상에서 (패키지명).R.(리소스타입).(리소스명) 의 방식으로 작성하는 경우에는 자동완성을 막아주지 않는다.
2) 자동완성에서 보이지 않을 뿐, 전체 리소스명을 자동완성 없이 직접 타이핑하면 레이아웃에서 활용할 수 있다.
결국 public.xml의 역할은 '라이브러리를 참조한 앱 내 레이아웃에서 라이브러리 리소스가 자동완성되는 것을 방지하는 용도'라고 볼 수 있겠다.
이렇듯 모든 것을 막아주지는 못하지만, 최소한 public.xml으로 레이아웃 자동완성이라도 막아 주면 라이브러리를 활용하는 개발자 입장에서는 훨씬 편리해진다.
* 혹시 위 두 가지 한계를 극복하는 방법을 알고 계시는 분은 댓글로 남겨주시면 감사하겠습니다. ㅠ.ㅠ
'Android' 카테고리의 다른 글
[안드로이드 삽질기록] TextWatcher의 함정: 키보드마다 동작이 다르다? (1) | 2021.10.23 |
---|---|
[안드로이드 팁] LeakCanary: 메모리 누수(memory leak)를 잡아주는 라이브러리 (0) | 2021.10.23 |
[안드로이드 팁] Build Varients: 같은 프로젝트로 두 개 이상의 앱 빌드하기(BuildTypes & ProductFlavors) (1) | 2021.10.20 |
[안드로이드 삽질기록] 화면 상 가려져 있는 뷰가 클릭될 경우 해결법 (0) | 2021.08.03 |
[안드로이드 팁] elevation: 뷰에 그림자를 주는 가장 쉬운 방법 (0) | 2021.07.30 |