안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

스마트폰 쓰다가 점점 느려지는 느낌을 받아서 기본 어플 삭제 방법을 알려드리겠습니다

예전에는 루팅을 해서 삭제했는데 최근에는 adb를 이용해서 간단히 삭제하더군요

그리고 제 블로그도 많은 방문 부탁드립니다!!

(제 블로그 글 그대로 가져온거라 반말 이해 부탁드립니다)

--------------------------------------------------------------------------------------

핸드폰을 사면 기본적으로 깔려있는 앱이 있다.

통신사에서 설치해둔 앱이라던가 제조사에서 만든 앱이라던가 등등 쓸모없는 앱들이 많이 있다.

우리는 이것을 지워보려고 한다.

단, 우리는 루팅 없이 말이다.

그리고 모든 앱은 핸드폰 초기화를 하면 다시 정상적으로 설치되며 웬만한 경우가 아니면 복구가 가능하다.

당연하게도 OTA업데이트나 워런티 등등 유지가 된다.

만약 잘못된 시스템 앱을 삭제했다면, 공장초기화를 돌리기 전까지 시스템이 불안정해질수 있으므로 잘 판단하여 삭제를 하자.

1. PC에 ADB 설치하기

developer.android.com/studio/releases/platform-tools

위의 링크에 들어가서 

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

Window용 SDK 플랫폼 도구 다운로드를 해준다.

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

압축을 풀어준다.

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

해당 폴더에서 Shift + 우 클릭 후 "여기에 PowerShell 창 열기"를 클릭해준다.

2. USB 디버깅 설정하기

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

그리고 핸드폰 설정을 해주자.

설정 -> 휴대폰 정보 -> 소프트웨어 정보 에 들어가서 빌드번호 7번을 눌러주면 개발자 모드가 나오게 된다.

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

맨 밑에 개발자 옵션이라고 나오게 된다.

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

밑으로 내리다 보면 USB 디버깅이 나오게 된다.

이거를 켜주면 된다.

켜준후에 PC랑 핸드폰이랑 연결을 한다.

안드로이드 앱 강제 삭제 - andeuloideu aeb gangje sagje

내PC에서 이렇게 연결되어 있어야 한다.

다음글 보기 (클릭)

일단 기본적으로 꽤 위험할 수 있는 내용이라고 생각한다. 그럼에도 불구하고 부득이하게 이런 기술을 사용해야 하는 경우도 있으므로 내가 구현한 방법에 대해 정리해보려고 한다.

전체적인 루틴은 아래와 같다.

디바이스 관리자 권한 받음 -> UsageStatsManager를 이용한 현재 최상단의 화면 정보 가져옴 -> 디바이스 관리자 권한 제거 액티비티가 올라왔을 때 화면 전환

* 디바이스 관리자 권한을 얻으면? - 해당 디바이스를 제어할 수 있는 권한을 얻음 - 디바이스 관리자 권한을 받으면 강제종료 버튼이 비활성화 됨

* UsageStatsManager란? - 디바이스의 사용 기록 및 현재 상태에 대한 정보를 가지고 있는 Class - 이를 이용해 현재 최상단에 있는 액티비티의 클래스명을 가져올 수 있음

디바이스 관리자 권한을 획득하는 코드는 아래와 같다.

DevicePolicyManager mDPM;
ComponentName mAdminName;

mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
mAdminName = new ComponentName(this, AmayalockAdminReceiver.class);

if (!mDPM.isAdminActive(mAdminName)) {
  Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
  intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
  intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "안전한 환경을 위해 실행 버튼을 클릭해주세요");
  startActivityForResult(intent, 0);
}

아래는 현재 최상단에 있는 클래스명을 구하는 메소드이다.

public String getForegroundPackageNameClassNameByUsageStats() {
  String packageNameByUsageStats = "";
  String classByUsageStats = null;
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    @SuppressLint("WrongConstant") UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");
    final long INTERVAL = 1000;
    final long end = System.currentTimeMillis();
    final long begin = end - INTERVAL;
    final UsageEvents usageEvents = mUsageStatsManager.queryEvents(begin, end);
    
    while (usageEvents.hasNextEvent()) {
      UsageEvents.Event event = new UsageEvents.Event();
      usageEvents.getNextEvent(event);
      
      if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
        packageNameByUsageStats = event.getPackageName();
        classByUsageStats = event.getClassName();
        Log.d("asdf", "packageNameByUsageStats is " + packageNameByUsageStats + ", classByUsageStats is " + classByUsageStats);
      }
    }
  }
  if(classByUsageStats!= null) {
    if (classByUsageStats.equals("com.android.settings.DeviceAdminAdd")) {
      return "exit";
    }
  }
  else{
    return "null";
  }
}

위 코드 23번째 줄에서 보이는 "com.android.settings.DeviceAdminAdd" 가 디바이스 관리자를 해제하는 화면의 클래스명이다.

최초 디바이스 관리자 권한을 부여받고 난 뒤, 해당 앱을 삭제하기 위해선 반드시 디바이스 관리자를 해제한 후 삭제하게 되는데 이 디바이스 관리자 해제 창이 뜨는지 상시 체크한다면 해제 창이 떴을 때 다른 화면으로 전환하는 등의 조치를 통해 앱 삭제를 방지할 수 있다.