[go: up one dir, main page]

Posted by, Dave Burke, VP of Engineering, Android

이제 곧 안드로이드 6.0 마시멜로가 정식 출시됩니다. 다음 주부터 마시멜로를 지원하는 넥서스 5, 넥서스 6, 넥서스 7(2013), 넥서스 9, 넥서스 플레이어, 안드로이드 원 디바이스 대상으로 OTA 업데이트가 시작됩니다. 동시에 안드로이드 6.0 소스가 안드로이드 오픈소스 프로젝트(AOSP)로 옮겨질 것입니다. 이와 더불어, 안드로이드 6.0 마시멜로가 최초로 올라갈 두 가지 새로운 넥서스 디바이스가 공개되었습니다. 안드로이드 6.0 마시멜로의 새로운 기능을 최대로 활용할 수 있도록 잘 정돈된 하드웨어를 갖고 있습니다.

넥서스 5X와 넥서스 6P를 소개합니다.


Nexus 5X

Nexus 6P

넥서스 5X는 LG와 구글이 함께 만들었습니다. 5.2인치 FHD LCD, Snapdragon™ 808 칩셋(1.8 GHz hexa-core, 64-bit), 12.3 메가픽셀 카메라가 탑재되었습니다. 넥서스 6P는 화웨이와 구글이 함께 만들었습니다. 5.7인치 WQHD AMOLED, Snapdragon™ 810 v2.1 칩셋 (2.0 GHz octa-core 64-bit) , 전면 스테레오 스피커, 12.3 메가픽셀 카메라가 탑재되었습니다. 또한, 다이아몬드 컷 일체형 알루미늄 몸체를 갖고 있습니다.

두 디바이스 모두 USB Type-C 포트와 지문 인식 센서, 그 외 안드로이드 센서 허브, 채널 선택 기능을 갖춘 저전력 Wi-Fi 스캐닝, 배칭, BSSID 핫 리스트, 최소 전력 BLE 알림 기능이 포함된 브루투스 4.2 등등 안드로이드를 위한 최신 하드웨어를 포함하고 있습니다.

여러분의 앱은 새로운 넥서스 디바이스에 잘 동작하나요?

넥서스 5x는 420dip 화면밀도를 넥서스 6p는 560dpi 화면밀도를 갖고 있습니다. 잘 알고 계신 대로, 안드로이드 플랫폼은 앱이 디바이스 화면밀도보다 더 높은 화면밀도를 위한 리소스 파일을 가진 경우엔 화면 밀도에 맞게 줄여서 사용하고, 반대의 경우에는 리소스를 늘려서 사용합니다.

ResolutionScreen sizeDensity
Nexus 5x1920 x 1080 px (730 x 410 dp)normal420 dpi
Nexus 6P2560 x 1440 px (730 x 410 dp)normal560 dpi

다른 것 보다, 개발자 여러분은 xxxhdpi 앱 아이콘을 포함하는 것을 잊지 마시기 바랍니다. 앱 실행 아이콘은 항상 최고로 선명하게 표시되어야 합니다. 그 외 다른 리소스는 안드로이드 롤리팝에서 추가된 Vector Asset 포맷을 사용하거나 앱 아이콘과 마찬가지로 한 단계 위의 화면밀도를 위한 리소스들을 추가할 수도 있습니다. 이 경우 이미지들이 화면에 좀 더 선명하게 표현되겠지만 APK 크기가 커질 수 있으므로 어떤 방법이 여러분의 앱에 가장 적절할지 고민해봐야 합니다.

만일 메니페스트에서 아직 <compatible-screens> 요소를 사용해 대상 디바이스를 필터링 하고 있다면, 다른 방법은 없는지 다시 한번 생각해보시기 바랍니다. 이 경우, 새로운 디바이스가 출시될 때마다 매번 값을 변경한 후 다시 컴파일해 앱을 올리지 않으면, 새로운 디바이스를 사용하는 사용자들이 여러분의 앱을 설치하지 못할 수도 있습니다. <compatible-screens> 요소가 꼭 필요하다면, 새롭게 출시된 넥서스 5X를 위해 새로운 420dpi 화면밀도를 추가하는 것을 잊지 마시기 바랍니다.

안드로이드 6.0 마시멜로 준비하기

세 번의 개발자 프리뷰 버전을 지나 이제 최종 OTA 곧 시작될 것입니다. 안드로이드 M 개발자 프리뷰의 내용을 다시 한 번 정리해 볼 시간이 되었습니다. 

아직 안드로이드 6.0 마시멜로에 관해 잘 모르고 계신다면, developer.android.com/mm 사이트를 방문해 보시기 바랍니다. 런타임 권한, Doze, App Standby, 자동 백업, 지문 인식 지원 등을 포함하여 안드로이드 6.0 마시멜로의 새로운 기능들에 관한 내용이 자세히 소개되어 있습니다. 또한, 개발자분들을 위해 안드로이드 M의 새로운 기능을 소개하는 유용한 유뷰브 동영상 플레이리스트가 준비되어 있습니다. 다음 비디오 목록을 한 번 살펴보시기 바랍니다.



10월 초까지는 여전히 개발자 프리뷰 버전을 이용해 테스트를 진행하신 후, 안드로이드 6.0 이 정식 출시된 후에는 넥서스 factory images 페이지에서 시스템 이미지를 내려받아 사용하실 수 있습니다. 개발자 프리뷰 버전을 사용하고 계신 경우 자동으로 OTA를 받으실 수 없으니, 직접 공장 이미지를 이용해 시스템을 덮어 써야 하는 점을 잊지 마시기 바랍니다.

