루트 액세스없이 설치된 앱의 APK를 얻으려면 어떻게합니까?


198

루트 권한없이 설치된 Android 앱의 APK 파일을 추출하려고합니다.

system-apps가 아닌 앱의 모든 APK 파일은 / data / app에 있으며이 폴더에 액세스하려면 루트 권한이 필요하기 때문에 이것이 불가능하다고 생각했습니다. 그런 다음 Google Play 스토어에 루팅되지 않은 기기에서도 APK 파일에 액세스 할 수있는 수많은 앱이 있음을 발견했습니다.

누군가 이것이 어떻게 가능한지 말해 줄 수 있습니까? 루트없이 APK 파일을 백업하는 백업 앱이 없습니까?


2
나는이 질문에 이미 답이 있다고 생각한다. 친절하게 stackoverflow.com/a/12197924/1016544를
Wahib Ul Haq




3
이것에 대한 나의 독서는 @pinas가 이것을 프로그래밍 방식으로 코딩하는 방법을 묻고 있다는 것입니다. "이 앱들은 어떻게합니까?"라고 말하는 것처럼 앱을 참조합니다. 여기에 "보류"이유가 내 의견으로는 잘못되었습니다.
Richard Le Mesurier

답변:


381

루트 권한없이 / data / app에 액세스 할 수 있습니다. 해당 디렉토리에 대한 권한은 rwxrwx--x입니다. 디렉토리에 대한 실행 권한은 디렉토리에 액세스 할 수 있음을 의미하지만 읽기 권한이 없다는 것은 컨텐츠 목록을 얻을 수 없음을 의미합니다. 디렉토리에 액세스하려면 액세스 할 파일 이름을 알아야합니다. 안드로이드의 패키지 관리자는 주어진 패키지에 저장된 APK의 이름을 알려줄 것입니다.

명령 행에서이를 수행하려면 adb shell pm list packages설치된 패키지 목록을 가져오고 원하는 패키지를 찾으십시오.

패키지 이름으로을 사용하여 실제 파일 이름과 APK의 위치를 ​​얻을 수 있습니다 adb shell pm path your-package-name.

그리고 전체 디렉토리를 알면 마침내 adb를 사용하여 adb pull full/directory/of/the.apk

롤리팝에서 apk 경로는 다음과 같습니다. /data/app/your-package-name-1/base.apk


33
명령 줄에서이 작업을 수행하려면, 사용 adb shell pm list packages, 설치 패키지 목록을 얻을에 추가, 원하는 패키지를 선택 -1.apk여기에, 그리고에서 잡아 당깁니다 /data/app. 예 : 패키지 이름이 org.mozilla.firefox인 경우을 사용하십시오 adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth 2016 년

11
APK의 실제 파일 이름을 얻으려면 adb shell pm path your-package-name을 사용하십시오. 보다 자세한 답변을 보려면이 질문을 참조하십시오 stackoverflow.com/questions/4032960/…
Yojimbo

2
롤리팝의 경우 apk 경로는 /data/app/your-package-name-1/base.apk
tarn

이것은 나를 위해 작동하지 않습니다. 다음과 같은 오류가 발생합니다.adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff

1
@ 0xcaff Android는이 답변이 제공된 후 5 년 동안 상당히 바뀌 었습니다. 아마도이 경로는 그러한 변화 중 하나 일 것입니다. OS 버전에 적합한 경로를 찾으려면 로그인하고 파일을 수동으로 찾을 수 있어야합니다.
mah

55

Android는 패키지 이름에 시퀀스 번호를 추가하여 최종 APK 파일 이름을 생성합니다 (Android OS 버전에 따라 다를 수 있음). 다음 명령 순서는 루트아닌 장치 에서 작동 합니다 .

  1. 원하는 패키지에 대한 APK 파일의 전체 경로 이름을 가져옵니다.

    adb shell pm path com.example.someapp

    출력은 다음과 같습니다 package:/data/app/com.example.someapp-2.apk.

  2. Android 기기에서 개발 상자로 APK 파일을 가져옵니다.

    adb pull /data/app/com.example.someapp-2.apk

성공적으로 뽑은 후 APK의 위치는 PC / 노트북의 ../sdk/platform-tools/base.apk에 있습니다.


4
이 솔루션이 루팅되지 않은 장치에서 작동했는지 확인할 수 있지만 첫 번째 명령 전에 패키지 이름에 대한 지식이 필요합니다! 원하는 앱의 패키지 이름을
모르는

풀러의 로컬 컴퓨터에서 APK가 들어가는 폴더는 무엇입니까? 편집 : nvm, adb 풀을 수행 할 때 있던 디렉토리가 무엇이든 ...
Adam Johns

