रन-एस का उपयोग करके आंतरिक संग्रहण से डेटाबेस या किसी अन्य फ़ाइल को पुनर्प्राप्त करें


113

एक गैर-रूट किए गए एंड्रॉइड डिवाइस पर, मैं run-asअपने पैकेज के नाम के साथ कमांड का उपयोग करके डेटाबेस वाले डेटा फ़ोल्डर में नेविगेट कर सकता हूं। अधिकांश प्रकार की फाइलें मैं केवल देखने के साथ संतुष्ट हूं, लेकिन डेटाबेस के साथ अगर मैं एंड्रॉइड डिवाइस से खींचना चाहूंगा।

वहाँ एक है download copyया moveadb शेल के इस भाग से आदेश? मैं डेटाबेस फ़ाइल डाउनलोड करना चाहूंगा और डेटाबेस ब्राउज़र का उपयोग करके इसकी सामग्री देख सकता हूं।

यहां एक उत्तर में संपूर्ण एप्लिकेशन पैकेज को एक संपीड़ित संग्रह में बदलना शामिल है, लेकिन इस संग्रह को निकालने के बारे में आगे कोई उत्तर नहीं है कि एक बार यह किया जाए और मशीन में स्थानांतरित कर दिया जाए, जब मुझे शुरू करने के लिए एक अधिक प्रत्यक्ष समाधान हो सकता है, तो मुझे बहुत कम कर दिया जाएगा।


Adb pull प्रयास करें stackoverflow.com/questions/8650407/...
पीड़ारहित

stackoverflow.com/questions/13006315 रूट डिवाइस के बिना खींचो डेटाबेस
नवीन प्रिंस पी

जवाबों:


230

userएंड्रॉइड के डिजाइन बिल्ड द्वारा (यही आपके फोन पर है जब तक आप बूटलोडर को अनलॉक नहीं करते और फोन को फ्लैश userdebugया engसॉफ्टवेयर के साथ फ्लैश करते हैं ) आंतरिक स्टोरेज तक पहुंच को प्रतिबंधित करता है - हर ऐप केवल अपनी खुद की फाइलों तक पहुंच सकता है। सौभाग्य से सॉफ्टवेयर डेवलपर्स अपने फोन को रूट करने के लिए तैयार नहीं होते हैं, Google कमांड का उपयोग करके अपने पैकेजों के डीबग करने योग्य संस्करणों के आंतरिक संग्रहण तक पहुंचने का एक तरीका प्रदान करता है ।run-as

/data/data/debuggable.app.package.name/databases/fileAndroid 5.1+ डिवाइस से डाउनलोड करने के लिए निम्नलिखित कमांड चलाएँ:

adb exec-out run-as debuggable.app.package.name cat databases/file > file

एक /data/data/debuggable.app.package.name/बार में एक फ़ोल्डर में कई फ़ाइलों को डाउनलोड करने के लिए - उपयोग करें tar:

adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar
adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar

8
या, बस run-asफ़ाइल को बाहरी संग्रहण पर एक स्थान पर कॉपी करने के लिए उपयोग करें, और फ़ाइल अनुमतियों के साथ खिलवाड़ करने के बजाय, डेटाबेस फ़ाइल को वहां से खींचें।
कॉमन्सवेयर जूल

