티스토리 뷰

개발자 이야기

Android 5.0 롤리팝에서의 이슈 및 해결

개발자센터 지기 ShellingFord 2014.10.30 11:12

Android 5.0 롤리팝

Android 5.0 롤리팝에서의 이슈 및 해결

+ Posted : 2014-10-30

본 게시물은 SK플래닛 전슬마로 매니저님 (@marojuns)님의 허락을 받고 게시한 글 입니다. 
Android 5.0 Lillipop의 다양한 소식은 전슬마로 매니저님의 블로그에서 더욱 자세히 확인하실 수 있습니다. 


http://android-developers.blogspot.kr/2014/10/whats-new-in-android-50-lollipop.html

INSTALL_FAILED_DUPLICATE_PERMISSION 오류

앱 설치 시 INSTALL_FAILED_DUPLICATE_PERMISSION 에러로 인해 설치 불가한 경우가 발생하는 케이스 입니다. Android 5.0 부터 동일한 커스텀 permission을 사용하는 두 앱은 같은 signing key를 가져야 한다고 합니다. 물론 android 에서 제공하는 permission 들은 문제가 없고 이외에 것들만 해당하는것 같습니다.
https://code.google.com/p/android/issues/detail?id=74472

제 앱은 카카오톡과 충돌이 나는 것을 확인했는데요. 제 앱을 먼저 설치하면 카카오톡이 해당 오류가 발생하고
카카오톡을 먼저 설치하고 제 앱을 실행하면 제 앱에서 동일한 오류가 발생합니다. 원인은 com.skt.aom.permission.AOM_RECEIVE 라는 통신사 커스텀 permission 을 사용하기 때문이었습니다. — 다행히 현재는 해당 커스텀 퍼미션을 사용하지 않고 그대로 이용할 수 있도록 가이드가 나온 것으로 알고 있습니다.

인앱 결제를 위해 com.tmoney.vending.INBILLING 퍼미션을 사용하시는 개발자 분들은 해당 퍼미션은 커스텀이기에 충돌오류가 날 수 있으니 미리 롤리팝에서 확인하시기 바랍니다.
T store 인앱결제를 위한 주의사항은 별도의 포스팅으로 다시 올리겠습니다.
만약 다른 앱간의 연동을 위해 연동 앱의 메니페스트 파일에 커스텀 퍼미션을 요구하시는 개발자 분들은 퍼미션 명을 겹치지 않도록

<permission
android:name="com.maro.permissiontestapp.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>

위와 같이 ‘해당앱의 패키지명’을 포함하여 퍼미션 명을 사용하도록 설계하시는게 좋을 것 같네요.

즉, 2개의 앱이 같은 permission 을 사용하고 있어서 발생하는 오류인데 이 것을 수정하기 위해서는 현재로선 같은 signing key 로 signing 하거나 해당 퍼미션을 삭제해야 합니다.

그럼 왜 구글은 5.0 에서 갑자기 위와 같은 정책을 적용하였을까요. 이에 대한 이유에 대해 Vulnerabilities with Custom Permissions 글을 살펴보면 이해하실 수 있으실 겁니다. 간단히 정리해보면

만약 두앱이 같은 커스텀 퍼미션을 사용한다면 ( manifest의 <permission> 속성의 android:name 값이 같은 경우), 둘중에 먼저 설치된 앱에 정의되어 있는 것을 사용하게 된다.
하지만 이 경우 중복되는 패키지네임 이나 콘텐트 프로바이더 권한과는 달리 설치가 가능하다. 이것은 상당한 위험이 따르는데 해커가 사용자의 보안 컴포넌트를 쉽게 접근할 수 있게 되기 때문이다.
<uses-permission>을 통해 동일한 커스텀 퍼미션을 선언하고 먼저 설치되면
안드로이드는 결코 유저에게 해커가 해당 퍼미션을 요청했다고 알려주지 않는다. 그래서 유저는 해커가 내 앱의 데이터(해당 권한을 통해 제공되는 범위 내) 에 접근한다는 사실을 인지하지 못할 수 있다.
더 심각한 것은 해커는 해당 커스텀 퍼미션을 android:protectionLevel = normal 로 선언할 수 있는 것이다. 이는 유저에 의해 정의되어진 android:protectionLevel = signature 을 대체한다.이를 통해 해커는 조용히 권한을 얻을 뿐만 아니라 해당앱과 일치하는 서명키를 가질 필요가 없게 된다.

암시적 Intent 통한 Context.bindService() 이용에 따른 오류

Android 5.0 에서는 bindService()를 위해서는 반드시 명시적 인텐트를 사용해야 합니다. 안그러면 아래와 같은 에러 메시지를 보게 되는데

Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit:

해당 변경에 대한 이유는 보안을 위해 서비스에 바인드 할 때 반드시 명시적 인텐트를 사용하도록 변경했다고 합니다.

참고로 Google’s in-app purchasing (IAP) API 를 사용하기 위해 bindService()를 통해 Android L 에서 연동하면서 발생되었던 내용을 정리한 “Dealing with L Deprecations: bindService()” 공유 합니다.



사업자 정보 표시
SK플래닛 | 서진우 | 경기도 성남시 분당구 판교로 264 the Planet | 사업자 등록번호 : 104-86-36968 | TEL : 02-1600-6573 | Mail : devhelper@tstore.co.kr | 통신판매신고번호 : 제2014-경기성남-0036호 | 사이버몰의 이용약관 바로가기
댓글
  • 프로필사진 kwonnh93 그렇다면, 제가 직접 설계한 앱이 아닌 이미 나와있는 앱을 수정해서 배포하게 될 경우에는 퍼미션을 어떻게 지정해야하나요?
    참고로 저는 카카오톡 테마 개발자이고 현재 505이슈로 골머리를 앓고 있습니다.
    2015.05.05 01:07 신고
  • 프로필사진 BlogIcon 개발자센터 지기 ShellingFord 퍼미션은 Androidmanifest를 빌드하는 과정에서 직접 처리하시면 됩니다. 더불어 카카오톡 테마의 경우 추가로 퍼미션을 요구하면 안되도록 가이드를 하고 있다고.. 합니다. 사용하시는 개발도구 및 내용을 확인해주시기 바랍니다. 2015.07.10 16:51 신고
댓글쓰기 폼