본문 바로가기
Android

[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 21 - package visibility

by 들풀민들레 2022. 5. 9.

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.

 

 

본 글은 [깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강(www.ssamz.com)을 통해 확인해 주세요.

 

11.2.4. 패키지 공개 상태


bindService ()로 외부 앱을 연동할 때는 패키지 정보를 지정해주어야 합니다. 외부 앱을 연동하려면
패키지 정보에 접근하기 위해 패키지 공개 상태(package visibility)라는 개념이 필요합니다. 외부 앱을
연동하는 경우에 항상 필요하지는 않지만, 외부 앱의 패키지 정보에 접근해야 한다면 꼭 사용해야 하는
개념입니다. 대표적으로 다음의 함수를 이용해 패키지 정보에 접근합니다.

  • PackageManager.getPackageInfo()
  • PackageManager.queryIntentActivities()
  • Intent.resolveActivity()
  • PackageManager.getInstalledPackages()
  • PackageManager.getInstalledApplications()
  • bindService()


패키지 공개 상태란 AndroidManifest.xml 파일에 접근하고자 하는 외부 앱의 패키지 정보를
명시적으로 선언하는 것을 의미합니다. 예를 들어, 아래의 코드를 패키지 공개 상태 설정 없이
실행했다고 가정해봅시다.

 

try {
	PackageInfo packageInfo = getPackageManager().getPackageInfo("com.example.test4_outter", 0);
	String versionName = packageInfo.versionName;
	Log.d("kkang", versionName);
}catch (Exception e){
	e.printStackTrace();
}

Android 10 버전까지는 위의 코드가 정상적으로 실행됩니다. 하지만 11 버전 이상부터 아래의 에러가
발생합니다.

 

android.content.pm.PackageManager$NameNotFoundException: com.example.test4_outter

AndroidManifest.xml 파일에 아래의 설정을 추가하여 패키지 공개 상태를 설정하면 이 에러를
해결할 수 있습니다.

 

<manifest 생략 >
<queries>
<package android:name="com.example.test4_outter" />
</queries>
<!-- 생략 -->
</manifest>

<package> 태그를 이용하여 접근하고자 하는 앱의 패키지명을 명시적으로 선언한 후 사용합니다.
만약 여러 앱의 패키지 정보에 접근해야 한다면 위의 코드처럼 작성하지 않고 모든 외부 앱의 패키지
정보에 접근 허용을 해달라는 퍼미션을 선언해도 됩니다.

 

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

이렇게 퍼미션 선언으로 외부 앱의 패키지 정보에 접근할 수도 있지만, 권장사항은 <package> 태그를
이용하는 방식입니다.

 

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.