앱이 준비되면 개발자 콘솔을 통해 안드로이드 6.0 마시멜로를 대상으로 빌드된 앱을 올릴 수 있습니다. 이 경우, 새로운 런타임 권한 모델에 따라 추가로 앱이 사용 중인 권한을 확인할 필요 사용자가 앱을 바로 내려받거나 업데이트 받을 수 있습니다.

앱을 출시하실 때는 안드로이드 6.0과 이전 버전에서 모두 앱이 잘 동작하는지 확인하기 위해 향상된 베타테스팅 기능을 활용해볼 수도 있습니다. 원하는 사용자를 대상으로 베타테스팅을 진행하거나, 점진적으로 최신 버전을 사용하는 사용자를 증가시킬 수 있습니다.

What’s next?

10월 중순에 M 개발자 프리뷰 커뮤니티M 개발자 프리뷰 이슈 트래커가 닫힐 예정입니다. 이 후 안드로이드 6.0 관련 버그는 AOSP 이슈 트래커를 통해 알려주시면 됩니다. 

안드로이드 M 개발자 프리뷰에 참가해주신 모든 개발자분들께 감사의 인사를 드립니다. 올해의 개발자 프리뷰가 어떠셨는지, 다음 설문을 통해 저희에게 알려주시기 바랍니다. 여러분의 피드백은 내년 더 좋은 개발자 프리뷰 프로그램을 만드는 데 큰 도움이 될 것입니다.

>> 개발자 프리뷰 설문 조사 참가하기


Google Play 서비스 8.1 버전은 안드로이드 6.0의 새로운 런타임 권한 모델을 지원하는 첫 번째 Google Play 서비스 버전입니다. 기본적으로 Google Play 서비스는 API를 지원하는 데 필요한 권한을 갖고 있으며, 이전과 마찬가지로 여러분의 앱은 해당 기능을 사용할 때 사용 권한을 요청할 필요가 없습니다. 하지만 API Level 23버전을 타겟으로 앱을 업데이트한 경우에는 API 호출을 위해 실행 중에 코드 상에서 필요한 권한을 확인하고 사용자에게 적절한 권한을 요청해야 합니다.

새로운 런타임 권한을 준비하는 개발자 여러분을 위하여, Google Play 서비스를 사용하는 앱을 6.0 버전에 맞도록 업데이트할 때 어떤 준비 과정이 필요한지 간단히 정리해 보았습니다.

시작하기 전에…

이어질 내용은 런타임 권한 모델을 지원하기 위해 targetSdkVersion 값을 23으로 업데이트 한 상황에 해당하는 내용입니다. 여러분의 targetSdkVersion 값을 확인하시고, 또한, 이전 버전의 기기도 지원하기 위해 23 버전의 v4 서포트 라이브러리를 사용하고 있는지 살펴보시기 바랍니다. AndroidManifest.xml 파일에 필요한 권한도 모두 선언되어 있어야 합니다.
defaultConfig {
 minSdkVersion 9
 targetSdkVersion 23
}

dependencies { compile 'com.android.support-v4:23.0.1 }


1.GoogleApiClient 연결

GoogleApiClient를 통해 Google Play 서비스에 연결해 사용할 때, Google Play 서비스 동작에 필요한 권한이 없다면 앱 동작에 문제가 발생할 수 있습니다. 코드를 추가로 작성할 필요없이  startResolutionForResult() 메서드를 올바르게 활용하고 있다면 크게 걱정할 필요는 없습니다.

@Override
public void onConnectionFailed(ConnectionResult result) {
      if (mResolvingError) {
             // Already attempting to resolve an error.
             return;
      } else if (result.hasResolution()) {
             try {
                   mResolvingError = true;
                   result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
             } catch (SendIntentException e) {
                   // There was an error with the resolution intent. Try again.
                   mGoogleApiClient.connect();
             }
      } else {
             // Show dialog using GooglePlayServicesUtil.getErrorDialog()
             showErrorDialog(result.getErrorCode());
             mResolvingError = true;
      }
}

해당 함수를 호출하면, 연결 오류가 발생 할 때, 사용자가 문제의 원인을 쉽게 파악하고 해결할 수 있도록 Google Play 서비스에서 사용자에게 정보를 제공합니다. 예를 들어 Google Play 서비스가 필요한 권한을 없는 경우, 다음과 같은 대화창이 표시됩니다.

2.권한 확인

Google Play 서비스 연결이 성공해도 필요한 권한이 없을 수도 있습니다. 그런 만큼, API를 호출하거나 GoogleApiClient 에 연결하기 전에 필요한 권한을 가졌는지 확인해야 합니다. 

서포트 라이브러리에 새롭게 추가된 checkSelfPermissions() 메서드를 사용해 권한을 갖고 있는지 확인할 수 있습니다. 만일 필요한 권한이 없는 경우, 다음과 같이 requestPermissions() 메서드를 이용해 사용자에게 직접 해당 권한을 요청해야합니다.

private static final int REQUEST_CODE_LOCATION = 2;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
 // Request missing location permission.
 ActivityCompat.requestPermissions(this, 
    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
    REQUEST_CODE_LOCATION);
} else {
 // Location permission has been granted, continue as usual.
 Location myLocation = 
             LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}

