DynamoDB Limit 설정으로 RCU 97% 절감한 이야기
안녕하세요, 버즈빌 Supply Platform 팀의 Jed입니다. 대규모 트래픽 환경에서 낮은 지연 시간과 높은 가용성은 중요한 요소입니다. 따라서 버즈빌에서는 “Single-digit millisecond performance at any scale” …
Read Article안드로이드 11의 출시가 얼마 남지 않았습니다. 공식 문서에 따르면 2020년 3분기 안에 출시가 될 에정이니, 1~2달 안에 정식 버전이 출시될 것 같습니다. 지금까지의 메이저 버전 업데이트가 항상 그랬듯, 이번 안드로이드 11에서도 중요한 변경사항이 많고 이에 기존 앱들은 큰 영향을 받을 수 있습니다. 그중에서도 “패키지 공개 상태"에 대한 변경은 버즈빌 안드로이드 제품에도 많은 영향을 주는 부분이이서, 이에 대해 조사하며 실제로 테스트해본 결과를 공유하고자 합니다.
targetSdkVersion이 안드로이드 11 이상인 앱에서는 디바이스에 설치된 다른 앱 목록을 알 수 없고, 미리 매니페스트 파일에 지정한 앱의 정보만 가져올 수 있습니다. 쿼리 하고 싶은 앱을 지정하려면 AndroidManifest.xml에 <queries> 요소를 추가해서 쿼리할 패키지 이름 또는 인텐트 필터 서명을 포함해야 합니다.
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
예외적으로 몇몇 사용 사례(런처, 접근성, 브라우저, 보안 앱 등)에서는 기기에 설치된 모든 앱을 쿼리하거나 상호작용해야 할 수 있습니다. 이를 위해 안드로이드 11에는 QUERY_ALL_PACKAGES 권한이 도입되었습니다.
공식 문서에서는 QUERY_ALL_PACKAGES 권한에 대해 Google Play에서의 관련 가이드라인을 제공할 예정이라고 설명하고 있습니다. 구글에서는 대부분의 상황에서 <queries> 요소를 통해 앱이 작동하는 데 필요한 패키지 공개 상태를 최소한으로 요청하여 앱의 기존 동작을 유지할 수 있다고 보고 있는 것 같아, 아마 위에 언급한 예외적인 사용 사례를 제외하면 이 권한의 사용을 어떤 방식으로든 제한할 것으로 보입니다.
더 자세한 내용은 안드로이드 개발자 페이지의 공식 문서를 읽어보시기를 추천해 드립니다.
공식 가이드 문서에는 예시로 든 API는 PackageManager.queryIntentActivities() 뿐이지만, 구글 안드로이드 11 밋업에서는 “패키지 공개 상태” 변경에 영향을 받는 다른 API도 소개하고 있습니다.
PackageManager.getPackageInfo("com.another.app", 0)NameNotFoundException 예외 발생PackageManager.getInstalledPackage(0)PackageManager.queryIntentActivities(intent, 0)변경에 영향을 받을 것으로 예상되는 API를 실제로 테스트해보기 위해 샘플 앱을 생성해 안드로이드 11 가상 디바이스에서 돌려보았습니다. Android 11 Beta 2.5 이미지를 사용했고, 샘플 앱의 코드는 여기서 확인할 수 있습니다. 테스트 대상 API는 위의 구글 밋업에서 소개된 API 4개, 그리고 추가로 이와 비슷한 역할을 API 2개를 선정했습니다.
<queries> 요소를 지정하지 않으면, NameNotFoundException이 발생합니다.<manifest package="...">
<queries>
<package android:name="com.android.chrome" />
<queries>
...
</manifest>
아래의 샘플 코드로 테스트한 결과입니다.
Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com")).let { intent ->
val list = packageManager.queryIntentActivities(intent, 0)
}
<queries> 요소를 지정하지 않으면 빈 리스트가 반환됩니다.<manifest package="...">
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
<queries>
...
</manifest>
2번 예제의 intent 그대로 테스트를 진행한 결과입니다.
<queries> 요소를 지정하지 않으면 null이 반환됩니다.<queries> 요소를 지정하지 않으면 자기 자신과 몇몇 시스템 필수 패키지만 반환됩니다.<queries> 요소에 특정 패키지 혹은 인텐트 필터를 지정하면, 해당하는 패키지도 추가로 반환됩니다.<queries> 요소를 지정하지 않으면 자기 자신과 몇몇 시스템 필수 패키지만 반환됩니다.<queries> 요소에 특정 패키지 혹은 인텐트 필터를 지정하면, 해당하는 패키지도 추가로 반환됩니다.Context.startActivity(intent)아래의 샘플 코드로 테스트한 결과입니다.
Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com")).let { i ->
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
i.setPackage("com.android.chrome")
context.startActivity(i)
}
<queries> 요소를 지정하지 않으면 ActivityNotFoundException이 발생합니다.지금까지 안드로이드 11의 변경사항 중 “패키지 공개 상태"에 대해 자세히 알아보았습니다. 안드로이드 11의 출시가 얼마 남지 않은 만큼, 다른 앱 개발자 여러분들도 자신의 앱을 테스트해보시고 빠르게 변경사항에 대한 호환성을 확보하시기 바랍니다.
안녕하세요, 버즈빌 Supply Platform 팀의 Jed입니다. 대규모 트래픽 환경에서 낮은 지연 시간과 높은 가용성은 중요한 요소입니다. 따라서 버즈빌에서는 “Single-digit millisecond performance at any scale” …
Read Article들어가며 안녕하세요 Supply 그룹 Product Backend 팀의 Elric 입니다. 버즈빌에서 운영중인 허니스크린은 새로운 프로모션을 지속적으로 출시하며 빈번한 배포가 진행되는 서비스이지만, 긴급 배포 상황에서 CI 파이프라인의 긴 실행 시간(약 13분)이 병목 …
Read Article