5
रन-एस को sdcard पर लिखने की अनुमति नहीं है - नवीनतम अपडेट के साथ कुछ नया जोड़ा गया है ... :(
slott

4
जब मैं adb शेल "रन-ए पैकेज" रन करता हूं। chmod 666 /data/data/package.name/dat डेटाबेस/file "एडीबी मुझे त्रुटि समाप्त करता है -> रन-एस: chmod666 त्रुटि के लिए असफल रहा। अनुमति से इनकार कर दिया। मैं नेक्सस 7 में रूट के बिना हूँ
Shudy

2
बाहरी एसडी कार्ड तक पहुँच को अब adb से संभव नहीं है।
slott

3
यदि आप पा रहे हैं कि आप एक रिक्त या लगभग रिक्त फ़ाइल प्राप्त कर रहे हैं, तो आप पा सकते हैं कि फ़ाइल केवल कंसोल से एक त्रुटि है जो आपके द्वारा बनाई गई इस फ़ाइल पर पुनर्निर्देशित की गई है। यहां एक समस्या यह है कि आप अपने ऐप के रिलीज़ संस्करण से किसी DB की प्रतिलिपि बनाने की कोशिश कर रहे हैं। आप अपने ऐप के डीबग वेरिएंट से केवल डीबी की कॉपी कर सकते हैं । यदि ऐसा होता है, तो बस डिबग वेरिएंट इंस्टॉल करें और फिर से कमांड का प्रयास करें। आशा है कि यह किसी की मदद करता है।
आंगहॉट शॉर्ट

73

स्वीकृत उत्तर मेरे लिए अब काम नहीं करता (Android द्वारा अवरुद्ध?)

इसलिए इसके बजाय मैंने ऐसा किया:

> adb shell
shell $ run-as com.example.package
shell $ chmod 666 databases/file
shell $ exit                                               ## exit out of 'run-as'
shell $ cp /data/data/package.name/databases/file /sdcard/
shell $ run-as com.example.package
shell $ chmod 600 databases/file
> adb pull /sdcard/file .

3
यह नया सही उत्तर होना चाहिए या @Alex P. आपको नए Android संस्करणों के लिए यह उत्तर जोड़ना चाहिए। इसके अलावा मेरे मामले में मुझे 777 का उपयोग करना था और इसे पहले db फ़ाइल तक पहुँचने से पहले डेटाबेस / निर्देशिका में लागू करना चाहिए।
मुएटज़ेनफ्लो

1
मेरी डिवाइस निहित है, लेकिन मैंने पाया कि मुझे अभी भी कमांड को काम suकरने के लिए चलाने की आवश्यकता है run-as
थॉमस डब्ल्यूडब्ल्यू

अगर आपके पास एसडी कार्ड नहीं है तो क्या होगा?
गयूम फॉक्स

1
यदि आपके पास SD कार्ड नहीं है, तो फिर भी "sdcard" निर्देशिका वैसे भी है।
पेड़अधिवेशन

1
महान!। यह मेरे लिए भी काम किया। क्या हम एक बैच / शेल फ़ाइल बना सकते हैं? सिर्फ परम के रूप में db फ़ाइल नाम से गुजर रहा है और हमारे पास db फ़ाइल है।
कादिर हुसैन

22

यदि कोई व्यक्ति डीबग एप्लिकेशन से डेटाबेस खींचने के लिए देख रहा है, तो नीचे दी गई प्रक्रिया का उपयोग कर सकता है:

  1. खोज और ओपन डिवाइस फ़ाइल एक्सप्लोरर

खोज और ओपन डिवाइस फ़ाइल एक्सप्लोरर

  1. अपना हैंडसेट चुनें और फिर data/dataनिर्देशिका में ब्राउज़ करें

डेटा / डेटा निर्देशिका पर जाएं

  1. अब अपना एप्लिकेशन पैकेज ढूंढें और डेटाबेस फ़ोल्डर में जाएं। आप वहां डेटाबेस देख सकते हैं और राइट क्लिक करने पर, आपको अपने ड्राइव में इसे सेव करने का विकल्प मिलेगा।

यहां छवि विवरण दर्ज करें


1
वाह, इतना आसान और सुरक्षित
adb-

9

मैंने डंपिंग डेटाबेस के लिए एक सरल शेल स्क्रिप्ट प्रकाशित की है:

https://github.com/Pixplicity/humpty-dumpty-android

यह यहां वर्णित दो अलग-अलग तरीकों का प्रदर्शन करता है:

  1. सबसे पहले, यह फ़ाइल को अन्य उपयोगकर्ताओं के लिए सुलभ बनाने की कोशिश करता है, और इसे डिवाइस से खींचने का प्रयास करता है।
  2. यदि वह विफल हो जाता है, तो यह टर्मिनल पर फ़ाइल की सामग्री को स्थानीय मशीन में स्ट्रीम करता है। यह उन \rवर्णों को हटाने के लिए एक अतिरिक्त चाल करता है जो कुछ उपकरणों को शेल में आउटपुट करते हैं।

यहाँ से आप विभिन्न प्रकार के CLI या GUI SQLite अनुप्रयोगों का उपयोग कर सकते हैं, जैसे कि sqlite3या sqlitebrowserडेटाबेस की सामग्री को ब्राउज़ करने के लिए।


यह स्क्रिप्ट डीबग करने योग्य एप्लिकेशन के लिए है, यदि ऐप डिबग करने योग्य नहीं है, तो कैसे होगा?
ब्लरवेयर

आपके एकमात्र विकल्प में बैकअप टूल का उपयोग करने की संभावना है, यदि प्रश्न में ऐप बैकअप के हिस्से के रूप में उस डेटा को उजागर करता है। इसके अलावा, मुझे डर है कि इसके लिए एलिवेटेड परमिशन की जरूरत होगी।
पॉल लामर्ट्स्मा

7

मुझे मेरे लिए काम करने के लिए कुछ और नहीं मिला, लेकिन यह:

adb shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/

पहला एग्जिट रन-वे से बाहर निकलना है, दूसरा एग्जिट पुल करने के लिए adb शेल से बाहर निकलना है।


3

एप्लिकेशन के डिबग संस्करण के लिए, adb exec-out run-as xxx.yyy.zzz cat somefile > somefileकिसी एकल फ़ाइल को निकालने के लिए कमांड का उपयोग करना बहुत सुविधाजनक है । लेकिन आपको कई फ़ाइलों के लिए कई बार करना होगा। यहां निर्देशिका को निकालने के लिए एक सरल स्क्रिप्ट का उपयोग किया गया है।

#!/bin/bash
P=
F=
D=

function usage()
{
    echo "$(basename $0) [-f file] [-d directory] -p package"
    exit 1
}

while getopts ":p:f:d:" opt
do
    case $opt in
        p)
            P=$OPTARG
            echo package is $OPTARG
            ;;
        f)
            F=$OPTARG
            echo file is $OPTARG
            ;;
        d)
            D=$OPTARG
            echo directory is $OPTARG
            ;;
        \?)
            echo Unknown option -$OPTARG
            usage
            ;;
        \:)
            echo Required argument not found -$OPTARG
            usage
            ;;
    esac
