كيف يمكنني الحصول على ملف APK من جهاز Android؟

StackOverflow https://stackoverflow.com/questions/4032960

  •  26-09-2019
  •  | 
  •  

سؤال

كيف أحصل على ملف APK من جهاز Android؟ أو كيف يمكنني نقل ملف APK من جهاز إلى نظام؟

هل كانت مفيدة؟

المحلول

يستخدم ADB. مع سحب ADB يمكنك نسخ الملفات من جهازك إلى نظامك ، عندما يتم إرفاق الجهاز باستخدام USB.

بالطبع ، تحتاج أيضًا إلى الأذونات المناسبة للوصول إلى الدليل الذي يوجد فيه ملفك. إذا لم يكن الأمر كذلك ، فستحتاج إلى جذر الجهاز أولاً.


إذا وجدت أن العديد من ملفات APKs تتم تسمية "base.apk" ، يمكنك أيضًا استخدام أمر الخط الواحد لسحب جميع ملفات APKs من الهاتف الذي يمكنك الوصول إليه أثناء إعادة تسمية أي أسماء "base.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: فشلت في كائن REMOTE STAR" يشير إلى أنه ليس لديك الأذونات المطلوبة. لقد قمت بتشغيل هذا على Moto Z2 غير المتجانسة وتمكنت من تنزيل جميع APKs لم أزلها (انظر أدناه) باستثناء YouTube.

adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver   <--- kills presidential alert app!

(لعرض المستخدمين يقومون بتشغيل مستخدمي قائمة ADB Shell PM) ، هذه طريقة لإزالة/إلغاء تثبيت (وليس من الهاتف لأنه يعود مع إعادة تعيين المصنع) تقريبًا أي التطبيق بدون جذر بما في ذلك تطبيقات النظام (تلميح تطبيق التحديث المزعج الذي يقوم بتحديث خط هاتفك أو لا يمكن العثور عليه عن طريق Grepping لـ "CCC")

نصائح أخرى

لم تعمل أي من هذه الاقتراحات بالنسبة لي ، لأن Android كان يرسل رقم تسلسل إلى اسم الحزمة لإنتاج اسم ملف APK النهائي. في الإصدارات الأكثر حداثة من Android (Oreo و PIE) ، يتم إلحاق سلسلة عشوائية لا يمكن التنبؤ بها. التسلسل التالي للأوامر هو ما عمل بالنسبة لي على الجهاز غير الجذور:

1) تحديد اسم حزمة التطبيق ، على سبيل المثال "com.example.someapp". تخطي هذه الخطوة إذا كنت تعرف بالفعل اسم الحزمة.

adb shell pm list packages

ابحث عن قائمة أسماء الحزم وحاول العثور على تطابق بين التطبيق المعني واسم الحزمة. عادة ما يكون هذا أمرًا سهلاً ، ولكن لاحظ أن اسم الحزمة يمكن أن يكون غير مرتبط تمامًا باسم التطبيق. إذا لم تتمكن من التعرف على التطبيق من قائمة أسماء الحزم ، فحاول العثور على التطبيق في Google Play باستخدام متصفح. يحتوي عنوان URL لتطبيق في Google Play على اسم الحزمة.

2) احصل على اسم المسار الكامل لملف APK للحزمة المطلوبة.

adb shell pm path com.example.someapp

سيبدو الإخراج شيء مثل
الحزمة: /data/app/com.example.someapp -2.apk
أو
الحزمة: /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

لا يلزم الجذر:

سيحصل هذا الرمز على مسار حزم الطرف الثالث مع الاسم حتى تتمكن من تحديد 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:>\ ، ثم ستجد تلك الحزمة هناك.

لقد رأيت أن العديد من الحلول لهذه المشكلة إما عليك أن تجذر هاتفك أو عليك تثبيت تطبيق. ثم بعد الكثير من googling حصلت على هذا الحل للهواتف غير الجذرية/الجذور.

لسرد التطبيقات التي حصلت عليها حتى الآن.

adb shell pm list packages

ثم يمكنك تحديد تطبيق ، على سبيل المثال Twitter

adb backup -apk com.twitter.android

شيء مهم هنا هو عدم إعداد كلمة مرور لتشفير النسخ الاحتياطي الخاص بك

