Android에서 숨김 처리된 앱의 원인과 확인 방법

안녕하세요. 미뇽입니다.

안드로이드 어플리케이션을 개발하다 보면, 기존에 설치되어 있던 어플리케이션이 사라졌다는 컴플레인이 발생할 수 있습니다. 오늘은 이렇게 안드로이드 스마트폰에서 앱이 사라졌을 때, 그 원인이 숨김 처리 때문인지 확인하고 어떻게 다시 보이게 할 수 있는지 그 방법을 알아보려고 합니다. IT 개발자로서 시스템 로그를 들여다보는 일이 잦은데, 이런 현상의 원인을 파악하는 과정이 나름 흥미로워서 여러분께도 공유해 드리고 싶었어요.

왜 내 앱이 사라졌을까? 앱 숨김의 다양한 원인들

앱이 보이지 않는다고 해서 무조건 삭제된 것은 아닙니다. 여러 가지 이유로 ‘숨김’ 상태가 될 수 있는데요. 가장 흔한 경우는 다음과 같습니다.

  • 실수로 숨김 기능 사용: 런처나 기기 자체의 앱 숨김 기능을 사용자가 자신도 모르게 활성화했을 수 있습니다.
  • 자녀 보호 기능: 부모가 자녀의 스마트폰 사용을 관리하기 위해 특정 앱을 숨기거나 사용 시간을 제한하는 경우입니다. (Google Family Link 등이 대표적이죠)
  • 보안 솔루션 또는 기업 정책: 회사에서 지급한 업무용 폰의 경우, 보안 정책에 따라 특정 앱의 사용이 제한되거나 숨겨질 수 있습니다.

그렇다면 실제로 내 앱이 숨김 처리된 것인지, 그리고 누가 또는 무엇이 숨겼는지 어떻게 확인할 수 있을까요? 지금부터 조금은 기술적인 내용이 포함될 수 있지만, 최대한 쉽게 풀어서 설명해 드릴게요!

패키지 상태로 앱 숨김 여부 확인하기

가장 먼저 앱이 실제로 설치되어 있는지, 그리고 숨김 상태인지 확인해야 합니다. 개발자 도구 중 하나인 ADB(Android Debug Bridge) 명령어를 사용하면 정확한 상태를 알 수 있습니다.

PC의 터미널이나 명령 프롬프트에서 아래 명령어를 입력합니다. 여기서 [패키지명] 부분에는 확인하고 싶은 앱의 고유한 이름을 넣어주어야 합니다.

adb shell dumpsys package [패키지명]

ℹ️ 팁: 앱의 패키지명을 정확히 모를 때는 어떻게 하냐구요? 보통 스마트폰 설정 메뉴의 ‘애플리케이션’ 정보에 들어가면 확인하거나, 구글 플레이 스토어에서 해당 앱 페이지 URL의 id= 뒷부분을 보면 그게 바로 패키지명인 경우가 많습니다!

명령어를 실행하면 여러 정보가 출력되는데, 그중 아래와 비슷한 부분을 찾아보세요.

Package [com.some.application] (aac5308):
..
  User 0: ceDataInode=9505 deDataInode=2079 installed=true hidden=true ...

여기서 중요한 것은 두 가지입니다.

  • installed=true: 앱이 기기에 정상적으로 설치되어 있다는 뜻입니다.
  • hidden=true: 해당 앱이 사용자에게 보이지 않도록 숨김 처리되어 있다는 의미입니다.

만약 hidden=true로 나온다면, 앱은 삭제된 것이 아니라 숨겨진 상태인 것이죠!

Device Policy로 숨김 원인 추적하기

앱이 숨김 처리된 것을 확인했다면, 이제 그 원인을 파악할 차례입니다. 대부분의 경우 디바이스 정책(Device Policy) 에 의해 제어되고 있을 가능성이 큽니다. 이 정책은 기기 관리자 권한을 가진 앱(예: 자녀 보호 앱, 회사 보안 앱)이 설정하게 됩니다.

dumpstate라는 명령어를 통해 시스템 전체의 상태 정보를 가져올 수 있는데, 여기서 device_policy 서비스의 내용을 살펴보면 단서를 찾을 수 있습니다. (이 명령어는 생성되는 로그 파일의 양이 매우 방대하므로, 특정 섹션만 확인하는 것이 좋습니다. 또는 전체 로그에서 DUMP OF SERVICE device_policy를 검색해보세요.)

DUMP OF SERVICE device_policy:
...
Current Device Policy Manager state:
  Immutable state:
    mHasFeature=true
    mIsWatch=false
    mIsAutomotive=false
    mHasTelephonyFeature=true
    mSafetyChecker=null
  Profile Owner (User 0): 
    admin=ComponentInfo{com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver}
    package=com.google.android.gms.supervision
    isOrganizationOwnedDevice=false

위 로그에서 우리가 주목해야 할 부분은 다음과 같습니다.

  • Immutable state: mHasFeature=true: 디바이스 정책 관리자 기능이 활성화되어 있다는 의미입니다.
  • Profile Owner (User 0): admin=ComponentInfo{com.google.android.gms.supervision/...}: 이 기기의 프로필 소유자(관리자)가 com.google.android.gms.supervision이라는 패키지의 특정 컴포넌트임을 알려줍니다. 패키지 이름에 ‘supervision'(감독)이라는 단어가 들어있는 것을 보면, Google의 자녀 보호 기능(Family Link 등)과 관련되어 있을 가능성이 매우 높다는 것을 짐작할 수 있습니다.

