Tại sao tôi bị từ chối truy cập vào thư mục dữ liệu khi sử dụng adb?


181

Tôi đã kết nối với thiết bị trực tiếp của mình bằng adb và các lệnh sau:

C:\>adb -s HT829GZ52000 shell
$ ls
ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.trout.rc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev
$ cd data
cd data
$ ls
ls
opendir failed, Permission denied

Tôi đã ngạc nhiên khi thấy rằng tôi có quyền truy cập bị từ chối. Tại sao tôi không thể duyệt qua các thư mục bằng cách sử dụng dòng lệnh như thế này?

Làm cách nào để truy cập root trên điện thoại?


Đơn giản ... đảm bảo màn hình điện thoại của bạn được bật. Nhấp vào "Cho phép" khi nó hỏi bạn có muốn Unknown biết quyền truy cập vào root không. Làm xong.

quyết định tạo một avd đơn giản để có quyền truy cập vào cơ sở dữ liệu. Có ai có bất kỳ liên kết đến hướng dẫn, mà không có flare "tùy chỉnh" và đồ họa cho các nhà phát triển? Chỉ cần làm thế nào để có được vanilla android đơn giản trên một thiết bị đã mua.
bss

Không có lời nhắc như vậy xảy ra trên thiết bị Android 7.1.1 của tôi. Nhưng adb đi trước và liệt kê nội dung của thư mục. Rắc rối là, nội dung không thực sự tồn tại. Tôi đang sử dụng đồng bộ hóa adb để thêm nội dung. Nó khá là lạ.
Tom Russell

Câu trả lời:


139

Có hai điều cần nhớ nếu bạn muốn duyệt mọi thứ trên thiết bị của mình.

  1. Bạn cần có một điện thoại có quyền truy cập root để duyệt thư mục dữ liệu trên điện thoại Android. Điều đó có nghĩa là bạn có thiết bị dành cho nhà phát triển ( ADP1 hoặc ION từ Google I / O) hoặc bạn đã tìm được cách 'root' điện thoại của mình theo cách khác.
  2. Bạn cần chạy ADB trong chế độ root, thực hiện điều này bằng cách thực thi: adb root

77
Và "adb root" yêu cầu một bản dựng adb tùy chỉnh, nếu không thì "adbd không thể chạy như root trong các bản dựng sản xuất"
bortzmeyer

16
xây dựng tùy chỉnh của adb? Tôi có thể lấy nó từ đâu?
Gopinath

9
câu trả lời nào cho câu hỏi @Gopinath?
Ewoks

2
@Gopinath: Tôi tin rằng bạn phải xây dựng nó từ nguồn cho thiết bị đích, được định cấu hình để cho phép root sử dụng ndk sau đó flash nó vào thiết bị cùng với hình ảnh của các tệp nhị phân.
Ben Jaguar Marshall

4
AFAIK, không cần thiết phải có một bản dựng adb tùy chỉnh. Cần phải có hỗ trợ adbd chạy dưới quyền root, nhưng adbd này có trên thiết bị - vì vậy, bất kỳ sửa đổi nào được thực hiện để làm cho thiết bị có quyền truy cập root là đủ.
nitzanms

222

Bắt đầu từ API cấp 8 (Android 2.2), đối với ứng dụng có thể gỡ lỗi (ứng dụng được Android Studio xây dựng mọi lúc trừ khi yêu cầu xây dựng bản phát hành), bạn có thể sử dụng run-aslệnh shell để chạy lệnh hoặc thực thi như một người dùng / ứng dụng cụ thể hoặc chỉ cần chuyển sang UID của ứng dụng của bạn để bạn có thể truy cập thư mục dữ liệu của nó .

Danh sách nội dung thư mục của yourapp:

run-as com.yourapp ls -l /data/data/com.yourapp

Chuyển sang UID của com.yourapp và chạy tất cả các lệnh khác bằng cách sử dụng uid đó (cho đến khi bạn gọi exit):

run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit

 
Lưu ý 1 : có một sự cố đã biết với một số điện thoại HTC Desire. Do chủ sở hữu / quyền không chuẩn của /data/datathư mục, run-aslệnh không chạy trên các điện thoại đó.

