출처
: http://googledevkr.blogspot.kr/2014/10/android-50-api21-changes.html
* 추가 내용 출처
: http://kalesst.blogspot.kr/2015/01/android-50-lollipop-webview-issue.html
[기타 참조 자료 주소]
: http://developer.android.com/about/versions/android-5.0-changes.html
: http://blog.tstore.co.kr/141
: http://blog.tstore.co.kr/143
: http://charlie0301.blogspot.kr/2014/10/android-chrome-based-webview.html
: http://gdgand.github.io/lollipop/2015/03/12/lollipop.html
이번 안드로이드 롤리팝은 추가된 API 의 숫자만도 5,000 개가 될 만큼 기존 버전에 비해 정말 다양한 변화가 있었는데요.
그 변화의 폭도 넓어서 새로운 사용자 UX 인 머티리얼 디자인부터 새로운 런타임 ART 까지, 플랫폼 가장 위에서 아래까지 많은 변화가 있었습니다.
그런만큼 혹시라도 여러분의 앱이 새로운 안드로이드 5.0 플랫폼 버전에서 별다른 문제 없이 잘 동작하고 있는지, 안드로이드 5.0을 지원하는 디바이스가 정식 출시 될 때까지의 시간을 잘 활용해서 다음과 같은 부분을 꼭 한번 확인해보시기 바랍니다.
아래 정리한 내용은 안드로이드 개발자의 영원한 동반자.
안드로이드 개발자 사이트의 API 21 소개 페이지의 내용을 기반으로 정리하였습니다.
안드로이드 런타임(ART)이 기본 런타임으로 사용됩니다.
안드로이드 4.4 킷캣 버전부터 새로운 안드로이드 런타임 ART 가 추가되었습니다.
4.4 까지 ART 는 개발자 옵션을 통해서만 기능을 사용할 수 있었지만, 안드로이드 5.0 부터는 ART 가 기본 런타임으로 사용됩니다.
ART는 Ahead-of-time(AOT) 컴파일, 개선된 가비지 컬렉션(GC), 개선된 디버깅 기능등을 지원합니다.
보다 자세한 내용은 ART 소개 페이지를 참고하시기 바랍니다.
대부분의 안드로이드 앱은 별다른 변경 없이 ART상에서 잘 동작합니다.
그러나 기존 Dalvik 과 동작 방식에 몇 가지 차이가 있기 때문에, 특히 다음과 경우에는 앱의 ART 호환성 여부를 꼭 확인해봐야 합니다.
- C / C++ 코드를 실행하기 위해 Java 네이티브 인터페이스 (JNI)를 사용합니다. - 서드파티 난독화 도구등 비표준 코드를 생성하는 개발 도구를 사용하고 있습니다. - 가비지 콜렉션 컴팩트 기능이 동작하면 호환되지 않는 기술을 사용하고 있습니다. |
이외 ART 호환성 이슈가 발생하는 경우는 개발자 사이트의 ART 호환성 검증에 관한 문서를 확인해보시기 바랍니다.
알림(Notification) 기능이 크게 변경 발전 되었습니다.
앱에서 알림 기능을 사용하고 계시다면 안드로이듸 5.0 의 새로운 알림 기능과 잘 조화를 이루는지 확인할 필요가 있습니다.
특히 안드로이드 5.0 알림 디자인에 관한 자세한 내용은 디자인 가이드 문서를 확인해 보시기 바랍니다.
머티리얼 디자인 스타일의 알림
알림은 새로운 머티리얼 디자인 위젯에 맞게 흰색(혹은 아주 가벼운) 배경에 어두운 텍스트로 표시되도록 다시 한번 변경되었습니다.
사용중인 알림이 새로운 배경색에 잘 어울리는지 확인하고 이상한 점이 있으면 잘 어울리도록 멋지게 수정해주시기 바랍니다 : )
setColor() 메서드를 이용해 아이콘 이미지 뒤에 원 안에 악센트 색상을 설정할 수 있습니다.
알림에 사용되는 이미지들에 색상이 입혀 있다면 이를 수정해야 합니다. 여러분의 알림에서 사용된 리소스의 색상 정보는 시스템에 의해 무시되며
오직 알파 채널 값만이 사용됩니다. 실제 아이콘의 색상과는 무관하게 알림 아이콘은 흰색, 액션 아이콘은 짙은 회색으로 그려집니다.
소리와 진동
만일 여러분이 Ringtone, MediaPlayer, Vibrartor 클래스를 이용해 알림의 소리나 진동을 구현하고 있다면,
시스템이 새로운 '우선 순위 모드(priority mode)' 에 있을 때, 이를 적절히 처리할 수 있도록 해당 코드는 제거해주시기 바랍니다.
대신 Notification.Builder 를 이용해 사운드나 진동을 추가할 수 있습니다.
디바이스를 RINGER_MODE_SILENT 모드로 설정하면, 디바이스가 새로운 우선 순위 모드로 변경됩니다.
디바이스는 음소거 모드를 벗어날때 까지 우선 순위 모드로 유지됩니다.
지금까지 안드로이드 테블릿 장치의 마스터 볼륨을 제어하기 위해서는 STREAM_MUSIC 이 사용되었습니다.
안드로이드 5.0 부터는 스마트폰과 태블릿 모두 STREAM_RING 혹은 STREAM_NOTIFICATION 에 의해 마스터 볼륨이 제어됩니다.
잠금 화면(Lock Screen)
안드로이드 5.0에서 기본적으로 모든 알림은 잠금 화면에 표시됩니다. 잠금 화면에 민감한 정보가 표시되지 않도록,사용자는 민감한 정보가 표시되지 않도록 설정할 수 있습니다. 이렇게 되면 알림 내용이 표시될 때 텍스트 내용이 자동으로 제거됩니다. 개발자 여러분이 편집된 알림의 내용을 직접 정의하려면 setPublicVersion() 메서드를 사용할 수 있습니다.
만일 알림에 개인 정보가 포함되어 있지 않거나, 알림을 통해 미디어를 제어할 수 있게 하려면 setVisibility() 메서드를 호출해 알림을 VISIBILITY_PUBLIC 으로 설정합니다.
미디어 재생
기존의 커스텀 RemoteView 를 사용하는 대신, 새로운 Notification.MediaStyle 을 이용해 사용자에게 미디어 재생 컨트롤 기능을 제공할 수 있습니다. 어떤 방법을 사용하던 알림의 Visibility 를 VISIBILITY_PUBLIC 으로 설정하면 사용자는 잠금화면에서 바로 미디어를 컨트롤 할 수 있습니다. 안드로이드 5.0 부터는 더이상 잠금 화면에 RemoteControlClient 객체를 표시하지 않습니다. 바로 아래에 이와 관련된 보다 자세한 내용을 확인하실 수 있습니다.
헤드 업(Heads-up) 알림
새로운 해드 업 알림 기능이 추가되었습니다. 디바이스가 활성화된 상태일 때 화면에 떠있는 형태로 표시되는 작은 창 모양의 알림으로 사용자가 바로 실행할 수 있는 액션버튼을 포함할 수 있습니다. 사용자는 현재 실행 중인 어플리케이션을 벗어나지 않고도 바로 헤드 업 알림 내용을 확인하고 특정 액션을 실행하거나 알림을 닫을 수 있습니다.
헤드 업 알림은 다음과 같은 경우에 발생할 수 있습니다.
알림이 fullScreenIntent를 갖고 있으며, 전체 화면을 필요로 할 때
알림의 우선 순위가 높으며 벨소리 및 진동을 사용하고 있을 때
여러분이 어플리케이션이 해당 조건을 만족하는 알림을 사용하고 있다면, 헤드 업 알림이 제대로 표시되는지 확인하시기 바랍니다.
RemoteControlClient 가 더이상 지원되지 않습니다.
안드로이드 5.0 에서는 RemoteControlClient 를 사용해도 미디어 재생 컨트롤 화면이 잠금 화면에 표시되지 않습니다.
대신, 새로운 Notification.MediaStyle 탬플릿을 통해 미디어 재생 컨트롤을 잠금 화면에 표시할 수 있습니다.
Notification.Builder.addAction() 메서드를 통해 추가한 액션은 미디어 재생 알림에 버튼 형태로 추가되며 setSession() 메서드를 통해 현재 어떤 미디어 세션이 재생되고 있는지 지정할 수 있습니다. 새로운 MediaStyle 스타일 알림을 사용할 때는 사용자가 잠금 화며에서 미디어를 컨트롤 할 수 있도록 VISIBILITY_PUBLIC 속성을 사용하시기 바랍니다.
안드로이드 TV 나 안드로이드 웨어 디바이스에서도 미디어 재생 기능을 지원하기 위해서는 MediaSession 클래스를 구현해야 합니다.
또한, 안드로이드 디바이스에서 미디어 버튼 이벤트를 받아 특정 작업을 수행하려고 하는 경우에도 마찬가지로 MediaSession 클래스를 구현하셔야 합니다.
<리스트 11> <리스트 12>과 같이
<리스트 12> 세션의
<리스트 13> 노티피케이션의 액션을 다른 서비스로 연결시키고 해당 서비스에서 |
getRecentTasks() 는 더 이상 지원되지 않습니다.
안드로이드 5.0 에서는 하나의 앱을 여러 개의 다큐먼트와 엑티비티 태스크로 분리하여 지정하고 관리할 수 있는 방법이 추가되면서, 사용자의 개인정보를 보호하기 위하여 ActivityManager.getRecentTasks() 메서드는 더 이상 지원되지 않습니다. 하위 호환을 위하여 안드로이드 5.0 에서 이 메서드는 메서드를 호출한 프로그램과 홈과 같은 덜 민감한 태스크의 정보만을 반환하도록 수정되었습니다. 만일 현재 여러분의 앱에 속한 태스크의 정보를 확인하고자 한다면, 새로운 getAppTasks() 메서드를 사용하실 수 있습니다.
64비트가 지원됩니다. 최신 NDK를 이용해 앱을 다시 빌드해야 합니다.
안드로이드 5.0은 64비트 시스템을 지원합니다. 64비트로 주소 공간이 늘어나며 성능이 향상 될 수 있습니다. 또한 64비트 지원을 통해 OpenSSL의 암호화 성능도 개선될 수 있습니다. 여기에 이번 릴리즈에서는 새로운 네이티브 NDK API 와 OpenGL ES 3.1이 추가적으로 지원됩니다.
안드로이드 5.0에서 지원되는 64비트 지원을 활용하려면 NDK 페이지에서 최신 NDK 10c 버전을 다운로드 받아 설치해 보시기 바랍니다. 릴리즈 노트를 참고하시면 NDK 의 주요 변경 및 버그 수정에 관한 내용을 확인하실 수 있습니다.
Context.bindService() 는 명시적 인텐트만을 지원합니다.
안드로이드 5.0 부터 서비스에 바인드 하기 위해서는 반드시 명시적 인텐트를 사용해야 합니다. 만일 암시적 인텐트를 이용해 bindService() 를 호출하는 경우 예외가 발생합니다. 여러분의 앱이 보안을 위하여 서비스에 바인드 할 때는 반드시 명시적 인텐트를 사용하고 서비스를 위한 인텐트 필터는 사용하지 않는 것이 권장됩니다.
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 을 대체한다.
이를 통해 해커는 조용히 권한을 얻을 뿐만 아니라 해당앱과 일치하는 서명키를 가질 필요가 없게 된다.
[추가]
안드로이드(Android 5.0) Lollipop Webview issue
HTTPS > HTTP 전송시 내장 브라우저에서 block 시켜 데이터 전송이 안되는 문제였다.
[blocked] The page at 'https://xxx' was loaded over HTTPS, but ran insecure content from http://xxx.css': this content should also be loaded over HTTPS. |
라는 메세지를 콘솔창으로 마구 뱉는 문제였다...
이 문제는 롤리팝에서 변경된 문제였다.
구글링 해보았으나 실제로 안드로이드 관련정보는 찾을수 없었고
해결방안은 Anroid 5.0 Changes 를 보고 찾을 수 있었다.
[WebView]
If your app targets API level 21 or higher: The system blocks mixed content and third party cookies by default. To allow mixed content and third party cookies, use the setMixedContentMode() and setAcceptThirdPartyCookies() methods respectively. The system now intelligently chooses portions of the HTML document to draw. This new default behavior helps to reduce memory footprint and increase performance. If you want to render the whole document at once, disable this optimization by calling enableSlowWholeDocumentDraw(). If your app targets API levels lower than 21: The system allows mixed content and third party cookies, and always renders the whole document at once. |
혼합된 컨텐츠와 서드파티 쿠키가 설정에 따라 Webview 에서 Block 시키는 게 기본이 됐다는
내용이였다.
public abstract void setMixedContentMode (int mode) Configures the WebView's behavior when a secure origin attempts to load a resource MIXED_CONTENT_ALWAYS_ALLOW : 항상 허용 MIXED_CONTENT_COMPATIBILITY_MODE : 호환성 모드 MIXED_CONTENT_NEVER_ALLOW : 허용 안함 |
[해결 소스]
mWebView.getSettings().setMixedContentMode(WebSettings
CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.setAcceptThirdPartyCookies(mWebView, true); |
[Android 버전별 WebView 이슈들]
Migrating to WebView in Android 4.4 : https://developer.android.com/guide/webapps/migrating.html kitkat(4.4)에서 맞닥뜨린 이슈 및 해결 by marojun : https://medium.com/marojuns-android/kitkat-4-4-%EC%97%90%EC%84%9C-%EB%A7%9E%EB%8B%A5%EB%9C%A8%EB%A6%B0-%EC%9D%B4%EC%8A%88-%EB%B0%8F-%ED%95%B4%EA%B2%B0-1ecb94c24694 버전별 WebKit 버전 by Padgom : http://padgom.tistory.com/entry/Android-%EB%B2%84%EC%A0%84%EB%B3%84-Webkit-%EB%B2%84%EC%A0%84 @JavascriptInterface Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotationto any method that you want available to your JavaScript (the method must also be public). If you do not provide the annotation, the method is not accessible by your web page when running on Android 4.2 or higher. [Remote Debugging on Android with Chrome] : https://developer.chrome.com/devtools/docs/remote-debugging [기타] 찾다 보니 Mozilla GeckoView도 있구나.. HTML5의 충실한 지원으로, Android WebView를 대체하는 View로 충분한 : http://sjava.net/?p=471 WebView attack 관련 논문 선 링크 후 분석... : http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf |
'IT_Programming > Android_Java' 카테고리의 다른 글
Android에서 메소드 수가 65536을 넘었을 때의 대처 방법 (0) | 2015.04.09 |
---|---|
Using Immersive Full-Screen Mode (0) | 2015.03.25 |
안드로이드 프로가드 설정 기본 포맷! (0) | 2015.03.18 |
Android Studio Gradle 관련 빈번히 마주할 수 있는 오류사항 정리! (0) | 2015.03.18 |
[펌] WindowManager의 OnTouch Event 처리하기 (0) | 2015.03.10 |