3.사용자 응답 확인

두 번째 단계에서 requestPermissions() 메서드를 이용해 사용자에게 권한을 요청한 후에는 onRequestPermissionsResult() 에서 사용자 응답을 확인할 수 있습니다. 물론 사용자가 권한 요청을 거부할 수 있으므로, 결과 값을 잘 확인한 후 적절한 작업을 수행해야 합니다. 또한, 서로 다른 권한 요청에 대한 응답이 동일한 콜백으로 넘어올 수 있으므로, 어떤 권한 요청에 대한 응답인지도 확인해야 합니다.
public void onRequestPermissionsResult(int requestCode, 
                                      String[] permissions,
                                      int[] grantResults) {
     if (requestCode == REQUEST_CODE_LOCATION) {
          if(grantResults.length == 1 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          // success!
          Location myLocation =
               LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
     } else {
     // Permission was denied or request was cancelled
     }
}


4.이유 설명하기

사용자가 권한 요청을 거부한 경우, 다시 권한을 요청해야 한다면 조금 더 자세한 설명이 필요합니다. 특히나, 여러분의 앱에 꼭 필요한 권한인데, 사용자가 해당 권한이 왜 필요한지 잘 이해하지 못하고 있다면, 사용자가 해당 권한이 필요한 이유를 잘 이해할 수 있도록 안내가 필요합니다.

이런 경우 requestPermissions() 메서드를 호출하기 전에, shouldShowRequestPermissionRationale() 메서드를 호출해 값을 확인하고, 만일 결과 값이 ‘true’이라면, 요청하는 권한에 관해 좀 더 자세히 설명할 수 있습니다.
private static final int REQUEST_CODE_LOCATION = 2;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
 // Check Permissions Now

  if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Display UI and wait for user interaction
  } else {
 ActivityCompat.requestPermissions(
             this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
                                     REQUEST_CODE_LOCATION);
  }
} else {
     // permission has been granted, continue as usual
     Location myLocation = 
        LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}

그럼에도 사용자는 언제나 여러분의 권한 요청을 거부할 수 있습니다. 이럴 때에도 개발자 여러분은 권한이 필요하지 않은 앱의 나머지 기능들 잘 동작하도록 만드셔야 합니다. 이를 위한 보다 자세한 내용과 모범 사례가 개발자 사이트에 공유되어 있습니다. 한 번 확인해보시기 바랍니다. 또한, 아래와 같은 참고 자료도 살펴보시면 좋을 것 같습니다.


안드로이드 M 오픈 테스트 랩

마지막으로, 만일 여러분이 Google Play 서비스를 사용하는 앱을 만들고 계신다면, 새로운 8.1 버전의 SDK를 다운로드 받아 적용해보고, 최신 안드로이드 개발자 프리뷰 버전 위에서 여러분의 앱이 잘 동작하는지 테스트해보시기 바랍니다. 혹시 적당한 디바이스가 없거나 어떻게 테스트할 지 잘 알 수 없어 도움이 필요하시다면, 구글 코리아에서 매주 진행하고 있는 안드로이드 M 오픈 테스트 랩에 참여해 보시기 바랍니다.

게시자: Anirudh Dewani , 디벨로퍼 어드보케


안드로이드 6.0은 사용자가 앱에서 요청한 권한 부여를 보다 세부적으로 제어하고, 더 빠르게 앱을 설치할 수 있는 새로운 런타임 권한 모델을 도입했습니다. 또한 사용자가 언제든지 설정에서 이 권한을 취소할 수 있습니다. M 미리 보기에서 실행되는 앱이 새 권한 모델을 지원하는 경우, 사용자가 앱을 설치하거나 업그레이드할 때 어떠한 권한도 부여할 필요가 없습니다. 개발자는 사용자로부터 런타임 부여를 요청하는 권한을 확인하고 앱이 아직 해당 권한이 없으면 요청해야 합니다.

안드로이드 6.0에서 사용자로부터 런타임 부여를 요청하는 모든 권한을 표시하려면 -

adb shell pm list permissions -g -d 

RECORD_AUDIO
일반적으로 앱은 최대한 적은 수의 권한을 요청해야 합니다. 음성 검색은 Android TV 콘텐츠 검색 경험에서 핵심적인 부분입니다. 내부SpeechRecognizer를 사용해서 음성 검색을 활성화하는 경우 앱이 매니페스트에서 RECORD_AUDIO 권한을 선언해야 합니다. RECORD_AUDIO는 Android 6.0에서 런타임 중에 명시적 사용자 권한 부여가 필요합니다. Android TV Leanback 지원 라이브러리를 사용하는 경우 SpeechRecognizer대신 SpeechRecognitionCallback을 사용함으로써 앱이 런타임 중에 RECORD_AUDIO를 요청할 필요가 없습니다.



SearchActivity.java
안드로이드 TV Leanback Sample 리포지토리에서 커밋합니다.


mFragment = (SearchFragment) getFragmentManager()
                .findFragmentById(R.id.search_fragment);
if (!USE_INTERNAL_SPEECH_RECOGNIZER) {
   
    mSpeechRecognitionCallback = new SpeechRecognitionCallback() {
        
        @Override
        public void recognizeSpeech() {
            if (DEBUG) Log.v(TAG, "recognizeSpeech");
        
            // ACTION_RECOGNIZE_SPEECH
            startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);
        }
    };
    mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback);
}