Lưu ý 2 : Như đã nêu trong các nhận xét của @Avio: run-ascũng có vấn đề với điện thoại Samsung Galaxy S chạy Cyanogenmod ở bất kỳ phiên bản nào (từ 7 đến 10.1) vì trên nền tảng /data/datanày là một liên kết tượng trưng /datadata. Một cách để giải quyết vấn đề là thay thế symlink bằng thư mục thực tế (không may điều này thường yêu cầu quyền truy cập root).


2
Điều này hoạt động như bạn đã giải thích nơi bạn run-as com.mypackage. Vấn đề tôi gặp phải là sqlite3 /data/data/com.mypackage/databases/mydb"sqlite3: quyền bị từ chối". Chỉ có thể chạy sqlite3 bằng root?
styfle

5
Hoạt động như sự quyến rũ khi liệt kê các tệp được lưu trữ trong bộ nhớ trong.
zaplec

5
Tôi đã phải thay đổi quyền trên tệp để có thể di chuyển nó vào sdcard của mình, vì tôi không thể cp nó chạy như ứng dụng của mình. Vì vậy, 1) chạy như com.package.example, chmod 777 databasefile.db. 2) thoát, đi đến sdcard, cp /data/data/com.package.example/database/databasefile.db. Và bước 3 sẽ hoàn nguyên các quyền 777
Maragues

