রান-অ্যাস ব্যবহার করে অভ্যন্তরীণ স্টোরেজ থেকে ডাটাবেস বা অন্য কোনও ফাইল পুনরুদ্ধার করুন


113

একটি অমূলের অ্যান্ড্রয়েড ডিভাইসে, আমি run-asআমার প্যাকেজের নামটি দিয়ে কমান্ডটি ব্যবহার করে ডাটাবেসযুক্ত ডেটা ফোল্ডারে নেভিগেট করতে পারি। বেশিরভাগ ফাইলের ধরণে আমি কেবল দেখতে সন্তুষ্ট, তবে অ্যান্ড্রয়েড ডিভাইস থেকে ডাটাবেসের সাহায্যে আমি টানতে চাই।

অ্যাডবি শেলের এই অংশ থেকে কোনও আদেশ download copyবা moveআদেশ আছে ? আমি ডাটাবেস ফাইলটি ডাউনলোড করতে এবং একটি ডাটাবেস ব্রাউজার ব্যবহার করে এর সামগ্রী দেখতে চাই।

এখানে একটি উত্তরের মধ্যে পুরো অ্যাপ্লিকেশন প্যাকেজটিকে একটি সংকুচিত সংরক্ষণাগারে পরিণত করা জড়িত, তবে এটি সম্পন্ন হয়ে মেশিনে স্থানান্তরিত হলে সেই সংরক্ষণাগারটি কীভাবে বের করা যায় সে সম্পর্কে আর কোনও উত্তর নেই, যখন আরও সরাসরি সমাধানের শুরু হতে পারে তখন আমাকে খুব বিচলিত রেখে যায়



stackoverflow.com/questions/13006315 রুট ডিভাইস ছাড়াই ডাটাবেস টানুন
নতুন প্রিন্স পি

উত্তর:


230

নকশা অনুযায়ী userAndroid এর বিল্ড (যে কি আপনি আপনার ফোনে আছে যতক্ষণ না আপনি আনলক এর বুট-লোডার ও ফোন ফ্ল্যাশ userdebugবা engসফ্টওয়্যার) অ্যাক্সেস সীমিত ইন্টারনাল স্টোরেজ - যে অ্যাপ্লিকেশন শুধুমাত্র তার নিজস্ব ফাইল অ্যাক্সেস করতে পারেন। সৌভাগ্যবশত করতে ইচ্ছুক না সফটওয়্যার ডেভেলপারদের জন্য রুট তাদের ফোন গুগল অ্যাক্সেস করতে একটি উপায় প্রদান করে ইন্টারনাল স্টোরেজ এর ডিবাগযোগ্য তাদের প্যাকেজ ব্যবহারের সংস্করণ run-asকমান্ড।