SpeechRecognitionCallback이 설정되면 내부 SpeechRecognizer를 사용하는 대신 Android Leanback 지원 라이브러리를 통해 액티비티에서 음성 검색 작업을 처리할 수 있습니다. 그러면 앱에서 RecognizerIntent를 사용하여 음성 인식을 지원할 수 있습니다.

API 레벨 23을 대상으로 하는 Android TV 앱이 있다면, 앱을 업데이트하여 SpeechRecognitionCallback을 사용하고 매니페스트에서 RECORD_AUDIO 권한을 제거하십시오.


Google Play는 개발자분들이 손쉽게 베타 테스트를 진행할 수 있도록 해줍니다. 2년 전에 베타 테스트 기능을 출시한 이후로, 많은 개발자분들이 베타 테스트 단계가 더 좋은 앱을 개발하는 때 꼭 필요한 부분이 되었다는 이야기를 들었습니다. 사실상, 인기 앱을 개발하는 개발자의 80%가 베타 테스트 단계를 활용하고 있습니다.

개발자 콘솔에서 베타 테스트 관리 기능 개선

현재, Google Play 개발자 콘솔에서, 개발자는 정식 버전으로 업데이트하기 전 알파 또는 베타 테스트로 특정 사용자에게 앱의 초기 버전을 공개할 수 있습니다. 선택된 사용자 그룹은 평소와 같이 Google Play에서 앱을 내려받지만, 스토어에서 앱에 대해 리뷰를 작성하거나 평가할 수는 없습니다. 따라서 앱 평가에 부정적인 영향을 미치지 않고 버그와 기타 문제를 해결할 수 있습니다.

여러분의 필요에 따라, 다양한 방식으로 베타 테스팅을 진행할 수 있습니다. Google Play 베타 테스팅은 다음 세 가지 방식을 지원합니다.
  • 오픈 베타
    • 베타 버전 링크를 아는 사용자라면 누구든지 클릭 한 번으로 베타에 참여할 수 있습니다. 쉽게 테스트 규모를 확대할 수 있고, 참여할 수 있는 최대 사용자 수를 제한할 수도 있습니다.
  • 이메일 주소를 사용한 비공개 베타
    • 개인 이메일 주소 목록을 사용하여 비공개 베타를 설정할 수 있습니다. 이메일 주소는 개별적으로 추가하거나 .csv 파일로 업로드할 수 있습니다. 선택된 사용자는 옵트인 링크를 통해 베타에 참여할 수 있습니다.
  • Google+ 커뮤니티 또는 Google 그룹을 통한 비공개 베타
    • Google+ 커뮤니티나 Google 그룹을 통해 베타를 사용할 수 있습니다. 기존 테스터를 유지하면서 오픈 베타로 전환할 수도 있습니다.


베타 테스트로 성공한 개발자의 사례

Diamond Dash, Jelly Splash, Agent Alice와 같은 인기 게임 제작사인 Wooga는 베타 테스트 기능을 잘 활용하고 있습니다. 파트너십 책임자인 Sebastian Kriese와 엔지니어링 책임자인 Pal Tamas Feher에게 가장 먼저 Wooga가 어떻게 반복 작업을 수행하는지 자세히 들어보십시오.


Kabam은 Fast & Furious, Marvel, Star Wars, The Hobbit 등의 독점 판매권을 위해 할리우드 영화제작사와 손잡고 AAA급 모바일 게임을 개발하는 글로벌 기업입니다. Kabam의 엔지니어들은 베타 테스트 덕분에 게임 출시 전에 안드로이드 기기를 위한 게임 플레이를 완벽히 준비할 수 있었습니다. Kabam 부사장인 Rob Oshima 씨는 "적극적인 피드백을 받고 Google Play의 알파/베타 테스트를 통해 신속히 반복할 수 있는 기능은 해외 출시에 매우 큰 도움이 되었습니다."라고 말했습니다.

Vector Unit의 공동 창업자인 Matt Small 씨는 베타 테스트를 광범위하게 사용하여 Beach Buggy Racing을 개선하고 자칫 발견하지 못 할 뻔한 문제를 찾아냈다고 최근에 저희에게 알려주었습니다. Gamasutra를 Google Play에서 베타 테스트한 경험을 적은 Matt의 블로그 게시물에서 이들의 경험을 들어보실 수 있습니다. 베타 테스팅 관련 Matt의 주요한 팁을 정리해 보았습니다.
  1. 민감한 빌드는 이메일 주소로 특정 개인 테스터를 초청하는 비공개 베타로 제한합니다. 눈에 띄는 문제를 해결하고 나면 앱을 오픈 베타로 공개하여 출시 전에 많은 사용자로부터 피드백을 수집합니다.
  2. 기대치를 조기에 수립합니다. 사용자에게 베타 테스트의 위험(예: 소프트웨어가 불안정할 수 있음)을 알리고 어떤 피드백을 원하는지 이야기합니다.
  3. 비판적인 피드백을 장려합니다. 사려 깊은 비판을 하고 명확히 설명한 사용자에게 감사의 인사를 전달합니다.
  4. 빠르게 응답합니다. 게임 개발자가 실제로 응답하는 것을 확인하는 사람들이 많을수록 참가율이 더욱 올라갑니다.
  5. Google Play 게임 서비스를 활성화합니다. 테스터가 업적 달성 및 순위표등의 기능이 공개되기 전에 이러한 기능을 사용할 수 있도록 Google Play 게임 서비스 테스트 패널에서 이 기능을 활성화합니다.