3
Gói của tôi không rõ cho dù tôi đánh vần chính xác vào thiết bị đầu cuối của mình như thế nào: (
Costa

3
Đây phải là câu trả lời được đánh dấu chính xác vì đây là phương pháp phù hợp để sử dụng cho điện thoại không root.
LNI

49

Trước khi chúng tôi bắt đầu, bạn có điện thoại bắt nguồn không? nếu không, tôi thực sự khuyên bạn nên đến lúc bạn thực hiện cú nhảy. 99% các hướng dẫn giúp bạn thực hiện điều này yêu cầu bạn phải có điện thoại đã root (Tôi biết b / c Tôi đã dành khoảng một giờ để tìm cách thực hiện mà không cần điện thoại đã root .. không thể tìm thấy bất kỳ .. ) nếu bạn nghĩ về nó, iPhone của bạn cũng phải được root để thực hiện nhiệm vụ tương tự. Vì vậy, nó hoàn toàn hợp lý. Thông tin thêm về root ở cuối câu trả lời.

từ loại dòng lệnh của bạn:

adb shell

điều này đưa bạn đến dòng comand shell Android của bạn (bạn sẽ thấy một cái gì đó như thế này: shell@android:/ $bây giờ gõ:

shell@android:/ $run-as com.domain.yourapp

điều này sẽ đưa bạn trực tiếp đến thư mục dữ liệu của com.domain.yourapp:

shell@android:/data/data/com.domain.yourapp $ 

nếu nó không (nghĩa là nếu bạn gặp lỗi) thì có lẽ bạn không có điện thoại đã được root hoặc bạn chưa sử dụng đặc quyền người dùng root của mình. Để sử dụng đặc quyền người dùng root của bạn, hãy nhập sudòng lệnh adb và xem điều gì xảy ra, nếu bạn gặp lỗi, thì điện thoại của bạn không được root. Nếu không, hãy root nó trước, sau đó tiếp tục các hướng dẫn này.

từ đó bạn có thể nhập lsvà bạn sẽ thấy tất cả các thư mục bao gồm các dbs:

shell@android:/data/data/com.domain.yourapp $ ls

cache
databases
lib
shared_prefs   

sau đó, bạn có thể sử dụng sqlite3 để duyệt dbase .. nếu bạn chưa cài đặt nó (bạn có thể tìm ra nó bằng cách gõ sqlite3, nếu bạn nhận được command not foundthì bạn sẽ phải cài đặt nó. Để cài đặt sqlite, hãy làm theo hướng dẫn tại đây .

về root: nếu bạn chưa bao giờ root điện thoại của bạn trước đây và bạn lo lắng về việc nó làm hỏng điện thoại của bạn, tôi có thể nói với bạn với sự tự tin hoàn toàn rằng không có gì phải lo lắng. Có rất nhiều hướng dẫn root điện thoại nhanh chóng và dễ dàng cho hầu hết các kiểu máy mới và cũ ngoài kia, và bạn có thể root điện thoại của mình ngay cả khi bạn có máy mac (tôi đã root máy s3 bằng máy mac).


8
Bạn không cần một điện thoại bắt nguồn run-asđể làm việc. Tôi vừa thử nó trên Galaxy Nexus S. xây dựng sản xuất
Ted Hopp

@TedHopp và vì vậy b / c nó chỉ hoạt động tốt trên Galaxy Nexus S sản xuất của bạn .. nó sẽ hoạt động tốt trên tất cả các điện thoại Android phải không?
abbood

Đầu tiên, điện thoại của tôi là một ví dụ cho thấy điện thoại đã được root không cần thiết . Thứ hai, vâng, nó nên hoạt động trên tất cả các thiết bị chưa root, ít nhất là Android 2.2 (không phải nó hoạt động trên điện thoại của tôi, mà vì đó là cách nó hoạt động; xem câu trả lời của Idolon ).
Ted Hopp

Cá nhân @TedHopp tôi không phải là một nhà phát triển Android .. và vì vậy những chỉ dẫn như thế build the application as debuggable (either by building it with the Eclipse, or ant debug command)có vẻ tầm thường với bạn, nhưng họ làm tôi sợ. Tôi đoán câu trả lời của tôi là nhiều hơn cho những người thoải mái với việc root điện thoại Android của họ, nhưng không thành thạo trong thế giới phát triển Android. Nhưng tôi rất vui vì chúng ta đang có cuộc thảo luận này .. Tôi muốn các độc giả của câu trả lời của tôi biết về các lựa chọn không root khác
abbood

1
Người đàn ông trả lời tuyệt vời. Tôi đang sử dụng một vài điện thoại khác nhau ở đây, (MotoX, nexus4, LG G3, SGIII) và điều này là khá tốt cho tất cả.
Chad Bingham

44

$ adb shell

$ cd / dữ liệu

$ ls

opendir thất bại, quyền bị từ chối


Bạn nên làm điều này:

$ adb shell

$ cd /data

shell@android:/data $ run-as com.your.package 

shell@android:/data/data/com.your.package $ ls

ĐỒNG Ý!


Những công việc này! Một vài điều cần được thực hiện trước khi thực hiện bất kỳ lệnh nào. Khi các tùy chọn nhà phát triển được bật trên điện thoại, chúng tôi cũng sẽ cần bật gỡ lỗi USB . Tôi cũng đã kích hoạt thêm một số thứ trên điện thoại của mình (HTC M8) có tên Chọn ứng dụng gỡ lỗi và chọn ứng dụng của tôi. Có thể là tiêu chuẩn trên tất cả các điện thoại ... nên được.
srinij

30

Tôi gặp vấn đề tương tự khi cố gắng vận hành trên Samsung Galaxy S. Đã phát lệnh từ vỏ máy tính

> adb root

thất bại với thông báo "không thể chạy bằng root trong bản dựng sản xuất". Đây là một phương pháp đơn giản cho phép trở thành root.

Thay vì trước đó, ban hành hai lệnh sau lần lượt từng lệnh khác

> adb shell
$ su

Sau lệnh đầu tiên, nếu lời nhắc đã thay đổi từ '>' thành '$' như được hiển thị ở trên, điều đó có nghĩa là bạn đã vào môi trường shell adb. Nếu sau đó, dấu nhắc đã thay đổi thành '#' sau khi ban hành lệnh thứ hai, điều đó có nghĩa là bạn hiện đã root. Bây giờ, với quyền root, bạn có thể làm bất cứ điều gì bạn muốn với thiết bị của mình.

Để chuyển về vỏ 'an toàn', hãy phát hành

# exit

Bạn sẽ thấy dấu nhắc '$' xuất hiện lại có nghĩa là bạn đang ở trong vỏ adb với tư cách là người dùng chứ không phải là root.


13
su: sự cho phép bị từ chối
petrnohejl

3
Thật sự cảm ơn! Btw bạn cần phải có một điện thoại gốc để làm điều này. Bạn cũng có thể cần SuperSU hoặc một cái gì đó tương tự? Ít nhất là khi tôi cố gắng sử dụng "su" SuperSU đã cho tôi một hộp thoại trên điện thoại của tôi.
Richard Fung

16
/ system / bin / sh: su: không tìm thấy
matt lohkamp

1
Cảm ơn bạn :) đã adb shell + sugiải quyết điều khó chịu cho phép mãi mãi. Tôi gặp sự cố về su: not foundAndroid 4.3 nhưng vì tôi đã nâng cấp lên phiên bản 4.4.2. 4.3 dường như có vấn đề.

3
su không có sẵn cho tôi, Nexus 5 / Android 5.1 - có cách giải quyết không?
CodeManX

19

Tôi cũng có rất nhiều rắc rối với điều này. Tôi vẫn không hiểu đầy đủ quyền và chạy gốc, nhưng điều này đã làm việc cho tôi (một trong những câu trả lời trước đó) để sao chép tệp cơ sở dữ liệu từ / data / data / [tên gói] /database/my_db.db. Chạy shell root hoặc su trong shell vì một số lý do không hoạt động, cũng không sao chép tệp db (mặc dù tôi có thể điều hướng đến thư mục), cũng như sqlite3 .

Vì vậy, điều này đã làm việc! Trong dấu nhắc lệnh của DOS:

C:\Program Files\Android\android-sdk\platform-tools>adb shell
1|shell@android:/ $ run-as de.vogella.android.locationapi.maps
run-as de.vogella.android.locationapi.maps
1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data
cd /data
shell@android:/data $ cd data
cd data
shell@android:/data/data $ cd de.vogella.android.locationapi.maps
cd de.vogella.android.locationapi.maps
shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases
cd databases
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls
ls
bus_timetable_lines.db
bus_timetable_lines.db-journal
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus
_timetable_lines.db > /sdcard/db_copy.db
 bus_timetable_lines.db > /sdcard/db_copy.db                                   <
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit   ^
exit
shell@android:/ $ exit
exit

C:\Program Files\Android\android-sdk\platform-tools>

Bây giờ hãy vào thư mục SDCARD và nhận tệp db_copy.db của bạn. Ngay cả điều đó đã bị ẩn, nhưng tôi đã quản lý để gửi email. Quay trở lại Windows, tôi đã có thể mở tệp db bằng Trình duyệt cơ sở dữ liệu SQLite. :)


Tôi đã thử -> run-as <app_package_name> Nhưng adb không nhận ra app_package_name của tôi. Tôi đã sử dụng gói_name mà tôi đã chỉ định trong AndroidManifest.xml của mình. Có cái gì tôi đang thiếu?
ARK

3

Sau đây là hai bước để có quyền truy cập root:

  1. Thiết bị Android của bạn phải được root.
  2. Trong vỏ ADB, gõ su và thiết bị Android sẽ nhắc y / n? Bạn chọn cho phép.

gõ su .. sẽ đưa ra lời nhắc trên thiết bị di động .. yêu cầu siêu quyền thông qua Superuser .. nó đã hoạt động
Mahajan344

2

xây dựng sản xuất không thể nhập / dữ liệu / ứng dụng

drwxrwx--- system   cache             1970-01-01 08:00 cache
drwxrwxr-x root     system            1970-01-01 08:00 mnt 
drwxrwx--x system   system            1970-01-01 08:15 data

có thể cần thay đổi để đúng chủ sở hữu để vận hành nó.


2

Vấn đề có thể là chúng ta cần cung cấp quyền truy cập gốc adb trong các tùy chọn phát triển trong các CM mới nhất .. Đây là những gì tôi đã làm.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * daemon không chạy. bắt đầu ngay bây giờ trên cổng 5037 * * daemon đã bắt đầu thành công * quyền truy cập root bị vô hiệu hóa bởi cài đặt hệ thống - bật trong cài đặt -> tùy chọn phát triển

sau khi thay đổi các tùy chọn phát triển ...

abc@abc-L655:~$ sudo adb kill-server
abc@abc-L655:~$ sudo adb root start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
restarting adbd as root
abc@abc-L655:~$ adb shell
root@android:/ # ls /data/ .... good to go.. 

1

nếu bạn biết gói ứng dụng, bạn có thể cdtrực tiếp đến thư mục đó ..

ví dụ cd data/data/com.yourapp

điều này sẽ đưa bạn vào một thư mục read/writableđể bạn có thể thay đổi các tập tin khi cần thiết. Vì thư mục giống nhau trên emulator, bạn có thể sử dụng nó để lấy đường dẫn thư mục.


2
Tôi có thể cd trực tiếp vào thư mục, nhưng tôi vẫn gặp lỗi "opendir fail, cho phép bị từ chối".
Tyler Collier

Điều này là do người dùng "shell" của adb đã thực thi quyền trên các thư mục, nhưng không đọc được quyền.
Chris Stratton

0

Nếu bạn chỉ muốn xem DB & Bàn của mình thì cách tốt nhất là sử dụng Stetho. Công cụ khá tuyệt vời cho mọi nhà phát triển Android sử dụng SQLitebuit by Facobook developed.

Steps to use the tool

  1. Thêm phần phụ thuộc bên dưới vào tệp lớp của ứng dụng của bạn (Mô-đun: ứng dụng)

'biên dịch' com.facebook.stetho: stetho: 1.4.2 '

  1. Thêm dòng mã bên dưới vào phương thức Activity onCreate () của bạn
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Bây giờ, hãy xây dựng ứng dụng của bạn & Khi ứng dụng đang chạy, bạn có thể duyệt cơ sở dữ liệu ứng dụng của mình bằng cách mở chrome trong url:

chrome://inspect/#devices

Ảnh chụp màn hình giống như dưới đây_

ChromeInspact

ChromeInspact

DB của bạn

DB của bạn

Hy vọng điều này sẽ giúp tất cả! :)


