외부 라이브러리를 붙이고 빌드했더니 권한 목록이 길어졌다. 내가 적은 것은 셋인데 실제로는 여덟 개였다.
Table of contents
Open Table of contents
넣지 않은 권한이 있었다
SVN 이력을 보니 앞사람이 광고 SDK 를 붙이며 넣은 것이었다. AndroidManifest.xml 에 <uses-permission> 다섯 줄이 손으로 들어가 있었다. SDK 문서의 목록을 그대로 옮긴 것이고 왜 필요한지는 없었다.
이게 문제인 이유는 설치할 때 목록이 보이기 때문이다. 권한이 많으면 설치를 꺼린다.
하나씩 무엇이 왜 필요한지 봤다. INTERNET 은 광고를 받아야 하니 필요하다. WRITE_EXTERNAL_STORAGE 는 이미지 캐시로 보였다. READ_PHONE_STATE 와 ACCESS_FINE_LOCATION 은 문서를 찾으니 기기 식별과 지역 광고용이고 둘 다 선택이었다.
뺄 수 있는 것과 잃는 것
AndroidManifest.xml 에서 그 두 줄을 지웠다. 빼고 돌려 보니 잘 돌고 광고도 나온다. 다만 지역 맞춤은 안 되고 일반 광고만 나온다.
수익 차이를 보려니 비교할 데이터가 없었다. 한쪽으로만 돌려 봤기 때문이다. 일부에만 켜서 비교하는 방법이 있을 것 같은데 아직 모른다. 일단 빼고 나중에 필요하면 넣기로 했다.
대신 왜 뺐는지를 SVN 커밋 메시지에 적었다. 권한 목록을 줄이려고 뺐고 수익 영향은 안 쟀다고 남겼다. 안 적으면 나중에 왜 없는지 묻게 되고, 넣었다가 또 빼는 일이 반복된다.
크기도 늘었다
권한만 는 것이 아니라 APK 크기도 늘었다. JAR 을 열어 보니 우리가 쓰는 배너 말고도 전면 광고와 부가 기능이 같이 들어 있었다.
proguard.cfg 를 켜니 안 쓰는 코드가 빠져 크기가 줄었다. 그런데 실행 중에 ClassNotFoundException 으로 죽었다.
이름으로 찾는 코드가 지워졌다
이유를 찾아보니 이름으로 클래스를 찾는 코드가 있었다. 코드에 이름이 문자열로만 있으면 그건 참조로 안 보이고, 빼는 도구가 안 쓰는 것으로 판단해 지운다.
Class.forName("com.example.Something");
라이브러리 문서에 빼지 말아야 할 목록이 적혀 있어서 그걸 설정에 넣었다. 그 부분은 안 지운다는 표시다.
이걸 직접 알아내기는 어려웠다. 문서에 있으면 적으면 되지만 없으면 깨지는 것을 하나씩 찾아야 한다. 그래서 라이브러리를 붙일 때 어떤 권한이 들어오는지와 안 쓰는 기능을 뺄 수 있는지와 축소할 때 지킬 목록이 있는지 셋을 먼저 보게 됐다.
정리
- 외부 라이브러리가 자기 권한을 같이 들여온다
- 설치할 때 사용자에게 목록이 보여서 많으면 꺼려진다
- 선택 권한은 뺄 수 있고 대신 기능 일부를 포기한다
- 뺐으면 왜 뺐는지 적어 둔다. 안 그러면 같은 판단을 반복한다
- 앱 크기도 늘고 안 쓰는 코드를 빼는 설정이 있다
- 이름으로 찾는 코드는 참조로 안 보여서 지워진다
- 라이브러리 문서의 지킬 목록을 설정에 적는다
- 붙이기 전에 권한과 크기와 축소 목록 셋을 본다