광고 예산 제어 시스템 개선기: Part 2 – 더 정교한 시스템, 그리고 성과
안녕하세요, 광고 엔진 팀의 Bale, 그리고 Liam입니다. 1편에서 버즈빌의 예산 제어 시스템 개선 여정과 가시성에 대해 얘기해 드렸는데요. 이번 편에서는 이전 시스템 수준 개선을 바탕으로 어떤 기능 개선과 비즈니스 임팩트를 만들었는지 소개 드리려 합니다. 1편의 …
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의 출시가 얼마 남지 않은 만큼, 다른 앱 개발자 여러분들도 자신의 앱을 테스트해보시고 빠르게 변경사항에 대한 호환성을 확보하시기 바랍니다.
안녕하세요, 광고 엔진 팀의 Bale, 그리고 Liam입니다. 1편에서 버즈빌의 예산 제어 시스템 개선 여정과 가시성에 대해 얘기해 드렸는데요. 이번 편에서는 이전 시스템 수준 개선을 바탕으로 어떤 기능 개선과 비즈니스 임팩트를 만들었는지 소개 드리려 합니다. 1편의 …
Read ArticleIntroduction 안녕하세요, 광고 엔진 팀의 Bale, 그리고 Liam입니다. 버즈빌 광고 플랫폼의 변천 과정을 소개해 드리는 시간입니다. 최근에는 수평 확장 가능한 광고 서버를 만드는 법에 대해 소개해 드렸는데요. …
Read Article