프로그래밍 놀이터/안드로이드, Java

[android] implicit broadcast - signature permission or FLAG_RECEIVVER_INCLUDE_BACKGROUND

돼지왕 왕돼지 2022. 12. 30. 13:02
반응형

-

안드로이드 가이드에 따르면 targetSdk 를 oreo 이상으로 설정할 경우,

implicit broadcast 에 발송에 대해 (대상이 명확하지 않은 broadcast)

static receiver 의 경우 수신할 수 없고,

dynamic receiver 의 경우 수신할 수 있다.

( 물론, 일부 broadcast 는 예외적이다. https://developer.android.com/guide/components/broadcast-exceptions )

 

 

-

Oreo 소스 기준 BroadcastQueue.java 의 processNextBroadcast 를 보면 아래 코드가 있다.

// ...
else if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)
       || (r.intent.getComponent() == null
           && r.intent.getPackage() == null
           && ((r.intent.getFlags()
                   & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0)
           && !isSignaturePerm(r.requiredPermissions))) {
   mService.addBackgroundCheckViolationLocked(r.intent.getAction(),
           component.getPackageName());
   Slog.w(TAG, "Background execution not allowed: receiving "
           + r.intent + " to "
           + component.flattenToShortString());
   skip = true;
// ...

이를 바탕으로 보면.. 명시적으로 flag 에 FLAG_RECEIVER_EXCLUDE_BACKGROUND (@hide) 가 있거나,

component 도 없고, package 도 없거나, FLAG_RECEIVER_INCLUDE_BACKGROUND (@hide) 도 없고,  signaturePermission 도 설정되어 있지 않은 경우에 skip 이 된다고 한다.

 

즉 implicit 가 아닌 조건으로 우리가 일반적으로 아는 것들은 component 나 package 가 설정되는 것이었는데,

Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND flag 를 넣어주거나 signature permission 을 설정하는 것도 유효할 수 있음을 알 수 있다.

 

 

-

그러나 FLAG_RECEIVER_INCLUDE_BACKGROUND 는 hide 된 녀석이기에 (const 로 쓸 수는 있지만) 제조사에서 충분한 권한이 없는 앱이 해당 flag 를 쓰는 것을 무시하는 처리를 할 수도 있고, signature permission 역시 제조사와 협의가 되어야 사용 가능하기 때문에, '아 이런 것이 있구나' 라는 것을 알기만 하면 될 듯 하다.

 

 

 

 

반응형