Làm cách nào để có được APK của ứng dụng đã cài đặt mà không cần quyền truy cập root?


196

Tôi đang cố trích xuất tệp APK của ứng dụng Android đã cài đặt mà KHÔNG CÓ quyền root.

Tôi nghĩ rằng điều này là không thể, bởi vì tất cả các tệp APK cho các ứng dụng không thuộc hệ thống đều nằm trong / data / app và việc truy cập thư mục này cần có quyền root. Sau đó, tôi thấy rằng có rất nhiều ứng dụng trong cửa hàng Google Play dường như có quyền truy cập vào các tệp APK ngay cả trên các thiết bị chưa root.

Ai đó có thể cho tôi biết làm thế nào điều này là có thể? Không có ứng dụng sao lưu nào sao lưu các tệp APK mà không cần root?


2
Tôi nghĩ rằng câu hỏi này đã được trả lời. Vui lòng xem qua stackoverflow.com/a/12197924/1016544
Wahib Ul Haq




3
Tôi đọc được điều này là @pinas đã hỏi cách viết mã này theo chương trình - các ứng dụng tham chiếu làm như thể nói "Những ứng dụng này làm điều đó, nhưng làm thế nào?". Lý do "tạm dừng" ở đây là sai theo quan điểm của tôi vì điều đó.
Richard Le Mesurier

Câu trả lời:


380

Truy cập / dữ liệu / ứng dụng là có thể mà không cần sự cho phép root; các quyền trên thư mục đó là rwxrwx - x. Thực thi quyền trên một thư mục có nghĩa là bạn có thể truy cập nó, tuy nhiên thiếu quyền đọc có nghĩa là bạn không thể có được danh sách nội dung của nó - vì vậy để truy cập vào nó, bạn phải biết tên của tệp mà bạn sẽ truy cập. Trình quản lý gói của Android sẽ cho bạn biết tên của apk được lưu trữ cho một gói nhất định.

Để làm điều này từ dòng lệnh, sử dụng adb shell pm list packages để lấy danh sách các gói đã cài đặt và tìm gói mong muốn.

Với tên gói, chúng tôi có thể lấy tên tệp thực tế và vị trí của APK bằng cách sử dụng adb shell pm path your-package-name .

Và biết thư mục đầy đủ, cuối cùng chúng ta cũng có thể kéo adb bằng cách sử dụng adb pull full/directory/of/the.apk

Tín dụng cho @tarn để chỉ ra rằng trong Lollipop, đường dẫn apk sẽ là /data/app/your-package-name-1/base.apk


33
Để thực hiện việc này từ dòng lệnh, sử dụng adb shell pm list packagesđể lấy danh sách các gói đã cài đặt, chọn gói mong muốn, nối -1.apkvào đó và kéo nó từ đó /data/app. Ví dụ: Nếu tên gói là org.mozilla.firefox, sử dụng adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth

11
Để có được tên tệp thực tế của APK, hãy sử dụng đường dẫn adb shell pm tên gói của bạn. Xem câu hỏi này để biết câu trả lời chi tiết hơn stackoverflow.com/questions
4032960 / từ

2
cho kẹo các gói ứng dụng con đường sẽ /data/app/your-package-name-1/base.apk
Tarn

Điều này không làm việc cho tôi. Tôi nhận được lỗi sau:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff

1
@ 0xcaff Android đã thay đổi khá nhiều trong 5 năm kể từ khi câu trả lời này được cung cấp; có lẽ con đường này là một trong những thay đổi đó. Bạn sẽ có thể đăng nhập và định vị tệp theo cách thủ công để đưa ra bất kỳ đường dẫn nào phù hợp với phiên bản os của bạn.
gỗ

55

Android sẽ thêm số thứ tự vào tên gói để tạo tên tệp APK cuối cùng (có thể điều này thay đổi theo phiên bản HĐH Android). Chuỗi lệnh sau hoạt động trên thiết bị chưa root :

  1. Lấy tên đường dẫn đầy đủ của tệp APK cho gói mong muốn.

    adb shell pm path com.example.someapp

    Điều này cho đầu ra là : package:/data/app/com.example.someapp-2.apk.

  2. Kéo tệp APK từ thiết bị Android vào hộp phát triển.

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

Vị trí của APK sau khi kéo thành công sẽ là ../sdk/pl platform-tools / base.apk trên máy tính / máy tính xách tay của bạn.


4
Có thể xác nhận giải pháp này hoạt động trên một thiết bị chưa root, tuy nhiên không yêu cầu kiến ​​thức về tên gói trước lệnh đầu tiên! Sử dụng 'gói adb shell pm' để có danh sách tất cả các gói trên điện thoại nếu bạn không chắc chắn về tên gói của ứng dụng bạn muốn
AndroidNoob