@IgorGanapolsky adb 풀 /data/app/com.example.someapp-2/base.apk를 사용해보십시오
Chris-Jr

adb pull을 수행 한 후 @zelanix, 여기서 .apk 파일을 c 할 수 있습니다. 감사합니다
Vijaya Varma Lanke

22

설치된 앱 목록을 얻기 위해 ROOT 권한이 필요하지 않습니다.

안드로이드 PackageManager로 할 수 있습니다.

아래는 작은 코드 스 니펫입니다.

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}

7
  1. 설치된 apk 목록을 확인하십시오 (다음 명령은 설치된 경로와 패키지 이름도 나열 함). adb 쉘 오후 목록 패키지 -f
  2. 사용 ADB 풀 / package_path / 패키지 이름 / path_in_pc (패키지 경로와 패키지 이름 하나는 위의 명령 (1)에서 얻을 수 있습니다)

6

Android 용 Eclipse Development를 설치 한 경우 :

  • 장치를 디버깅 장치로 사용하십시오. 휴대 전화 : 설정> 애플리케이션> 개발 및 USB 디버깅 활성화에 대해서는 http://developer.android.com/tools/device.html을 참조 하십시오.
  • Eclipse에서 DDMS 창을여십시오 (창> 퍼스펙티브 열기> 기타 ...> DDMS, http://developer.android.com/tools/debugging/ddms.html 참조).
  • 장치가 보이지 않으면 장치 용 USB 드라이버를 다시 설치하십시오.
  • 가운데 창에서 "파일 탐색기"탭을 선택하고 시스템> 앱으로 이동하십시오.
  • 이제 하나 이상의 파일을 선택한 다음 상단의 "장치에서 파일 가져 오기"아이콘 (탭 오른쪽)을 클릭 할 수 있습니다
  • 대상 폴더 선택-tada!

/ system / app에는 시스템 앱 (일명 사전 설치된 앱) 만 있습니다.
arne.jans 2016 년

6

Nougat (7.0)에서 Android 버전을 실행 adb shell pm list packages하여 장치에 설치된 패키지를 나열합니다. 그런 다음 adb shell pm path your-package-nameAPK의 경로를 보여주기 위해 실행 하십시오. 사용 ADB 후 다운로드에 패키지를 복사합니다 adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. 그런 다음를 실행하여 APK를 다운로드에서 컴퓨터로 가져옵니다 adb pull /storage/emulated/0/Download/base.apk.


2

나는 does not exist error

작동 방식은 다음과 같습니다.

adb shell pm list packages -f | findstr zalo

package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo

adb shell

mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit


adb pull /sdcard/zalo.apk Desktop

/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)

0

List PackageManager.getInstalledApplications () 는 설치된 응용 프로그램의 목록을 제공하며 ApplicationInfo.sourceDir은 .apk 파일의 경로입니다.

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

0

루트가 아닌 장치에서 APK의 패키지 이름을 얻는 방법을 찾았습니다. 너무 우아하지는 않지만 항상 작동합니다.

1 단계 : 기기에서 대상 APK를 엽니 다.

2 단계 : PC cmd 창에서 다음 명령을 입력하십시오.

 adb shell dumpsys activity a > dump.txt

이 명령의 출력이 많으므로 파일로 리디렉션하는 것이 좋습니다.

3 단계 :이 덤프 .txt 파일을 편집기로 엽니 다.

Android 4.4
의 경우 파일의 시작 부분은 다음과 같습니다.

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

패키지 이름은 세 번째 줄, com.tencent.mm에 있습니다. 이 예 있습니다.

Android 4.4 이상 :
dumpsys 출력이 약간 변경되었습니다. "Stack # 1"을 검색하면 패키지 이름이 그 아래에 매우 가깝습니다.

또한 "baseDir"을 검색하면 APK 파일의 전체 경로를 찾을 수 있습니다!


-1

라이브러리 섹션에서 ES 탐색기-> 왼쪽 상단 모서리에서 메뉴 버튼을 누릅니다 (세 개의 가로 줄무늬)-> 라이브러리 섹션에서 APP를 선택합니다.

따라서 모든 사용자 앱 목록이 나타납니다. 앱을 찾아 길게 눌러 선택하십시오. 그런 다음 오른쪽 하단에서 "추가"를 누르고 "보내기"를 선택하십시오. 그런 다음 다른 옵션을 사용할 수 있습니다. 예를 들어 .apk 파일을 홈 디렉토리 나 다른 곳에 저장하기 위해 "ES 저장 위치"를 선택할 수 있습니다.


-2

또는 Google Play 에서 'Bluetooth 파일 전송'을 가져와 홈 폴더를로 설정할 수 /system/있습니다. 그런 다음로 이동할 수도 있습니다 /.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.