본문 바로가기

Android

[adb] 안드로이드 기기에 설치되어 있는 apk 파일 추출하는 방법

apk 추출로 검색을 해보면, 안드로이드 기기에 설치되어 있는 apk 파일 추출하는데 있어서, 어떤 앱을 안드로이드 기기에 새로 설치를 하는 방법이 많이 나오는데... 나는 앱 설치고 뭐고 그냥 apk 추출을 하고 싶다.

 

나의 경우는, 개발용 폰을 따로 지원 받았는데 내 Google 계정 로그인 하기도 싫고(나도 쓰고, 남도 쓰고, 다 돌려쓰는 단말이기에)해서 알아 보았다.

AOS 개발하는 사람들은 무조건 adb 설치되어 있을테니, 간단히 adb를 이용해서 추출하는 방법을 정리하고자 한다.


명령어는 아주 간단하게 다음과 같다.

adb pull [apk 설치되어 있는 경로] [apk 추출할 경로]

 

문제는 안드로이드 기기에 "apk 설치되어 있는 경로"를 어떻게 아냐..인데 그건 다음 명령어를 이용하면 된다.

adb shell pm list packages -f -3

 

옵션으로 적은 내용에 대한 다음과 같다.

  • -f : 패키지ㅣ명과 연관된 apk 파일 경로 보여줌(apk 추출을 위해 경로가 필요하므로 필수)
  • -3 : 시스템 패키지가 아닌 3rd 패키지만 보여줌 (옵션)
  • -s : 시스템 패키지만 보여줌 (옵션)

 

위 "adb shell pm" 명령어에  -3, -s 옵션 주지 않아도 출력은 되는데 필요한 부분만 간단하게 출력하고자 할 때 사용하면 된다. 만약 package 까지 안다고 하면, grep 명령어도 추가 작성하면 된다.

adb shell pm list pakcaegs -f | grep "XXXX"

 

자, 나는 블루투스 개발할 때 무조건 사용하는 nRF Connect apk를 추출하고자 한다. 개인용 폰에 설치되어 있는 nordic apk를 추출해서 개발용 폰에 설치하고자 한다.

일단 개인용 폰을 연결하고, "adb shell pm list packages -f"를 입력하면 다음과 같다.

옵션을 따로 주지 않아, 설치되어 있는 많은 리스트가 나오는데 형태를 보면 다음과 같다.

package:/.../.../app/XXX.XXX.XXX.apk=YYY.YYY.YYY

 

중요한 부분은 .apk 이전까지의 설치되어 있는 경로 부분이다. 일단 리스트가 너무 많으니 grep을 통해서 내가 필요한 부분만 보자.

 

apk 가 설치되어 있는 경로까지 알았으니 "adb pull" 명령어를 통해 추출해 보자.

adb pull /data/app/no.nordicsemi.android.mcp-wZ_s001ECLWEekRUwN6sdQ==/base.apk nRFConnect.apk

apk 가 잘 추출되었음을 알수 있고, 해당 apk 를 "adb install" 명령어를 통해 다른 디바이스에 설치하기만 하면 된다.


근데, 만약 adb install을 했는데 다음과 같은 에러가 뜬다면?

$ adb install nRFConnect.apk
Performing Streamed Install
adb: failed to install nRFConnect.apk: Failure [INSTALL_FAILED_VERIFICATION_FAILURE]

 

다음 명령어 작성해주고 다시 adb install 시도

adb shell settings put global verifier_verify_adb_installs 0

 

설치도 잘되었고, 물론 실행도 잘된다.