-
[Package] 안드로이드 11 Package VisibilityAndroid/Package 2021. 10. 20. 18:38
Android Storage 변경사항을 공부하다가 권한 사용법을 까먹어서 공부하다가 권한 사용법을 공부하다가 잠깐 PackageManager를 이용하는 법을 공부하다가 안드로이드 11 변경사항까지 와버렸다...
간단하게 이런 내용이다라는 정도로만 글을 남긴다
( 나중에 사용하는 경우에 공부해야지 현재 쓰지도 않는데 건드려봤자 또 까먹기...)PackageManager를 통해 다른 앱의 정보를 이용하는 경우가 있다고 한다.
안드로이드 11부터는 Package Visibility가 도입되어 패키지 공개 상태 변경사항이 적용된다고 한다.
안드로이드 11에서 돌아가는 앱에서는 디바이스에 설치된 다른 앱 목록을 알수없고
미리 매니페스트 파일에 쿼리할 패키지 이름 또는 인텐트 필터 서명을 <queries>로 지정하여야 한다.
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val packageManager = packageManager try { //디바이스에 설치된 다른 앱 - com.source.packages.queryallpackagestestapplication //다른 앱의 패키지 정보를 확인 val packageInfo = packageManager .getPackageInfo("com.source.packages.queryallpackagestestapplication", 0) log("다른 앱의 패키지 정보확인: $packageInfo") //안드로이드 10이하 //확인하고 싶은 앱이 디바이스에 설치되어있고 //정보를 가져오려하면 예외 발생하지 않음 } catch (e: Exception) { //안드로이드 11 //확인하고 싶은 앱이 깔려있고 //정보를 가져오려하면 package visibility 로 인해 예외 발생 log("패키지를 가져올 수 없습니다") if (e is PackageManager.NameNotFoundException) { log("PackageManager.NameNotFoundException") } } } private fun log(str: String) { Log.d("GET_PACKAGE_INFO_TEST", str) } }
API 29 (Android10)
API 30 (Android 11)
매니페스트에 패키지명에 해당하는 <queries> 태그 추가후
API 30 디바이스 확인
<queries>태그를 적절하게 사용할 수 없는 앱, 모든 패키지의 정보를 알아야하는 구글 서비스, 구글 플레이 같은 앱은 이러한 방법을 사용할 수 없다.
QUERY_ALL_PACKAGES 권한을 선언하는 경우 <queries>태그를 설정하지 않아도 되지만 정책을 적절하게 따르지 않는 경우에는 앱이 올라가지 않을 수도있다.
에러가 나지만 빌드와 앱 실행은 제대로 된다.... 쓸데없이 사용할 필요가 없다는 뜻으로 에러를 내는 것 같다...