0

Điều này hoạt động nếu thiết bị Android của bạn được root bằng bất kỳ phương tiện nào (không chắc chắn nếu nó hoạt động cho không root).

  1. adb shell - truy cập vào vỏ
  2. su - trở thành siêu người dùng.

Bây giờ bạn có thể đọc tất cả các tập tin trong tất cả các thư mục.


-3

mà không cần root thiết bị, bạn có thể truy cập các tập tin bằng cách sau Ảnh chụp màn hình cmd:

  1. bắt đầu adb bằng cmd từ thư mục công cụ nền tảng theo người dùng của bạn

    cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools

    nó có thể nằm trong một thư mục khác tùy thuộc vào nơi bạn cài đặt nó.

  2. hiển thị các thiết bị làm việc.

    adb devices

    cho biết câu trả lời os lệnh là

    List of devices attached
    0123456789ABCDEF     device
  3. viết lệnh

        adb -s 0123456789ABCDEF shell "su"

    nó sẽ mở trong

        root@theDeviceName:/ #

4. Xử lý tập tin, liệt kê tất cả các tập tin

ls

và thư mục chang trên bất kỳ nơi nào khác như thư mục dữ liệu

cd data/data

1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: không tìm thấy
Solo

trong trường hợp của tôi, đó là Android 5.0.2, tôi không biết nó có khác phiên bản khác với @Koen
Mahmoud Ashraf

đường dẫn phụ thuộc vào nơi bạn đã cài đặt studio android và đó là SDK @Solo
Mahmoud Ashraf

1
Vấn đề không phải là tìm nơi adb. Đó là trong ĐƯỜNG của tôi. Lấy danh sách tệp (hoặc thậm chí thực thi su) không hoạt động / không được phép. Thử nghiệm với Android 4.3.
Koen

không tìm thấy su
Brill Pappin

-5

Khi bạn đang ở trong thư mục shell cho thiết bị. Chỉ cần chạy

su - root

Sau đó, bạn sẽ có thể truy cập dữ liệu / thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.