마치 탐정이 현장의 작은 단서들을 모아 범인을 찾아내듯, 복잡해 보이는 시스템 로그 속에서 특정 키워드나 패키지명을 통해 문제의 원인을 유추해 나가는 과정이 IT 개발자에게는 꽤나 흥미로운 작업 중 하나랍니다. 처음에는 외계어처럼 보일 수 있지만, 자꾸 보다 보면 익숙해지고 나름의 규칙도 보이게 되죠.

내 앱에 적용된 특정 정책 확인하기

이제 어떤 관리자가 내 앱을 숨겼는지 구체적으로 확인해 보겠습니다. device_policy 덤프 내용 중에서 Local Policies 섹션을 찾아보면 됩니다.

Current Device Policy Manager state:
  Immutable state:
  ...
  Local Policies:
    User 0:
      PackagePolicyKey{mPolicyKey= applicationHidden; mPackageName= com.google.android.videos}
      ....
      PackagePolicyKey{mPolicyKey= applicationHidden; mPackageName= com.some.application}
        Per-admin Policy:
          EnforcingAdmin { mPackageName= com.google.android.gms.supervision, mComponentName= ComponentInfo{com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver}, mAuthorities= [enterprise], mUserId= 0, mIsRoleAuthority= false }
            BooleanPolicyValue { mValue= true }
        Resolved Policy (MostRestrictive):
          BooleanPolicyValue { mValue= true }

이 로그는 다음과 같은 중요한 정보를 담고 있습니다.

  • PackagePolicyKey{mPolicyKey= applicationHidden; mPackageName= com.some.application}: 우리가 찾던 앱(com.some.application)에 대해 applicationHidden(앱 숨김) 정책이 적용되어 있음을 나타냅니다.
  • EnforcingAdmin { mPackageName= com.google.android.gms.supervision, ... }: 이 숨김 정책을 강제하고 있는 관리자 앱이 com.google.android.gms.supervision (앞서 확인했던 Google 감독 기능 관련 패키지)임을 명확히 알려줍니다.
  • BooleanPolicyValue { mValue= true }: 최종적으로 이 정책의 값은 true로, 즉 앱이 숨김 처리된 상태가 맞다는 결론입니다.

저도 예전에 아이들 스마트폰 사용 관리를 위해 Family Link 앱을 사용해 본 적이 있는데요, 특정 앱의 사용 시간을 제한하거나 필요에 따라 숨김 처리를 했던 경험이 있습니다. 그때 스마트폰 내부에서는 바로 이런 원리로 동작하고 있었던 것이죠. 직접 설정을 해보니 내부 동작 방식이 더 잘 이해되더라고요.

숨김 처리된 앱, 어떻게 다시 보이게 할까? (해결 방법)

원인을 파악했으니 이제 해결 방법을 알아봐야겠죠? 위 사례처럼 Google의 자녀 보호 기능에 의해 앱이 숨김 처리된 경우, 다음과 같은 방법으로 해제할 수 있습니다.

  1. Google Family Link 앱에서 설정 변경: 자녀 계정을 관리하는 부모 계정으로 Family Link 앱에 접속하여, 해당 자녀의 기기에서 앱 숨김 설정을 해제하거나 사용 제한을 풀어줄 수 있습니다.
  2. 디바이스 정책 관리자 비활성화 (신중하게!): 스마트폰 설정의 ‘보안’ 또는 ‘기타 보안 설정’ 메뉴에서 ‘디바이스 관리자 앱’ (또는 유사한 이름) 목록을 찾아 해당 관리자 앱(예: Family Link, 회사 보안 앱 등)을 비활성화할 수 있습니다. 하지만 이 경우 앱 숨김뿐 아니라 다른 관리 기능도 모두 해제될 수 있으므로 신중하게 결정해야 합니다. 특히 회사 보안 앱의 경우 임의로 비활성화하면 보안 규정 위반이 될 수도 있습니다.
  3. 감독 기능 자체를 비활성화: 자녀 계정의 감독 기능을 완전히 중지하는 방법도 있습니다. 이 역시 부모 계정의 동의 및 설정 변경이 필요합니다.

만약 앱 숨김의 원인이 회사에서 지급한 스마트폰의 보안 정책 때문이라면, 가장 안전하고 확실한 방법은 회사의 IT 지원팀이나 보안 담당자에게 문의하는 것입니다. 임의로 설정을 변경하려다 오히려 다른 문제를 일으키거나 회사 정책을 위반하게 될 수도 있으니 주의해야 합니다.

마무리하며

오늘은 안드로이드 스마트폰에서 갑자기 앱이 사라졌을 때, 숨김 처리된 경우의 원인을 진단하고 확인하는 방법에 대해 조금은 깊이 있게 살펴보았습니다. ADB 명령어니, 시스템 로그니 하는 조금은 낯선 용어들이 등장했지만, 차근차근 따라오셨다면 숨겨진 앱 뒤에는 이런 복잡한 시스템이 동작하고 있다는 것을 이해하시는 데 도움이 되셨으리라 생각합니다.

저도 처음 이런 시스템 로그들을 접했을 때는 마치 암호 해독을 하는 기분이었는데요. 하나씩 그 의미를 파악하고 문제 해결의 실마리를 찾아낼 때마다 IT 개발자로서 큰 보람과 재미를 느끼곤 합니다. 단순한 현상 이면에 숨겨진 기술적 원리를 이해하는 것은 언제나 즐거운 일인 것 같아요.

혹시 여러분도 오늘 내용과 관련해서 비슷한 경험을 하셨거나, “내 폰에서는 이런 증상이 있는데 이건 뭘까요?” 하는 궁금증이 있으시다면 언제든지 댓글로 남겨주세요. 함께 이야기 나누면서 문제를 해결해 나갈 수도 있고, 저도 새로운 것을 배울 수 있는 좋은 기회가 될 것 같습니다!

읽어주셔서 감사합니다. 🙂

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