Apk trên máy tính cục bộ của apk nào? EDIT: nvm, bất cứ thư mục nào bạn có trong khi thực hiện thao tác kéo adb ...
Adam Johns

@IgorGanapolsky hãy thử sử dụng adb pull /data/app/com.example.som Ứng dụng
Chris - Jr

@zelanix sau khi thực hiện thao tác kéo adb, trong đó tôi có thể c tệp .apk. Cảm ơn bạn
Vijaya Varma Lanke

21

Bạn không cần quyền ROOT để nhận danh sách Ứng dụng đã cài đặt.

Bạn có thể làm điều đó với Gói Trình quản lý Android.

Dưới đây là một đoạn mã nhỏ.

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. kiểm tra danh sách các apk đã cài đặt (lệnh sau cũng liệt kê đường dẫn nơi nó được cài đặt và tên gói). adb shell pm danh sách gói -f
  2. sử dụng adb pull / package_path / tên gói / path_in_pc (đường dẫn gói và tên gói mà người ta có thể nhận được từ lệnh trên 1.)

6

Khi bạn đã cài đặt phát triển Eclipse cho Android:

  • Sử dụng thiết bị của bạn làm thiết bị gỡ lỗi. Trên điện thoại của bạn: Cài đặt> Ứng dụng> Phát triển và bật gỡ lỗi USB, hãy xem http://developer.android.com/tools/device.html
  • Trong Eclipse, mở cửa sổ DDMS: Cửa sổ> Mở phối cảnh> Khác ...> DDMS, xem http://developer.android.com/tools/debugging/ddms.html
  • Nếu bạn không thể thấy thiết bị của mình, hãy thử (cài đặt lại) Trình điều khiển USB cho thiết bị của bạn
  • Trong ngăn giữa, chọn tab "File Explorer" và đi đến hệ thống> ứng dụng
  • Bây giờ bạn có thể chọn một hoặc nhiều tệp và sau đó nhấp vào biểu tượng "Kéo tệp từ thiết bị" ở trên cùng (bên phải các tab)
  • Chọn thư mục đích - tada!

Chỉ có các ứng dụng hệ thống (còn gọi là ứng dụng được cài đặt sẵn) trong / system / app.
arne.jans

6

Trên Nougat (7.0) phiên bản Android chạy adb shell pm list packagesđể liệt kê các gói được cài đặt trên thiết bị. Sau đó chạy adb shell pm path your-package-nameđể hiển thị đường dẫn của apk. Sau khi sử dụng adb để sao chép gói vào Tải xuống adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Sau đó kéo apk từ Tải xuống máy của bạn bằng cách chạy adb pull /storage/emulated/0/Download/base.apk.


2

tôi có một does not exist error

Đây là cách tôi làm cho nó hoạt động:

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

Danh sách PackageManager.getInstalledAppluggest () sẽ cung cấp cho bạn danh sách các ứng dụng đã cài đặt và ApplicationInfo.sourceDir là đường dẫn đến tệp .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

Tôi đã tìm thấy một cách để có được tên gói của APK trong một thiết bị không root. Nó không quá thanh lịch, nhưng hoạt động mọi lúc.

Bước 1 : trên thiết bị của bạn, mở APK mục tiêu

Bước 2 : trên cửa sổ cmd PC, gõ lệnh này:

 adb shell dumpsys activity a > dump.txt

bởi vì đầu ra của lệnh này là rất nhiều, nên chuyển hướng đến một tệp.

Bước 3 : mở tệp dump.txt này với bất kỳ trình soạn thảo nào.

đối với thiết bị cho Android 4.4:
phần đầu của tệp sẽ trông như thế này:

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 

Tên gói nằm trong dòng thứ 3, com.tencent.mm cho ví dụ này.

cho Android 4.4 trở lên:
sản lượng dumpsys đã thay đổi một chút. hãy thử tìm kiếm "Stack # 1", tên gói sẽ rất gần bên dưới nó.

Ngoài ra, tìm kiếm "baseDir", bạn sẽ tìm thấy đường dẫn đầy đủ của tệp apk!


-1

Mở ES explorer -> ấn ​​nút Menu ở góc trên bên trái (ba sọc ngang) -> trong phần Thư viện chọn Ứng dụng.

Do đó, bạn có được danh sách tất cả các ứng dụng người dùng. Tìm ứng dụng của bạn và chọn nó với thời gian dài đẩy nó. Sau đó nhấn "Khác" ở góc thấp bên phải và chọn "Gửi". Sau đó, bạn có thể sử dụng các tùy chọn khác nhau, ví dụ: bạn có thể chọn "ES Save To" để lưu tệp .apk vào thư mục chính của bạn hoặc bất kỳ nơi nào khác.


-2

Hoặc bạn có thể nhận 'Chuyển tệp Bluetooth' từ Google Play và đặt thư mục chính thành /system/. Sau đó, bạn thậm chí có thể đi đến /.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.