베타 테스트 기능을 통해 더욱 쉽게 앱을 테스트하고 귀중한 피드백을 모으며, 더 좋은 앱을 만드시길 바랍니다. 앱의 베타 테스트 설정에 관한 자세한 내용을 알아보려면 개발자 콘솔 도움말 센터를 방문하십시오.

안드로이드 6.0 마시멜로의 공식 버전 SDK와 최종 개발자 프리뷰 시스템 이미지가 공개된 지 딱 한 달이 지났습니다. 여러분의 앱을 안드로이드 6.0 마시멜로에서 테스트해보셨나요? 안드로이드 6.0에는 여러분이 꼭 테스트 해보셔야 할 여러 가지 변경사항이 있습니다.

구글 코리아에서는 지난 한 달 동안 개발자분들이 직접 자신이 만든 앱을 테스트해볼 수 있도록 ‘안드로이드 M 오픈 테스트 랩' 행사를 진행했습니다. 총 다섯 번에 걸쳐 70개의 앱을 개발자분들이 직접 테스트해 보셨습니다. 결과가 어떻게 나왔는지 궁금하신가요?

보시는 것처럼, 약 절반 정도의 앱은 다행히 별다른 문제 없이 정상적으로 동작했지만, 나머지 절반 정도의 앱에서는 문제가 발견되었습니다. 특히 10% 정도는 실행 자체가 불가능하거나, 실행 중 앱이 비정상 종료되었습니다.  

추가로 구글은 다양한 디바이스와 OS 버전에서 앱을 자동으로 테스트할 수 있는 서비스 테스티드에 M 프리뷰 테스트에 필요한 장비를 지원하였습니다. 테스티드는 한국 플레이 마켓 순위에 올라와 있는 300여 개의 앱을 안드로이드 M 디바이스에서 테스트해보았습니다. 

자동으로 앱의 여러 화면을 탐색하고, 특정 권한을 제거해가며 앱의 안정성을 테스트해 본 결과, 약 7.5 %의 앱이 실행되지 않거나, 동작 중 비정상 종료되는 문제가 발견되었습니다.


무엇이 원인일까요?

지난 한달간 진행된 테스트 중에는 런타임 권한 모델, Doze 모드, 제거된 OpenSSL 라이브러리로 인해 문제가 발생하는 경우가 많았습니다.

런타임 권한 모델

안드로이드 6.0 마시멜로를 타겟으로 빌드된 앱의 경우, 앱 설치 시가 아니라, 앱 실행 중에 필요한 권한을 사용자에게 요청해야 합니다. 또한, 기존 앱의 경우에도 사용자가 설정 메뉴를 통해 각각의 앱이 가진 권한을 조정할 수 있습니다. 필요한 권한이 없는 경우, 기존 앱은 이른바 Legacy 모드로 동작하게 되는데, 이때, 특정 권한이 요구되는 API를 호출하면, 아래 표와 같이 민감한 사용자 정보를 포함하지 않도록 수정된 결과과 반환됩니다. 이런 예외 상황을 적절히 처리하지 못하면 앱이 올바르게 동작하지 못할 수도 있습니다.

제거된 권한그룹
메서드 이름
결과
PHONE
TelephonyManager#getLine1Number()
null
STORAGE
MediaStore 에 콘텐츠를 요청하는 경우
Empty Cursor
STORAGE
외부 디렉토리에 파일을 읽거나 쓰려고 하는 경우
throw
FileNotFoundException
CAMERA
CameraManager#openCamera()
throw CameraAccessException
CONTACTS
주소록 정보 요청 시
Empty Cursor
LOCATION
LocationManager#getAllProviders()
Empty Provider List
SMS
텍스트 메세지 정보 요청 시
Empty Cursor
SMS
SMS_DELIVER 브로드캐스트 인텐트 수신 시도 시
수신 할 수 없음

Doze 모드

디바이스가 사용 중이 아닌 상태로 몇 시간 가만히 있는 경우, 불필요한 배터리 소모를 줄이기 위하여 Doze 모드에 진입하게 됩니다. 이때, 디바이스에 설치된 모든 앱은 다음과 같은 제약을 받게 됩니다.


사용자가 화면을 켜거나 디바이스가 크게 움직이는 경우, 혹은 배터리를 충전하게 되면, 자동으로 Doze 모드에서 빠져나옵니다. 하지만 Doze 모드에서도 네트워크를 사용해야 하는 앱이나, 사용자가 수면 중에도 주기적으로 센서값을 확인해야 하는 수면 관리 앱, 혹은 정확한 시간에 알람을 울려야 하는 일정 관리, 알람 시계 등의 기능을 제공하는 앱들은 문제가 발생할 수 있습니다.

사라진 API

기존 OpenSSL 이 BoringSSL 로 교체됨에 따라 발생하는 문제도 있습니다. 특히, 앱에서 Android NDK를 사용하는 경우, OpenSSL 라이브러리에 대해 링크를 직접 연결하는 경우 앱이 정상적으로 동작하지 않는 경우도 종종 볼 수 있었습니다. (예:libcrypto.so 및 libssl.so) 여러분의 앱이 만일 시작하자마자 죽는다면 이 부분을 먼저 확인해 보시기 바랍니다.  