سيقوم هذا بإنشاء ملف مسمى باسم packup.ap ، لكن لا يزال لا يمكنك فتحه. لهذا يجب عليك استخراجه مرة أخرى ولكن باستخدام أمر DD.

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.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)

بطانة واحدة تعمل لجميع إصدارات Android:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk

إكمال إجابة Yojimbo ، هذا ما فعلته (Linux/Mac فقط ، لن يعمل خارج الصندوق على Windows ... ربما في Git's Bash Shell):

for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done

هذا قبيح باش ، لكنه يعمل :)

تحرير: لم يعد يعمل على AndroidM: تتم تسمية جميع الملفات "base.apk" تحت dir آخر. يجب أن تكون "تافهة" لإصلاح.

على أنظمة UNIX ، يمكنك تجربة هذه الوظيفة:

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 من الجهاز إلى سطح المكتب

أ) تأكد من تشغيلك (المحاكي/الجهاز الحقيقي). للتحقق استخدام هذا الأمر

adb devices

ب) حدد جميع قائمة الحزمة المتاحة المثبتة في جهازك. يمكنك استخدام أمر 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

ج) انسخ الحزمة (التي ترغب في تنزيلها) من الرابط أعلاه. تشكيل حالتنا اخترت هذا (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

د) أخيرًا ، لتنزيل 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/

ه) تأكيد في الدليل المحلي الخاص بك

ls -la /Users/$(whoami)/Documents/

كما ذكر أعلاه ، يمكنك الحصول على APK باستخدام أمر السحب في ADB.

منذ أن تتحدث عن التطبيقات المثبتة ، تابع ونظر في /البيانات/التطبيق دليل نظام ملفات Android الخاص بك. ستجد APK هناك.

ثم استخدم الأمر ADB - ADB Pull /data/Data/appname.apk

إذا كنت تعرف (أو إذا كنت تستطيع "تخمين") المسار إلى .apk (هو - هي يبدو ليكون من التنسيق /data/app/com.example.someapp-{1,2,..}.apk إلى ، يمكنك فقط نسخه من /data/app أيضًا. هذا يعمل حتى على هاتف Android غير الجذور الخاص بي.

ما عليك سوى استخدام تطبيق المحاكي الطرفي (مثل هذا) و اهرب:

# 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 ، لكنني غير قادر على التحقق]. لا يمكنك سحب ملفات .APK مباشرة تحت Nougat (ما لم يكن في وضع الجذر ، ولكن هذا يتطلب هاتفًا متجذرًا). ولكن ، يمكنك نسخ .APK إلى مسار بديل (say /sdcard /download) على الهاتف باستخدام ADB Shell ، ثم يمكنك القيام بسحب ADB من المسار البديل.

جرب هذا الأمر باش بطانة واحدة لنسخ جميع تطبيقاتك:

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. لقد أعيدت تسمية جميع ملفات APK إلى أسماء الحزم الخاصة بهم لحل المشكلة مع نص Elcuco, ، أي نفس الشيء base.apk يتم الكتابة فوق الملف على Android 6.0 "Marshmallow" وما فوق.

لاحظ أن هذا الأمر يدعم تطبيقات الطرف الثالث فقط ، لا أرى نقطة النسخ الاحتياطي للتطبيقات المدمجة. ولكن إذا كنت تريد تطبيقات نظام النسخ الاحتياطي أيضًا ، فما عليك سوى حذف -3 اختيار.

إليك كيف تفعل ذلك:

قم بتنزيل وتثبيت APK Extractor في جهازك. إنه مجاني ومتوافق في جميع أجهزة Android تقريبًا. نقطة إضافية أخرى هي أنها لا تتطلب حتى الجذر أو أي شيء للعمل. بعد تثبيته ، قم بتشغيله. هناك سترى قائمة بالتطبيقات الموجودة في جهازك ، والتي تتضمن التطبيقات التي قمت بتثبيتها لاحقًا ، إلى جانب تطبيقات النظام. اضغط منذ فترة طويلة على أي تطبيق تريد استخراجه (يمكنك تحديد متعددة أو جميع التطبيقات في وقت واحد) ، والنقر فوق خيار الاستخراج الذي تراه في الأعلى. سيكون لديك أيضًا خيار المشاركة عبر Bluetooth أو المراسلة. لقد انتهيت ، سترى التطبيقات المستخرجة مثل appname_apppackage_appversionname_appversioncode.apk ، والتي سيتم حفظها في المسار/sdcard/extractedapks/افتراضيًا.

للحصول على وصف مفصل ل كيفية استخراج ملفات APK في Android, ، زيارة: http://appslova.com/how-to-extract-apk-files-in-droid/

تتطلب كل هذه الإجابات خطوات متعددة لكل ملف APK الذي تم استرداده من الجهاز. 1. تحديد اسم الحزمة ، 2. ابحث عن الملف ، و 3. قم بتنزيله. لقد بنيت بسيطة apk_grabber بيثون السيناريو للقيام بذلك لأي تطبيق يتطابق مع regex معينة ، ثم يقوم بإزالة هذه التطبيقات في ملفات JAR.

لم أستخدم رمزًا لسحب ملف .APK من الهاتف المحمول ، لكنني كنت أستخدم برنامجًا لاستخراج ملف .APK من الهاتف المحمول والبرامج التي استخدمتها أدناه مع رابط Google Play:

  1. ES File Explorer Manager
  2. Astro Cloud & File Manager 3.كابل بيانات البرمجيات

أتمنى أن يساعدك.

هل تريد حلًا مريحًا جدًا لمدة دقيقة واحدة؟

فقط أنت هذا التطبيق https://play.google.com/store/apps/details؟id=com.cvinfo.filemanager (مدير الملفات الذكية من Google Play).

اضغط على "التطبيقات" ، واختر واحدة واضغط على "النسخ الاحتياطي". سينتهي به الأمر على نظام الملفات في app_backup مجلد ؛)