done

[ x$P == x ] && {
    echo "package can not be empty"
    usage
    exit 1
}

[[ x$F == x  &&  x$D == x ]] && {
    echo "file or directory can not be empty"
    usage
    exit 1
}

function file_type()
{
    # use printf to avoid carriage return
    __t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
    echo $__t
}

function list_and_pull()
{
    t=$(file_type $1)
    if [ $t == d ]; then
        for f in $(adb shell run-as $P ls $1)
        do
            # the carriage return output from adb shell should
            # be removed
            mkdir -p $(echo -e $1 |sed $'s/\r//')
            list_and_pull $(echo -e $1/$f |sed $'s/\r//')
        done
    else
        echo pull file $1
        [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
        $(adb exec-out run-as $P cat $1 > $1)
    fi
}

[ ! -z $D ] && list_and_pull $D
[ ! -z $F ] && list_and_pull $F

आशा है कि यह मददगार होगा। यह स्क्रिप्ट भी पर उपलब्ध है सार

विशिष्ट उपयोग है

$ ./exec_out.sh -p com.example.myapplication -d databases

तब यह आपके ऐप्स डेटाबेस निर्देशिका के अंतर्गत सभी फ़ाइलों को निकालेगा, जो कि /data/data/com.example.myapplication/databasesवर्तमान निर्देशिका में है।


1
यहां तक ​​कि कई फ़ाइलों के लिए यह अभी भी केवल एक ही आदेश है। अद्यतन stackoverflow.com/a/18472135/1778421 की जाँच करें यदि आप चाहें तो आप फ़ाइलों को अनपैक करने के लिए मेजबान पक्ष पर एक और पाइप भी जोड़ सकते हैं
एलेक्स पी।

2

अपने स्थानीय कंप्यूटर पर फ़ाइल डाउनलोड करने के लिए बहुत सरल तरीका:

आपके पीसी शेल में:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

बहुत करीब है, लेकिन यह मेरे लिए एक विकृत db को बाहर निकालता है।
ना

1
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools

adb -d shell 'run-as com.android.app  cp /data/data/com.android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db

आप इस स्क्रिप्ट का उपयोग Realm डेटाबेस प्राप्त करने के लिए कर सकते हैं।


0

किसी को एक और जवाब यह है कि पुनः प्राप्त किया जा सकता है की तलाश में है तो Databaseसाथ ही साथ Shared Preferencesउसके इस कदम का पालन करें:

build.gradleआपके एप्लिकेशन की आपकी फ़ाइल में पंक्ति जोड़ें

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

अब जब आप अपने ऐप को non-releaseमोड में चलाते हैं तो आपका ऐप स्वचालित रूप से आपके डिवाइस से 8080 पोर्ट खोलेगा IP address, सुनिश्चित करें कि आपका डिवाइस आपके डिवाइस से कनेक्ट है wifiऔर आप laptopउसी नेटवर्क को साझा कर रहे हैं। अब बस url पर जाएँ

http: // your_mobile_device_ip: 8080 /

साझा प्राथमिकताओं के साथ डेटाबेस के सभी डेटा को देखने के लिए।


0

यहां एक समाधान है जो एंड्रॉइड 5.1 पर चलने वाले डिवाइस पर काम करता है। निम्न उदाहरण विंडोज के लिए है।

आपको sed (या विंडोज़ पर sed.exe, जैसे कि cygwin से।) की आवश्यकता है। (Unix पर, यह बस हो जाएगा।))। खराब '\ r' वर्णों को हटाने के लिए, कम से कम खिड़कियों पर।

अब बस निम्नलिखित कमांड चलाएँ:

adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db

सेड कमांड कमांड ट्रेलिंग / आर अक्षर को बाहर निकालता है।

बेशक आपको ऐप के पैकेज नाम के साथ "com.yourcompany.yourapp" और ऐप में डेटाबेस के नाम के साथ "YourDatabaseName" को बदलना चाहिए।


0

डेटाबेस फ़ाइल का उपयोग करते समय emtpy हैadb run-as । इसे RoomDatabase उदाहरण पर बंद () कॉल करके हल किया जा सकता है। SQLite को डिस्क पर अपनी पत्रिका लिखने देने के लिए कॉल () बंद करें। मैंने यह बटन बनाया है जो अनुरोध पर डेटाबेस कनेक्शन को बंद करता है:

GIPHY के माध्यम से

यहां बताया गया है कि रूमडेटाबेस उदाहरण पर कैसे कॉल करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.