그 외에도 ApacheHttpClient 나 브라우저 북마크 등 지원이 중단된 API 도 있습니다. 혹시 여러분의 앱이 마시멜로 타겟으로 정상적으로 빌드되지 않는다거나, 기존에는 없던 오류가 발생한다면, 다음 링크를 통해 혹시 삭제된 API 를 사용하고 있는건 아닌지 확인해 보시기 바랍니다.


안드로이드 M 오픈 테스트 랩

안드로이드 6.0 마시멜로는 이번 가을 공식 공개될 예정입니다. 혹시 아직 여러분의 앱을 마시멜로에서 테스트해보지 않으셨다면, 테스트를 시작해보는 게 어떨까요? 어느새 하늘이 높고 바람이 선선한 날씨가 되었습니다.

안드로이드 M 오픈 테스트 랩은 개발 중이거나 서비스 중인 앱과 게임이 새로운 안드로이드 M 버전에서 잘 동작하는지 직접 테스트해보고, M의 새로운 기능들에 관해 궁금한 점이나 적용 방법에 관해 이야기 나눌 수 있는 행사입니다. 테스트를 위한 디바이스가 없어서 어려움이 있거나, 어떤 식으로 테스트를 진행해야 할지 도움이 필요하거나, 문제를 해결하기 위한 조언이 필요한 개발자 여러분들, 아니면 마시멜로의 새로운 기능에 관심 있는 분들은 이번 9월 24일 다시 한 번 진행될 안드로이드 M 오픈 테스트 랩 행사를 놓치지 마시기 바랍니다.

>> 안드로이드 M 오픈 테스트 랩 참가 신청하기


작성자 : Josh Gordon, Developer Advocate
Android Auto 개발자를 위한 새로운 테스트 도구인 데스크톱 헤드 유닛(DHU)이 출시 되었습니다. DHU를 사용하면 워크스테이션이 테스트 목적으로 차량 내부 환경을 에뮬레이션하는 Android Auto 헤드 유닛 역할을 하게 됩니다. DHU를 설치하면, USB로 스마트폰과 워크스테이션을 연결하여 Android Auto 앱을 테스트할 수 있습니다. 스마트폰은 마치 차와 연결된 것처럼 작동합니다. 앱은 차량과 동일하게 워크스테이션에 표시됩니다.

워크스테이션에서 DHU가 실행됩니다.

스마트폰에서 Android Auto 부속 앱이 실행됩니다.

이제 차에서 작업하지 않아도, 보다 생산적인 환경에서 아직 출시되지 않은 앱을 테스트해볼 수 있습니다. DHU가 출시됨에 따라, 이전의 시뮬레이터 사용은 중단되지만, 공식적으로 시뮬레이터가 제거되기 전까지는 당분간 지원됩니다.

시작하기


Lollipop 이상이 실행되는 Android 스마트폰에 Android Auto 부속 앱이 설치되어 있어야 합니다. Auto 앱을 컴파일링하여 스마트폰에 설치합니다.

DHU 설치


SDK Manager를 열어 Extras > Android Auto Desktop Head Unit emulator에서 DHU를 워크스테이션에 설치합니다. DHU는 <sdk>/extras/google/auto/ 디렉터리에 설치됩니다.

DHU 실행


스마트폰과 워크스테이션이 USB를 통해 연결되었는지 확인합니다.

1. Android Auto 부속 앱을 시작한 후 헤더 이미지를 10번 탭하여 Android Auto 개발자 모드를 활성화합니다. 이 단계는 한 번만 거치면 됩니다.


2. 부속 앱에서 컨텍스트 메뉴를 클릭한 다음, '헤드 유닛 서버 시작하기'를 선택하여 헤드 유닛 서버를 시작합니다. 이 옵션은 개발자 모드가 활성화된 후에만 표시됩니다. 서버가 실행되면 알림이 표시됩니다.

워크스테이션에서 DHU를 시작하기 전에 Android Auto 부속 앱에서 헤드 유닛 서버를 먼저 시작합니다.

 헤드 유닛 서버가 실행되면 알림이 표시됩니다.


3. DHU가 스마트폰에서 실행되는 헤드 유닛 서버와 연결될 수 있도록 워크스테이션에서 ADB를 사용하여 포트 포워딩을 설정합니다. 터미널을 연 다음, adb forward tcp:5277 tcp:5277을 입력합니다. 이 단계를 꼭 기억하세요!

4. DHU를 시작합니다.

cd <sdk>/extras/google/auto/ Linux 또는 OSX: ./desktop-head-unit
Windows: desktop-head-unit.exe

이제, DHU가 워크스테이션에서 실행되고 스마트폰은 Android Auto 모드로 전환됩니다. 자세한 내용은 개발자 가이드를 참조하세요. 즐겁게 DHU를 이용하시길 바랍니다!


오는 9월 16일 수요일에 한국의 모바일 개발자 여러분들을 모시고 Google Developers Summit을 진행합니다. Google Developers Summit은 지난 2013년부터 진행되어 온 행사로서 구글에서 제공하는 다양한 기술들에 관한 최신 정보와 동향 뿐만 아니라 동종 업계에 있는 다양한 참석자들과의 네트워킹을 위한 시간도 마련되어 있습니다.


아래 사항을 참고하셔서 늦지 않게 참가 신청 부탁드립니다.


일시 : 9월 16일 오후 4시 ~ 오후 6시 30분


