답변:
adb를 사용하십시오 . adb pull 을 사용 하면 장치가 USB로 연결되어있을 때 장치에서 시스템으로 파일을 복사 할 수 있습니다.
물론 파일이있는 디렉토리에 액세스하려면 올바른 권한이 필요합니다. 그렇지 않은 경우 먼저 장치를 루팅해야합니다.
많은 APK의 이름이 "base.apk"인 경우이 한 줄 명령을 사용하여 "base.apk"이름을 패키지 이름으로 바꾸는 동안 액세스 할 수있는 전화기에서 모든 APK를 가져올 수 있습니다. 또한 이름 뒤에 임의의 문자가있는 APK 경로에서 디렉토리를 찾을 수없는 문제를 해결합니다.
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
"adb : error : 원격 개체를 통계하지 못했습니다"가 표시되면 필요한 권한이 없음을 나타냅니다. 나는 루트가 아닌 Moto Z2에서 이것을 실행했으며 YouTube를 제외하고 제거하지 않은 모든 APK (아래 참조)를 다운로드 할 수있었습니다.
adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills presidential alert app!
(사용자가 adb shell pm list users를 실행하는 것을 볼 수 있습니다) 이것은 시스템 초기화를 포함하지 않는 거의 모든 응용 프로그램 (전화를 업데이트하는 성가신 업데이트 응용 프로그램 힌트) "ccc"를 grepping하여 찾을 수 있는지 확인하십시오.)
adb shell pm list packages
전체 경로를 adb shell pm path your.package.name
찾은 다음 PC에서 전체 경로 를 찾으면됩니다.adb pull /full/path/to/your.apk
안드로이드가 패키지 이름에 시퀀스 번호를 추가하여 최종 APK 파일 이름을 생성했기 때문에 이러한 제안 중 어느 것도 효과가 없었습니다. 최신 버전의 Android (Oreo 및 Pie)에는 예측할 수없는 임의 문자열이 추가됩니다. 다음 명령 순서는 루트 가 아닌 장치 에서 나를 위해 일한 것입니다. .
1) 앱의 패키지 이름을 결정하십시오 (예 : "com.example.someapp"). 패키지 이름을 이미 알고 있으면이 단계를 건너 뛰십시오.
adb shell pm list packages
패키지 이름 목록을 살펴보고 해당 앱과 패키지 이름이 일치하는지 확인하십시오. 일반적으로 쉽지만 패키지 이름은 앱 이름과 완전히 관련이 없을 수 있습니다. 패키지 이름 목록에서 앱을 인식 할 수없는 경우 브라우저를 사용하여 Google Play에서 앱을 찾으십시오. Google Play의 앱 URL에는 패키지 이름이 포함되어 있습니다.
2) 원하는 패키지에 대한 APK 파일의 전체 경로 이름을 가져옵니다.
adb shell pm path com.example.someapp
출력은
package : /data/app/com.example.someapp-2.apk
또는 package : /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk 와 유사 합니다.
3) 2 단계의 전체 경로 이름을 사용하여 APK 파일을 Android 디바이스에서 개발 상자로 가져 오십시오.
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
pm list packages
-f
.apk의 위치를 표시 하는 플래그를 지원합니다 (예 :) package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps
. 내장 된 오후 도움말은 쓸모 없지만 오후에도 패키지 유형을 필터링 할 수 있습니다 . 자세한 내용은 developer.android.com/studio/command-line/adb.html#pm 을 참조하십시오. 편집 : 방금 아래의 답변 이이 사실을 알았지 만 그 대답은 거의 이것처럼 답답하지 않습니다.
adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist
합니다.. 파일 브라우저로 이러한 폴더를 탐색하면 폴더가 비어 있습니다.
adb shell
한 다음 사용하여 수정했습니다 cp PathToApk /sdcard/
.
루트가 필요하지 않습니다 :
이 코드는 이름이 포함 된 타사 패키지 경로를 제공하므로 APK를 쉽게 식별 할 수 있습니다.
adb shell pm list packages -f -3
출력은
패키지 : /data/app/XX.XX.XX.apk=YY.YY.YY
이제 아래 코드를 사용하여 해당 패키지를 가져옵니다.
adb pull /data/app/XX.XX.XX.apk
에서 위의 cmd를 실행 C:>\
하면 해당 패키지가 있습니다.
-f -s
-f -3
나는이 문제에 대한 많은 해결책이 전화를 뿌리거나 앱을 설치해야한다는 것을 알았습니다. 그런 다음 많은 인터넷 검색 후 뿌리가없는 / 뿌리가없는 전화에 대한 이 솔루션을 얻었습니다 .
지금까지 얻은 앱을 나열합니다.
adb shell pm list packages
그런 다음 트위터와 같은 앱을 선택할 수 있습니다
adb backup -apk com.twitter.android
여기서 중요한 것은 백업 암호화를위한 비밀번호를 설정하지 않는 것입니다
그러면 backup.ap라는 이름의 파일이 생성되지만 여전히 열 수는 없습니다. 이를 위해 dd 명령을 사용하여 다시 추출해야합니다.
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
이 작업을 수행하면 tar 내용을 추출하기 만하면됩니다.
그것이 당신들에게 효과가 있기를 바랍니다.
장치에서 데스크톱으로 APK를 다운로드하는 단계
A) 실행 중인지 확인하십시오 (에뮬레이터 / 실제 장치). 이 명령을 사용하여 확인하려면
adb devices
B) 장치에 설치된 사용 가능한 패키지 목록을 모두 선택하십시오. grep 명령을 사용하여 다운로드하려는 특정 패키지를 선택할 수 있습니다.
adb shell pm list packages
adb shell pm list packages -f -3
출력 (사용 가능한 패키지 목록)
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) 위의 링크에서 패키지 (다운로드하려는 )를 복사하십시오. 이 사례 (com.example.myapplication) 패키지를 선택하십시오.
Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
산출
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
D) 마지막으로 (에뮬레이터 / 실제 장치)에서 APK를 다운로드하려면
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
예 : 로컬 컴퓨터에서이 CertInstaller.apk 파일을 가져 오려고합니다 (Mac)
adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
E) 로컬 디렉토리에서 확인
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)
모든 안드로이드 버전에서 작동하는 하나의 라이너 :
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
@ Yojimbo의 대답을 완료하면 이것이 내가 한 일입니다 (Linux / Mac에서만 Windows에서 즉시 작동하지 않습니다 ... 아마도 git의 bash 쉘에서).
for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done
이것은 추한 bash이지만 작동합니다 :)
편집 : 더 이상 AndroidM에서 작동하지 않습니다 : 모든 파일은 다른 디렉토리 아래에 "base.apk"로 이름이 지정됩니다. 해결하기 위해 "사소한"것이어야합니다.
유닉스 시스템에서이 기능을 시도 할 수 있습니다 :
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
위에서 말했듯이 adb에서 pull 명령을 사용하여 apk를 얻을 수 있습니다.
설치된 애플리케이션에 대해 이야기하고 있으므로 Android 파일 시스템 의 / data / app 디렉토리를 살펴보십시오. APK가 있습니다.
그런 다음 adb 명령-adb pull /data/data/appname.apk를 사용하십시오.
이 하나의 라이너 bash 명령을 사용하여 모든 앱을 백업하십시오.
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
이 명령은 Firelord 's script 에서 파생되었습니다 . elcuco의 스크립트로 문제를 해결하기 위해 모든 APK의 이름을 패키지 이름으로 바꿨습니다 . 예를 들어 base.apk
Android 6.0 "Marshmallow"이상 에서 동일한 파일을 덮어 씁니다.
이 명령은 타사 앱만 백업한다는 점에 유의하십시오. coz 내장 앱을 백업 할 시점이 보이지 않습니다. 그러나 시스템 앱도 백업하려면 -3
옵션을 생략하십시오 .
당신이 알고있는 (또는 "추측"할 수있는 경우)의 경로를 경우 .apk
(이 보인다 형식의 것으로 /data/app/com.example.someapp-{1,2,..}.apk
다음에서 복사 단지 수에 /data/app
뿐만 아니라. 이것도 내 비 뿌리, 주식 안드로이드 전화를했다.
터미널 에뮬레이터 앱 (예 : this )을 사용하고 다음을 실행하십시오.
# 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/
그런 다음 SD 카드에서 원하는 곳으로 옮길 수 있습니다 (또는 이메일에 첨부). 마지막 비트는 기술적으로 선택 사항이지만 .apk
파일로 무언가를 시도 할 때 인생을 훨씬 쉽게 만듭니다 .
여기에 설명 된 절차는 Android 7 (Nougat) [Android 6 및 가능하지만 확인할 수 없음]에서는 작동하지 않습니다. 루트 모드가 아닌 경우 루팅 된 전화가 필요한 경우 Nougat에서 .apk 파일을 직접 가져올 수 없습니다. 그러나 adb 쉘을 사용하여 전화기의 .apk를 대체 경로 (예 : / sdcard / Download)에 복사 한 다음 대체 경로에서 adb 풀을 수행 할 수 있습니다.
adb shell
@Isa A의 의견 포함)은 근본이 아닌 Android 7.1.1에서 제대로 작동했습니다.
다음을 사용하여 현재 열린 앱을 가져옵니다.
adb shell dumpsys activity activities | grep mFocusedActivity
패키지 이름의 경로를 가져옵니다
adb shell pm path <packagename.apk>
4. sdcard 디렉토리에있는 경로를 복사하십시오
adb shell cp /data/app/<packagename.apk> /sdcard
5. APK를 당겨
adb pull /sdcard/base.apk
편집하다
2 단계가 작동하지 않으면 다음을 사용하십시오.
adb shell dumpsys window windows | grep mCurrentFocus
방법은 다음과 같습니다.
장치에 APK 추출기를 다운로드하여 설치하십시오. 무료이며 거의 모든 Android 기기와 호환됩니다. 또 다른 장점은 루트 또는 아무것도 작동하지 않아도된다는 것입니다. 설치 한 후에 시작하십시오. 여기에는 장치에있는 앱 목록이 표시되며 여기에는 나중에 설치 한 앱과 시스템 앱이 포함됩니다. 추출하려는 앱을 길게 누르고 (한 번에 여러 또는 모든 앱을 선택할 수 있음) 상단에 표시된 추출 옵션을 클릭하십시오. Bluetooth 또는 메시징을 통해 공유 할 수도 있습니다. 추출 된 앱은 AppName_AppPackage_AppVersionName_AppVersionCode.apk로 표시되며 기본적으로 / sdcard / ExtractedApks / 경로에 저장됩니다.
android에서 apk 파일을 추출하는 방법에 대한 자세한 설명을 보려면 다음 사이트를 방문하십시오 : http://appslova.com/how-to-extract-apk-files-in-android/
이 모든 답변에는 장치에서 검색 된 각 apk 파일에 대해 여러 단계가 필요합니다. 1. 패키지 이름을 결정하고 2. 파일을 찾은 다음 3. 다운로드하십시오. 주어진 정규 표현식과 일치하는 모든 응용 프로그램에 대해이 작업을 수행 하는 간단한 apk_grabber
Python 스크립트 를 작성한 다음 해당 apk를 jar 파일로 디 컴파일합니다.
모바일에서 .apk 파일을 가져 오는 코드를 사용하지 않았지만 소프트웨어를 사용하여 모바일에서 .apk 파일을 추출했습니다. 사용한 소프트웨어는 Google Play 링크와 함께 아래에 있습니다.
그것이 당신을 도울 수 있기를 바랍니다.
매우 편안한 1 분 솔루션을 원하십니까?
이 앱 https://play.google.com/store/apps/details?id=com.cvinfo.filemanager(Google Play의 스마트 파일 관리자) 만 있으면 됩니다.
"앱"을 누르고 하나를 선택한 다음 "백업"을 누릅니다. app_backup
폴더 의 파일 시스템에서 끝납니다 .)
루트가없고 ADB 도구가 필요하지 않습니다. Play 스토어에서 MyAppSharer 앱을 설치 하십시오 .
나는 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)
또 다른 bash 스크립트 (즉, 대부분의 유닉스 기반 시스템에서 작동합니다). Pedro Rodrigues의 답변을 기반으로 하지만 사용하기가 약간 더 쉽습니다.
Pedro의 버전에 비해 개선 된 사항 :
adb pull
계속 불평 합니다. 따라서 임시 파일과 함께 다른 접근 방식을 사용했습니다.no such file or directory
adb shell
이것을 실행 파일에 저장하십시오.
#!/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\""
나는이 모든 답을 정말로 좋아했다. 모든 스크립트를 내보내고 이름을 바꾸는 대부분의 스크립트는 Bash로 작성되었습니다. 나는 똑같은 작은 Perl 스크립트를 만들었습니다 (우분투에서만 테스트 된 Windows 및 Linux 용 Perl에서 작동해야 함).
download-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;
}
출력은 다음과 유사합니다.
# ./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.
이것은 기술적이지 않은 답변을 찾는 사람에게 도움이 될 것입니다
이것은 간단한 해킹입니다
App Share/Send Pro
Google Play 스토어에서 애플리케이션 을 다운로드하십시오 . 보내려는 앱과 메소드 전송 애플리케이션을 선택하십시오.
저는 보통 Bluetooth를 사용하여 PC 나 다른 전화로 응용 프로그램을 보냅니다.