/data/data/debuggable.app.package.name/databases/fileঅ্যান্ড্রয়েড 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
রান-অ্যাসের এসডকার্ডে লেখার অনুমতি নেই - সর্বশেষ আপডেটের সাথে নতুন কিছু যুক্ত হয়েছে ... :(
স্লট

4
যখন আমি অ্যাডবি শেলটি চালাই "চালানো হিসাবে প্যাকেজ.নাম chmod 666 /data/data/package.name/datedias/file" অ্যাডবি আমার ত্রুটি শেষ করে -> রান-অ্যাস: এক্স চালানো chmod666 এর জন্য ব্যর্থ হয়েছে: অনুমতি অস্বীকার করা হয়েছে। আমি শিকড় ছাড়াই নেক্সাস 7 এ আছি
শুডি

2
বাহ্যিক এসডি কার্ডে লেখার অ্যাক্সেস অ্যাডবি দিয়ে আর সম্ভব নয়।
স্লট

3
আপনি যদি খালি বা প্রায় ফাঁকা ফাইল ফিরে পেয়ে যাচ্ছেন তবে আপনি খুঁজে পেতে পারেন যে ফাইলটি আপনার তৈরি করা এই ফাইলে পুনঃনির্দেশ করা কনসোলের একটি ত্রুটি। এখানে প্রায়শই সমস্যা হ'ল আপনি নিজের অ্যাপ্লিকেশনটির রিলিজ বৈকল্পিক থেকে কোনও ডিবি অনুলিপি করার চেষ্টা করছেন। আপনি কেবল আপনার অ্যাপের ডিবাগ বৈকল্পিক থেকে ডিবি অনুলিপি করতে পারবেন । যদি এটি ঘটে থাকে তবে কেবল ডিবাগের রূপটি ইনস্টল করুন এবং কমান্ডটি আবার চেষ্টা করুন। আশা করি এটি কাউকে সাহায্য করবে।
অংহুস শর্ট 18

72

গৃহীত উত্তর আমার জন্য আর কাজ করে না (অ্যান্ড্রয়েড দ্বারা অবরুদ্ধ?)

সুতরাং পরিবর্তে আমি এটি করেছি:

> 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
এটি নতুন সঠিক উত্তর বা @ অ্যালেক্স পি হওয়া উচিত new আপনার নতুন উত্তর অ্যান্ড্রয়েড সংস্করণগুলির জন্য এই উত্তরটি যুক্ত করা উচিত। এছাড়াও আমার ক্ষেত্রে ডিবি ফাইল অ্যাক্সেস করার আগে আমাকে 777 ব্যবহার করতে হবে এবং প্রথমে / পাশাপাশি-উপাত্ত-ডিরেক্টরিতে এটি প্রয়োগ করতে হয়েছিল।
muetzenflo

1
আমার ডিভাইসটি শিকড়যুক্ত, তবে আমি দেখতে পেয়েছি suযে run-asকমান্ডটি কাজ করার জন্য আমার এখনও চালানো দরকার ।
টমাসডাব্লু

আপনার এসডি কার্ড না থাকলে কী হবে?
গিয়াম ফক্স

1
আপনার যদি এসডি কার্ড না থাকে তবে এখনও একটি "এসডিকার্ড" ডিরেক্টরি রয়েছে।
গাছগুলিআর সর্বত্র

1
গ্রেট !. এটা খুবই আমার জন্য কাজ করেন. আমরা কি একটি ব্যাচ / শেল ফাইল তৈরি করতে পারি? প্যারাম হিসাবে কেবল ডিবি ফাইলের নামটি পাস করা হচ্ছে এবং আমাদের ডিবি ফাইল রয়েছে।
কাদির হুসেন

22

যদি কেউ ডিবাগ অ্যাপ্লিকেশন থেকে ডাটাবেস টানতে খুঁজছেন তবে নীচের পদ্ধতিটি ব্যবহার করতে পারেন:

  1. অনুসন্ধান এবং ওপেন ডিভাইস ফাইল এক্সপ্লোরার

অনুসন্ধান এবং ওপেন ডিভাইস ফাইল এক্সপ্লোরার

  1. আপনার হ্যান্ডসেটটি নির্বাচন করুন এবং তারপরে data/dataডিরেক্টরিতে ব্রাউজ করুন

ডেটা / ডেটা ডিরেক্টরিতে যান

  1. এখন আপনার অ্যাপ্লিকেশন প্যাকেজটি সন্ধান করুন এবং ডাটাবেস ফোল্ডারে যান। আপনি সেখানে ডাটাবেসগুলি দেখতে পাবেন এবং ডান ক্লিকের উপর, আপনি আপনার ড্রাইভে এটি সংরক্ষণ করার বিকল্প পাবেন।

এখানে চিত্র বর্ণনা লিখুন


1
বাহ,
অ্যাডবি

9

আমি ডেটাবেস ডাম্পিংয়ের জন্য একটি সাধারণ শেল স্ক্রিপ্ট প্রকাশ করেছি:

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

এটি এখানে বর্ণিত দুটি স্বতন্ত্র পদ্ধতি সম্পাদন করে:

  1. প্রথমত, এটি অন্যান্য ব্যবহারকারীদের জন্য ফাইলটিকে অ্যাক্সেসযোগ্য করার চেষ্টা করে এবং এটি ডিভাইস থেকে টানতে চেষ্টা করে।
  2. যদি এটি ব্যর্থ হয়, এটি ফাইলের সামগ্রীগুলি টার্মিনালের উপর দিয়ে স্থানীয় মেশিনে প্রবাহিত করে। \rশেল থেকে কিছু ডিভাইস আউটপুট আনতে এমন অক্ষরগুলি সরাতে এটি একটি অতিরিক্ত কৌশল করে ।

এখান থেকে আপনি বিভিন্ন সিএলআই বা জিইউআই এসকিউএল অ্যাপ্লিকেশন ব্যবহার করতে পারেন, যেমন 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/

প্রথম প্রস্থানটি রান-আসনের বাইরে বেরিয়ে আসা, দ্বিতীয় প্রস্থানটি টানতে করতে অ্যাডবি শেল থেকে বেরিয়ে আসা।


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
এমনকি একাধিক ফাইলের জন্য এটি এখনও কেবল একটি একক আদেশ। আপডেটটি দেখুন স্ট্যাকওভারফ্লো.com/a/18472135/1778421 আপনি যদি পছন্দ করেন তবে আপনি ফাইলগুলি আনপ্যাক করার জন্য হোস্টের পাশের আরও একটি পাইপ যুক্ত করতে পারেন
অ্যালেক্স পি।

2

আপনার স্থানীয় কম্পিউটারে ফাইল ডাউনলোড করার জন্য অনেক সহজ পদ্ধতির:

আপনার পিসি শেল রান:

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

খুব কাছাকাছি তবে এটি আমার জন্য একটি ত্রুটিযুক্ত ডিবি টেনে আনে।
Nae থেকে

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

রিয়েলম ডাটাবেস পাওয়ার জন্য আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন।


0

যদি কেউ অন্য একটি উত্তর খুঁজছেন যা Databaseপাশাপাশি পুনরুদ্ধার করতেও ব্যবহৃত হতে পারেShared Preferences তবে এই পদক্ষেপটি অনুসরণ করুন:

আপনার build.gradleআপনার app অ্যাড লাইনের ফাইল

ডিবাগম্পাইল 'com.amitshethar.android:debug-db تسয়.0.0'

এখন আপনি যখন আপনার অ্যাপটি non-releaseমোডে চালাবেন তখন আপনার অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে আপনার ডিভাইস থেকে 8080 পোর্টটি খুলবে IP addressতা নিশ্চিত করে নিন যে আপনার ডিভাইসটি সংযুক্ত রয়েছে wifiএবং আপনি laptopএকই নেটওয়ার্কটি ভাগ করছেন। এখন কেবল ইউআরএল দেখুন

HTTP: // your_mobile_device_ip: 8080 /

অংশীদারি পছন্দগুলি সহ ডাটাবেসের সমস্ত ডেটা দেখতে।


0

এখানে এমন একটি সমাধান রয়েছে যা অ্যান্ড্রয়েড 5.1 চালিত কোনও ডিভাইসে কাজ করে। নিম্নলিখিত উদাহরণটি উইন্ডোজের জন্য।

আপনার যা দরকার তা sed (অথবা উইন্ডোজ, যেমন cygwin থেকে sed.exe।) (ইউনিক্স উপর, এটা ঠিক সেখানে থাকব;))। কমপক্ষে উইন্ডোজে খারাপ '\ 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

সেড কমান্ডটি / r অক্ষরগুলি অনুসরণ করে।

অবশ্যই আপনার অ্যাপ্লিকেশনটির প্যাকেজের নামের সাথে "com.yourcompany.yourapp" এবং অ্যাপ্লিকেশনটির ডাটাবেসের নামের সাথে "আপনার ডেটাবেসনেম" প্রতিস্থাপন করা উচিত।


0

ব্যবহার করার সময় ডাটাবেস ফাইলটি এমটিপি থাকেadb run-as । রুমড্যাটাস ডাটাবেসে ক্লোজ () কল করে সমাধান করা যেতে পারে। এসকিউএলাইটকে তার জার্নালটি ডিস্কে লিখতে দিতে ক্লোজ () কল করুন। আমি এই বোতামটি তৈরি করেছি যা অনুরোধে ডাটাবেস সংযোগ বন্ধ করে দেয়:

জিপিএইচআই এর মাধ্যমে

রুমডাটাবেস উদাহরণটিতে কীভাবে কল করতে হবে তা এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.