내용
3시 30분 ~ 3시 50분 : 등록
3시 50분 ~ 4시: 인사말씀 (권순선, Google)
4시 ~ 4시 30분 : 꼭 기억해야 할 안드로이드 6.0 마시멜로 주요 변경 사항과 테스팅 (양찬석, Google & 곽상용, Testyd)
4시 40분 ~ 5시 10분 : 고품질 앱 개발을 위한 안드로이드 지침 (임성혁, Google)
5시 20분 ~ 5시 50분 : 안드로이드 개발자 콘솔 신기능 소개 및 정책 (김보람, Google)
6시 ~ 8시 : 저녁 식사 & 네트워킹


- 9월 13일까지 등록 부탁드립니다. (선착순)
- 주요 참석 대상은 기술 담당자, 제품 책임자, 기획자 분들입니다.
- 등록은 참석자 모두 각자 해 주셔야 합니다.
- (중요) 현재 마켓에 등록된 앱이 있는 경우에 한합니다.
- 주차는 제공되지 않습니다.
- 정확한 순서나 내용은 예고없이 변경될 수 있습니다.


감사합니다.



안드로이드 디바이스는 다양한 일을 합니다. 사진을 찍거나, 자신의 위치를 확인하거나, 누군가와 전화 통화를 할 수도 있습니다. 그리고이러한 기능을 활용하기 위해서는 종종 주소록, 캘린더 일정, 현재 위치 정보같이 민감한 개인 정보가 필요할 때도 있습니다. 안드로이드에서 이런 정보는 ‘권한’을 바탕으로 보호되고 있습니다. 모든 앱은 민감한 사용자 정보를 사용하기 위해서는 반드시 그에 해당하는 권한을 갖고 있어야 합니다. 

그리고 안드로이드 6.0 마시멜로에서는 사용자가 앱이 사용하는 권한을 좀 더 쉽게 이해하고 더 잘 제어할 수 있도록, 새롭게 런타임 권한 모델이 추가되었습니다. 마시멜로 버전의 가장 큰 변화 중 하나입니다. 타겟 API 23 이상으로 빌드된 앱이 안드로이드 6.0 에서 동작하는 경우, 기존처럼 앱이 설치될 때 필요한 권한을 요청하는 것이 아니라, 새로운 런타임 퍼미션 모델에 따라, 앱 실행 중에 필요한 권한을 요청해야 합니다.

000-install.png   013-sequential_single-never_ask-second.png

런타임 권한 모델을 통해 개발자 여러분은 사용자에게 왜 여러분의 앱이 특정 권한이 있어야 하는지 더 잘 설명할 수 있고, 사용자는 여러분의 앱을 더 쉽게 설치하고 활용할 수 있습니다. 사용자가 GooglePlay를 통해 앱을 설치하기 전에 앱이 요청하는 권한 목록을 확인하고 이를 수락하는 대신, 앱은 바로 설치됩니다. 더 나아가, 앱 업데이트 시 새로운 권한이 추가되는 경우에도 사용자가 이를 다시 확인해 주지 않아도 앱은 자동으로 업데이트될 것입니다. 대신, 앱 실행 중 필요한 시점에 사용자에게 권한을 요청할 수 있습니다.

디자인 가이드라인

가장 좋은 사용자 경험을 제공하기 위해서는, 올바른 순간에 권한을 요청하는 것이 중요 합니다. 구글 디자인 사이트에는 새로운 런타임권한 모델을 적용할 때, 참고하실 수 있는 유용한 UX 패턴이 정리되어 있습니다. 언제 권한을 요청해야 하는지, 그리고 왜 권한이 필요한지 어떻게 잘 설명할 수 있는지, 사용자가 권한 요청을 거부한 경우 어떻게 해야 하는지 구체적인 상황에 따른 가장 모범적인 사례를 한번 확인해 보시기 바랍니다. 

<권한의 중요도와 앱의 성격에 따라 권한을 요청하는 4가지 방법>

또 한가지, 많은 경우, 시스템이 지원하는 인텐트(Intent)를 이용하여, 별도의 권한을 요청하지 않고도 필요한 작업을 수행할 수 있습니다. 가장 대표적으로 ACTION_IMAGE_CAPTURE 인텐트를 사용하면, 직접 카메라 관련된 기능을 구현하는 대신, 사용자가 직접 본인이 가장 잘 활용하는 카메라 앱을 선택하여 사진을 캡처하고, 여러분의 앱은 그 결과를 받아 볼 수 있습니다. 여러분의 앱에 필요한 기능이나 사용 중인 권한 중 인텐트를 이용하여 대체할 수 있는 부분이 있으면 한 번 다음 내용을 살펴보시기 바랍니다. 


서포트 라이브러리

앱 내에서 런타임 권한을 요청해야 하는 경우, 개발자 여러분이 하위 호환성 걱정 없이 새로운 API를 활용할 수 있도록 서포트 라이브러리(support-v4 library, revision 23)에 관련된 API가 추가되었습니다. ContextCompat.checkSelfPermission() 메서드를 이용해 현재 앱이 특정 권한을 갖고 있는지를 확인할 수 있고, ActivtiyCompat.requestPermissions() 메서드를 사용해, 안드로이드 시스템이 사용자에게 권한 요청 대화창을 표시하도록 할 수 있습니다. 사용자가 한 번 권한을 수락한 후에도, 시스템 설정 메뉴를 통해 기존 권한을 제거할 수도 있습니다. 이 점 꼭 기억하시기 바랍니다. 

 