لا جذر وليس أدوات ADB المطلوبة. ثَبَّتَ myappsharer تطبيق من متجر Play.

لدي 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)

سيناريو آخر باش (أي سيعمل لمعظم الأنظمة القائمة على UNIX). مرتكز على الجواب من قبل بيدرو رودريغز, ، ولكن أسهل قليلا في الاستخدام.

تحسينات على إصدار بيدرو:

  1. النهج الأصلي لم ينجح بالنسبة لي على Android 7: adb pull استمر في الشكوى no such file or directory في حين adb shell يمكن الوصول إلى الملف. وبالتالي استخدمت نهجًا مختلفًا ، مع ملف مؤقت.
  2. عند إطلاقه بدون وسيطات ، سيقوم البرنامج النصي الخاص بي بإدراج جميع الحزم المتاحة. عند توفير اسم الحزمة الجزئية ، سيحاول تخمين اسم الحزمة الكامل. سوف يشتكي إذا كان هناك العديد من التوسعات المحتملة.
  3. أنا لا أتردد في مسار الوجهة. بدلاً من ذلك ، يتم حفظ APKs إلى دليل العمل الحالي.

احفظ هذا إلى ملف قابل للتنفيذ:

#!/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 في الكمبيوتر الشخصي أو الهاتف الآخر. الآن من الهاتف ، حيث يتم تثبيت التطبيق ، فتح مشاركته وإرساله. على الهاتف أو الكمبيوتر الآخر ، افتح مشاركته واستقبله.

  1. افتح التطبيق الذي ترغب في استخراج APK من هاتفك.
  2. احصل على التطبيق المفتوح حاليًا مع:

    adb shell dumpsys activity activities | grep mFocusedActivity
    
  3. احصل على المسار إلى اسم الحزمة

    adb shell pm path <packagename.apk>
    

4.Copy المسار الذي وصلت إليه إلى دليل SDCARD

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

5.Pull APK

    adb pull /sdcard/base.apk

أنا حقا أحب كل هذه الإجابات. تمت كتابة معظم البرامج النصية لتصدير وإعادة تسمية جميعها في باش. لقد صنعت نصًا صغيرًا من Perl يقوم بنفس الشيء (الذي يجب أن يعمل في Perl لنظام التشغيل Windows و Linux ، الذي تم اختباره فقط على Ubuntu).

تنزيل 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. تشغيل التنزيل-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 Pro من متجر Google Play. حدد التطبيق الذي تريد إرساله وإرسال الطريقة.

عادةً ما أستخدم Bluetooth لإرسال التطبيقات إلى جهاز الكمبيوتر الخاص بي أو هاتف آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top