Làm cách nào để có được tệp apk từ thiết bị Android? Hoặc làm cách nào để chuyển tệp apk từ thiết bị sang hệ thống?
Làm cách nào để có được tệp apk từ thiết bị Android? Hoặc làm cách nào để chuyển tệp apk từ thiết bị sang hệ thống?
Câu trả lời:
Sử dụng adb . Với adb pull, bạn có thể sao chép các tập tin từ thiết bị sang hệ thống của mình, khi thiết bị được gắn với USB.
Tất nhiên bạn cũng cần có quyền để truy cập vào thư mục mà tập tin của bạn đang ở. Nếu không, bạn sẽ cần phải root thiết bị trước.
Nếu bạn thấy rằng nhiều APK được đặt tên là "base.apk", bạn cũng có thể sử dụng lệnh một dòng này để kéo tất cả APK khỏi điện thoại mà bạn có thể truy cập trong khi đổi tên bất kỳ tên "base.apk" nào thành tên gói. Điều này cũng khắc phục sự cố không tìm thấy thư mục cho các đường dẫn APK với các ký tự dường như ngẫu nhiên sau tên:
for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done
Nếu bạn nhận được "adb: error: fail to stat remote object" cho biết bạn không có quyền cần thiết. Tôi đã chạy nó trên một chiếc Moto Z2 đã root và không thể tải xuống TẤT CẢ các APK mà tôi đã không gỡ cài đặt (xem bên dưới) ngoại trừ youtube.
adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills presidential alert app!
(để xem người dùng chạy adb người dùng danh sách vỏ pm) Đây là một cách để loại bỏ / bỏ cài đặt (không phải từ điện thoại như nó trở lại với factory reset) gần như bất kỳ ứng dụng mà không ứng dụng gốc hệ thống BAO GỒM (gợi ý ứng dụng cập nhật gây phiền nhiễu mà cập nhật điện thoại của bạn dòng nó hoặc không có thể được tìm thấy bằng cách grepping cho "ccc")
adb shell pm list packages
và đường dẫn đầy đủ của nó adb shell pm path your.package.name
sau đó từ máy tính của bạn, bạn có thể chỉ cầnadb pull /full/path/to/your.apk
Không có gợi ý nào trong số này làm việc cho tôi, vì Android đã thêm số thứ tự vào tên gói để tạo tên tệp APK cuối cùng. Trên các phiên bản gần đây hơn của Android (Oreo và Pie), một chuỗi ngẫu nhiên không thể đoán trước được thêm vào. Chuỗi lệnh sau đây là những gì làm việc cho tôi trên một thiết bị không root :
1) Xác định tên gói ứng dụng, ví dụ: "com.example.someapp". Bỏ qua bước này nếu bạn đã biết tên gói.
adb shell pm list packages
Xem qua danh sách các tên gói và cố gắng tìm sự trùng khớp giữa ứng dụng được đề cập và tên gói. Điều này thường là dễ dàng, nhưng lưu ý rằng tên gói có thể hoàn toàn không liên quan đến tên ứng dụng. Nếu bạn không thể nhận ra ứng dụng từ danh sách tên gói, hãy thử tìm ứng dụng trong Google Play bằng trình duyệt. URL cho một ứng dụng trong Google Play chứa tên gói.
2) 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
Đầu ra sẽ trông giống như
gói: /data/app/com.example.som Ứng dụng-2.apk
hoặc
gói: /data/app/com.example.somản-nFSFSVxn_CTafgra3Fr_rXQ == / base.apk
3) Sử dụng tên đường dẫn đầy đủ từ Bước 2, kéo tệp APK từ thiết bị Android sang hộp phát triển.
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
pm list packages
hỗ trợ -f
cờ, liệt kê vị trí của .apk cho bạn, như thế nào package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps
. Trợ giúp pm tích hợp là vô ích, nhưng pm cũng có thể lọc các loại gói, hãy xem developer.android.com/studio/command-line/adb.html#pm để biết thêm thông tin. EDIT: chỉ cần nhận thấy rằng các câu trả lời dưới đây cho biết điều này, nhưng câu trả lời đó là gần như không bỏ phiếu tán như thế này.
adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist
. Nếu tôi duyệt các thư mục này bằng trình duyệt tệp, các thư mục trống.
adb shell
và sau đó cp PathToApk /sdcard/
và sau đó sao chép từ sdcard.
Không có rễ được yêu cầu:
Mã này sẽ có đường dẫn gói bên thứ 3 với tên để bạn có thể dễ dàng xác định APK của mình
adb shell pm list packages -f -3
đầu ra sẽ là
gói: /data/app/XX.XX.XX.apk=YY.YY.YY
Bây giờ hãy kéo gói đó bằng mã bên dưới:
adb pull /data/app/XX.XX.XX.apk
nếu bạn thực hiện trên cmd trong C:>\
, thì bạn sẽ tìm thấy gói đó ở đó.
-f -s
thay vì-f -3
Tôi đã thấy rằng nhiều giải pháp cho vấn đề này hoặc là bạn phải root điện thoại hoặc bạn phải cài đặt một ứng dụng. Sau đó, sau khi googling nhiều, tôi đã có giải pháp này cho điện thoại không root / root.
Để liệt kê những ứng dụng bạn đã nhận được cho đến nay.
adb shell pm list packages
Sau đó, bạn có thể chọn một ứng dụng, ví dụ twitter
adb backup -apk com.twitter.android
Một điều quan trọng ở đây là không thiết lập mật khẩu để mã hóa bản sao lưu của bạn
Điều này sẽ tạo một tệp có tên là backup.ap, nhưng bạn vẫn không thể mở nó. Đối với điều này, bạn phải giải nén nó một lần nữa nhưng sử dụng lệnh dd.
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
Sau đó, tất cả những gì bạn phải làm là trích xuất nội dung tar và thế là xong.
Hy vọng nó hoạt động cho các bạn
Các bước để Tải APK từ thiết bị đến máy tính để bàn
A) Hãy chắc chắn rằng bạn đang chạy (emulator / Device thực). Để kiểm tra sử dụng lệnh này
adb devices
B) Chọn tất cả danh sách gói có sẵn được cài đặt trong thiết bị của bạn. Bạn có thể sử dụng lệnh grep để chọn gói cụ thể mà bạn định tải xuống.
adb shell pm list packages
adb shell pm list packages -f -3
Đầu ra (Danh sách các gói có sẵn)
package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication
C) Sao chép gói (mà bạn muốn tải xuống) từ liên kết trên. Hình thành trường hợp của chúng tôi Tôi chọn gói này (com.example.myapplication)
Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
Đầu ra
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
D) Cuối cùng, Để tải xuống APK từ (trình giả lập / thiết bị thực) của bạn
Syntax : adb pull /data/app/[your_package_name]-1/base.apk [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk
Ví dụ: Đang cố gắng kéo tệp CertInstaller.apk này trong máy cục bộ của bạn (Mac)
adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
E) Xác nhận trong thư mục địa phương của bạn
ls -la /Users/$(whoami)/Documents/
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp
C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in
2.269s)
Một lớp lót hoạt động cho tất cả các phiên bản Android:
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Hoàn thành câu trả lời @Yojimbo 's, đây là những gì tôi đã làm (Linux / Mac chỉ, sẽ không làm việc ra khỏi hộp trên Windows ... có lẽ trong vỏ bash git):
for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done
Đây là bash xấu xí, nhưng hoạt động :)
EDIT: Nó không còn hoạt động trên AndroidM: tất cả các tập tin được đặt tên là "base.apk" dưới dir khác. Nên "tầm thường" để sửa chữa.
Trên các hệ thống unix, bạn có thể thử chức năng này:
function android_pull_apk() {
if [ -z "$1" ]; then
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
return 1
fi
if [ -z "$(adb shell pm list packages | grep $1)" ]; then
echo "You are typed a invalid package!"
return 1
fi
apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="$HOME/Documents/Android/APKs"
mkdir -p "$destination"
adb pull ${apk_path} ${destination}
echo -e "\nAPK saved in \"$destination/$apk_name\""
}
android_pull_apk com.android.contacts
adb shell pm list packages
Như đã nói ở trên, bạn có thể lấy apk bằng cách sử dụng lệnh pull trong adb.
Vì, bạn đang nói về các ứng dụng đã cài đặt của mình, hãy tiếp tục và xem trong thư mục / data / app của hệ thống tệp Android của bạn. Bạn sẽ tìm thấy APK ở đó.
Sau đó sử dụng lệnh adb - adb pull /data/data/appname.apk
Hãy thử lệnh bash liner này để sao lưu tất cả các ứng dụng của bạn:
for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done
Lệnh này được bắt nguồn từ kịch bản của Firelord . Tôi chỉ đổi tên tất cả các apks thành tên gói của họ để giải quyết vấn đề với tập lệnh của elcuco , tức là giống nhaubase.apk
tệp bị ghi đè trên Android 6.0 "Marshmallow" trở lên.
Lưu ý rằng lệnh này chỉ sao lưu các ứng dụng của bên thứ 3, vì tôi không thấy điểm sao lưu các ứng dụng tích hợp. Nhưng nếu bạn muốn ứng dụng hệ thống sao lưu quá, chỉ cần bỏ qua các -3
tùy chọn.
Nếu bạn biết (hoặc nếu bạn có thể "đoán") đường dẫn đến .apk
( dường như nó có định dạng /data/app/com.example.someapp-{1,2,..}.apk
, thì bạn có thể sao chép nó từ/data/app
. Điều này hoạt động ngay cả trên điện thoại Android gốc, không root của tôi.
Chỉ cần sử dụng ứng dụng Trình mô phỏng đầu cuối (chẳng hạn như ứng dụng này ) và chạy:
# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/
Sau đó, bạn có thể di chuyển nó từ thẻ SD đến bất cứ nơi nào bạn muốn (hoặc đính kèm nó vào email, v.v.). Bit cuối cùng có thể là tùy chọn về mặt kỹ thuật, nhưng nó giúp cuộc sống của bạn dễ dàng hơn rất nhiều khi cố gắng làm điều gì đó với .apk
tệp.
Các quy trình được nêu ở đây không hoạt động cho Android 7 (Nougat) [và có thể là Android 6, nhưng tôi không thể xác minh]. Bạn không thể kéo các tệp .apk ngay dưới Nougat (trừ khi ở chế độ root, nhưng điều đó yêu cầu điện thoại đã root). Nhưng, bạn có thể sao chép .apk sang một đường dẫn thay thế (giả sử / sdcard / Tải xuống) trên điện thoại bằng cách sử dụng vỏ adb, sau đó bạn có thể thực hiện thao tác kéo adb từ đường dẫn thay thế.
adb shell
lệnh từ nhận xét của @Isa A) hoạt động tốt với tôi trên Android 7.1.1, chưa được root.
Tải ứng dụng hiện đang mở với:
adb shell dumpsys activity activities | grep mFocusedActivity
Nhận đường dẫn đến tên gói
adb shell pm path <packagename.apk>
4. Sao chép đường dẫn bạn đến thư mục sdcard
adb shell cp /data/app/<packagename.apk> /sdcard
5. Đóng gói apk
adb pull /sdcard/base.apk
Biên tập
Nếu bước 2 không hoạt động, hãy sử dụng bước này:
adb shell dumpsys window windows | grep mCurrentFocus
Đây là cách bạn làm điều đó:
Tải xuống và cài đặt APK Extractor trong thiết bị của bạn. Nó là miễn phí và tương thích trong hầu hết các thiết bị Android. Một điểm cộng nữa là nó thậm chí không yêu cầu root hay bất cứ thứ gì để hoạt động. Sau khi bạn đã cài đặt nó, khởi chạy nó. Ở đó bạn sẽ thấy một danh sách các ứng dụng có trong thiết bị của bạn, bao gồm các ứng dụng bạn đã cài đặt sau đó, cùng với các ứng dụng hệ thống. Nhấn và giữ bất kỳ ứng dụng nào bạn muốn giải nén (bạn có thể chọn nhiều hoặc tất cả các ứng dụng cùng một lúc) và nhấp vào tùy chọn giải nén mà bạn thấy ở trên cùng. Bạn cũng sẽ có tùy chọn để chia sẻ qua Bluetooth hoặc nhắn tin. Bạn đã hoàn tất, bạn sẽ thấy các ứng dụng được trích xuất là AppName_AppPackage_AppVersionName_AppVersionCode.apk, sẽ được lưu trong đường dẫn / sdcard / ExtractedApks / theo mặc định.
Để biết mô tả chi tiết về cách giải nén tệp apk trong Android , hãy truy cập: http://appslova.com/how-to-extract-apk-files-in-android/
Tất cả các câu trả lời này yêu cầu nhiều bước cho mỗi tệp apk được truy xuất từ thiết bị. 1. xác định tên gói, 2. tìm tệp và 3. tải xuống. Tôi đã xây dựng một apk_grabber
kịch bản python đơn giản để làm điều này cho bất kỳ ứng dụng nào phù hợp với một regex nhất định, và sau đó dịch ngược các apks đó thành các tệp jar.
Tôi chưa sử dụng mã để kéo tệp .apk từ thiết bị di động nhưng tôi đã sử dụng phần mềm để trích xuất tệp .apk từ điện thoại di động và phần mềm tôi đã sử dụng ở bên dưới với liên kết google play:
Hy vọng nó sẽ giúp bạn.
muốn rất, rất thoải mái 1 phút giải pháp?
chỉ bạn ứng dụng này https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (quản lý tập tin thông minh từ Google Play).
chạm vào "ứng dụng", chọn một và nhấn "sao lưu". nó sẽ kết thúc trên hệ thống tập tin của bạn trong app_backup
thư mục;)
Không có Root và không có công cụ ADB yêu cầu phương pháp. Cài đặt ứng dụng MyAppSharer từ cửa hàng play.
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)
Một tập lệnh bash khác (tức là sẽ hoạt động cho hầu hết các hệ thống dựa trên unix). Dựa trên câu trả lời của Pedro Coleues , nhưng hơi dễ sử dụng hơn.
Những cải tiến so với phiên bản của Pedro:
adb pull
tiếp tục phàn nàn no such file or directory
trong khi adb shell
có thể truy cập tệp. Do đó tôi đã sử dụng phương pháp khác nhau, với tập tin tạm thời.Lưu cái này vào một tập tin thực thi:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
Tôi thực sự thích tất cả những câu trả lời. Hầu hết các tập lệnh để xuất và đổi tên tất cả chúng được viết bằng Bash. Tôi đã tạo một tập lệnh Perl nhỏ tương tự (hoạt động cả trong Perl cho windows và linux, chỉ được thử nghiệm trên Ubuntu).
tải về -apk.pl
#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my @list = split(/\s*/, `adb shell pm list packages -f`);
my $count = 0;
while(my $line = <$OUT>) {
$line =~ s/^\s*|\s*$//g;
my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
my $targetFile = "$category-$package.apk";
print "$type $category $path $package $baseFile >> $targetFile\n";
system("adb", "pull", $path);
rename $baseFile, $targetFile;
}
Đầu ra là một cái gì đó tương tự như:
# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
Điều này sẽ giúp cho một người đang tìm kiếm một câu trả lời phi kỹ thuật
Đây là hack đơn giản
Tải ứng dụng App Share/Send Pro
từ cửa hàng google play. Chọn ứng dụng bạn muốn gửi và phương thức gửi ứng dụng.
Tôi thường sử dụng Bluetooth để gửi các ứng dụng đến máy tính của tôi hoặc điện thoại khác.