development

Android 기기에서 apk 파일을 어떻게 얻습니까?

big-blog 2020. 2. 17. 22:20
반응형

Android 기기에서 apk 파일을 어떻게 얻습니까?


안드로이드 장치에서 APK 파일을 어떻게 얻습니까? 또는 apk 파일을 장치에서 시스템으로 어떻게 전송합니까?


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하여 찾을 수 있는지 확인하십시오.)


안드로이드가 패키지 이름에 시퀀스 번호를 추가하여 최종 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 단계의 전체 경로 이름을 사용하여 Android 장치에서 개발 상자로 APK 파일을 가져 오십시오.

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination

루트가 필요하지 않습니다 :

이 코드는 이름이 포함 된 타사 패키지 경로를 제공하므로 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:>\하면 해당 패키지가 있습니다.


나는이 문제에 대한 많은 해결책이 전화를 뿌리거나 앱을 설치해야한다는 것을 알았습니다. 그런 다음 많은 인터넷 검색 후 루팅되지 않은 루팅 폰에 대한솔루션을 얻었습니다 .

지금까지 얻은 앱을 나열합니다.

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 내용을 추출하기 만하면됩니다.

그것이 당신들에게 효과가 있기를 바랍니다.


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

장치에서 데스크톱으로 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) 패키지를 선택하십시오.

Syntex: 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를 다운로드하려면

Syntex: 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/

위에서 말했듯이 adb에서 pull 명령을 사용하여 apk를 얻을 수 있습니다.

설치된 애플리케이션에 대해 이야기하고 있으므로 Android 파일 시스템 / data / app 디렉토리를 살펴보십시오. APK가 있습니다.

그런 다음 adb 명령을 사용하십시오-adb pull /data/data/appname.apk


당신이 알고있는 (또는 "추측"할 수있는 경우)의 경로를 경우 .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 풀을 수행 할 수 있습니다.


이 하나의 라이너 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 에서 파생되었습니다 . 난 그냥 함께 문제를 해결하기 위해 자신의 패키지 이름에 대한 모든 APK가 이름이 바뀌 elcuco의 스크립트 즉, 같은 base.apk안드로이드 6.0 "산들 바람"과에 덮어지고 파일.

이 명령은 타사 앱만 백업한다는 점에 유의하십시오. coz 내장 앱을 백업 할 시점이 보이지 않습니다. 그러나 시스템 앱도 백업하려면 -3옵션을 생략하십시오 .


방법은 다음과 같습니다.

장치에 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파이썬 스크립트작성한 다음 해당 apk를 jar 파일로 디 컴파일합니다.


모바일에서 .apk 파일을 가져 오는 코드를 사용하지 않았지만 소프트웨어를 사용하여 모바일에서 .apk 파일을 추출했습니다. 사용한 소프트웨어는 Google Play 링크와 함께 아래에 있습니다.

  1. ES 파일 탐색기 파일 관리자
  2. ASTRO Cloud & File Manager 3. 소프트웨어 데이터 케이블

그것이 당신을 도울 수 있기를 바랍니다.


매우 편안한 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의 버전에 비해 개선 된 사항 :

  1. 안드로이드 7에서는 원래 접근 방식이 작동하지 않았습니다 . 파일에 액세스 할 수있는 동안 adb pull계속 불평 합니다. 따라서 임시 파일과 함께 다른 접근 방식을 사용했습니다.no such file or directoryadb shell
  2. 인수없이 시작하면 스크립트는 사용 가능한 모든 패키지를 나열합니다. 부분 패키지 이름이 제공되면 전체 패키지 이름을 추측하려고 시도합니다. 몇 가지 가능한 확장이 있는지 불평합니다.
  3. 대상 경로를 하드 코딩하지 않습니다. 대신 APK는 현재 작업 디렉토리에 저장됩니다.

이것을 실행 파일에 저장하십시오.

#!/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\""

가장 간단한 방법은 전화에 "ShareIt"앱을 설치하는 것입니다. 이제 shareIt 앱을 PC 또는 다른 전화에 설치하십시오. 이제 앱이 설치된 전화에서 ShareIt을 열고 보냅니다. 다른 전화 또는 PC에서 ShareIt을 열고 수신하십시오.


  1. 휴대 전화에서 APK를 추출하려는 앱을 엽니 다.
  2. 다음을 사용하여 현재 열린 앱을 가져옵니다.

    adb shell dumpsys activity activities | grep mFocusedActivity
    
  3. 패키지 이름의 경로를 가져옵니다

    adb shell pm path <packagename.apk>
    

4. sdcard 디렉토리에있는 경로를 복사하십시오

    adb shell cp /data/app/<packagename.apk> /sdcard

5. APK를 당겨

    adb pull /sdcard/base.apk

나는이 모든 답을 정말로 좋아했다. 모든 스크립트를 내보내고 이름을 바꾸는 대부분의 스크립트는 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;
}
  1. adb (.exe)가 경로 또는 동일한 디렉토리에 있는지 확인하십시오
  2. 전화 연결
  3. download-apk.pl을 실행하십시오.

출력은 다음과 유사합니다.

# ./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 ProGoogle Play 스토어에서 애플리케이션 다운로드하십시오 . 보내려는 앱과 메소드 전송 애플리케이션을 선택하십시오.

저는 보통 Bluetooth를 사용하여 PC 나 다른 전화로 응용 프로그램을 보냅니다.

참고 URL : https://stackoverflow.com/questions/4032960/how-do-i-get-an-apk-file-from-an-android-device



도와주세요.
반응형