ActivityCompat.shouldShowRequestPermissionRationale() 메서드도 기억해 두시기 바랍니다. 이 메서드는 사용자가 이전에 권한 요청을 거부한 경우에 ‘true’ 값을 반환합니다. 이 경우, 권한 요청을 위한 대화창에는 다음과 같이 '다시 묻지 않기' 체크박스가 함께 표시됩니다.


사용자가 이를 선택하면, 이 후에 앱이 requestPermissions 메서드를 호출하더라도, 권한 요청 대화창이 표시되지 않으며, 바로 사용자가 해당 권한을 거부 할 때와 동일하게 콜백 함수가 호출 됩니다. 따라서, 이 메서드가 'true' 값을 반환하면, 여러분의 앱이 해당 권한을 요구하는 이유와 왜 그 권한이 필요한지 사용자에게 조금 더 자세한 설명을 할 필요가 있습니다. 


안드로이드 M 오픈 테스트 랩
디자인 가이드라인과 개발자 가이드 문서를 살펴보시고 안드로이드 6.0의 핵심적인 런타임 권한 모델을 한 번 적용해 보시기 바랍니다.  안드로이드 6.0 마시멜로 버전에서 직접 새로운 런타임 권한 모델을 테스트 해보고 기능을 구현할 개발자 분들을 위해 안드로이드 M 오픈 테스트 랩 행사가 마련되어 있습니다. 개발 중이거나 서비스 중인 앱과 게임이 새로운 안드로이드 M 버전에서 잘 동작하는지 직접 테스트 해보고, M 의 새로운 기능들에 관해 궁금한 점이나 적용 방법에 관해 이야기 나눌 수 있는 행사 입니다. 오픈 테스트 랩 행사는 올해 가을 마시멜로 기반의 디바이스가 정식으로 출시되기 전까지 매주 1번 꼴로 구글 캠퍼스에서 진행될 예정입니다.

바로 그 세 번째 행사가 9월 9일 진행될 예정입니다. 관심 있는 개발자 분들은 아래 링크로 참가 신청하세요.

작성자 : 정지현, Business Development Manager, Google Play Apps and Games

안녕하세요,

같은 값이면 검정소, 이왕이면 다홍치마… 예로부터 사람들은 아름다워 보이는 것에 더 끌려왔지요. 오늘은 이왕이면 머티리얼 디자인이라고, 구글플레이에서 머티리얼 디자인으로 한층 더 아름다워지고 성공까지 거둔 앱들의 사례를 소개드리고자 합니다.

머티리얼 디자인은 안드로이드 롤리팝을 론치하면서 구글에서 여러 앱 개발사들과 오랜 기간 테스트하며 논의해서 만든 가장 아름답고 효과적인 안드로이드 앱 디자인 가이드입니다. 안드로이드 앱과 iOS의 앱은 기능부터 스크린의 다양성까지 서로 다른 디자인의 접근 방식이 필요한데요, 머티리얼 디자인에는 안드로이드의 다양한 폼팩터를 아울러 최상의 아름다움을 구현하실 수 있도록 많은 라이브러리와 디자인 리소스를 지원하고 있습니다.

머티리얼 디자인은 디자인과 UX가 보기 좋고 사용하기 편한 부분에만 그치지 않고 비즈니스에 유의미한 결과들을 보여주는데요 한국의 앱 개발자들 중에 이러한 성과를 보인 사례들이 있어 소개해드립니다.

언니의 파우치에서는 Floating action button을 통해 글쓰기를 강조한 결과 신규 회원 글 작성수가 31% 증가하였습니다.

[언니의 파우치 머티리얼 디자인 개선 후 성과 발표 자료, 출처: 라이클 제공자료]

리멤버에서는 깔끔하고 직관적인 형태로 디자인을 도입한 이후 앱 내에서 연락 기능 클릭 수가 55% 증가하여 보다 유저들이 앱을 잘 사용하게 되었다는 것을 확인할 수 있었습니다.


[리멤버 머티리얼 디자인 개선 후 성과 발표 자료, 출처: 드라마앤컴퍼니 제공자료]


마지막으로 여러가지 레시피 콘텐츠들을 담고있는 이밥차에서는 콘텐츠가 부각될 수 있도록 머티리얼 디자인의 애니메이션 효과를 잘 이용하여 일평균 페이지뷰가 66% 증가하는 성과를 거두었습니다.


[이밥차 머티리얼 디자인 개선 후 성과 발표 자료, 출처: 메조미디어 제공자료]

이처럼 머티리얼 디자인을 각 앱에서 전달하고자 하는 가치를 끌어올리는데 적절히 사용할 경우 유저들의 사랑을 더 많이 받을 수 있습니다. 머티리얼 디자인에 대해 더 궁금하시다면 여기에서 기본 디자인 가이드에 대해 확인하실 수 있습니다. 이번 앱사들의 성공 사례에 대한 기사(한겨레, BeSuccess)들도 참고해주세요.

한번 보고, 두번 보고 자꾸만 보고 싶은 아름다운 앱들, 머티리얼 디자인이 적용된 다양한 앱들을 구글플레이에서 더 만나실 수 있습니다. 이제 여러분의 앱도 머티리얼 디자인으로 유저와의 유대를 더 많이 쌓아보세요.

감사합니다.