adb를 사용할 때 데이터 폴더에 대한 액세스가 거부되는 이유는 무엇입니까?


181

adb와 다음 명령을 사용하여 라이브 장치에 연결했습니다.

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

액세스가 거부 된 것을보고 놀랐습니다. 이런 명령 줄을 사용하여 디렉토리를 탐색 할 수없는 방법은 무엇입니까?

전화기에서 루트 액세스 권한을 얻으려면 어떻게합니까?


간단 ... 휴대 전화 화면이 켜져 있는지 확인하십시오. 알 수 없음을 루트에 액세스 할 것인지 묻는 메시지가 나타나면 "허용"을 클릭하십시오. 끝난.

데이터베이스에 액세스 할 수있는 간단한 DVD를 만들기로 결정했습니다. 개발자를위한 "맞춤형"플레어 및 그래픽없이 가이드에 대한 링크가 있습니까? 구매 한 기기에서 일반 바닐라 안드로이드를 얻는 방법.
bgs

내 Android 7.1.1 기기에서 이러한 프롬프트가 발생하지 않습니다. 그러나 adb는 디렉토리의 내용을 나열합니다. 문제는 실제로 내용이 존재하지 않는다는 것입니다. 내용을 추가하기 위해 adb-sync를 사용하고 있습니다. 꽤 이상합니다.
톰 러셀

답변:


139

장치에서 모든 것을 탐색하려면 기억해야 할 두 가지가 있습니다.

  1. Android 전화에서 데이터 폴더를 찾아 보려면 루트 액세스 권한이있는 전화가 있어야합니다. 즉, 개발자 기기 ( ADP1 또는 Google I / O 의 ION )가 있거나 다른 방법으로 휴대 전화를 ' 루팅 '할 수있는 방법을 찾았습니다.
  2. 루트 모드에서 ADB를 실행해야합니다. 다음을 실행하여 수행하십시오. adb root

77
"adb root"는 adb의 커스텀 빌드가 필요합니다. 그렇지 않으면 "adbd는 프로덕션 빌드에서 루트로 실행할 수 없습니다"
bortzmeyer

16
adb의 사용자 정의 빌드? 어디서 구할 수 있습니까?
Gopinath

9
@Gopinath 질문에 대한 답변?
Ewoks

2
@Gopinath : 대상 장치의 소스에서 빌드해야하며 ndk를 사용하여 루트를 허용하도록 구성 한 다음 바이너리 파일의 이미지와 함께 장치에 플래시해야합니다.
벤 재규어 마샬

4
AFAIK, adb의 사용자 정의 빌드가 필요하지 않습니다. 루트로 실행되는 adbd 지원 이 필요 하지만이 adbd는 장치에 있으므로 장치에 루트 액세스 권한을 갖도록 수정 한 내용이면 충분합니다.
nitzanms

222

API 레벨 8 (Android 2.2)부터 디버깅 가능한 애플리케이션 (릴리스 빌드가 요청되지 않은 한 Android Studio에서 항상 빌드 한 애플리케이션)의 경우 쉘 run-as명령을 사용하여 특정 사용자 / 애플리케이션으로 명령 또는 실행 파일을 실행할 수 있습니다. 또는 응용 프로그램 의 UID 로 전환하여 해당 데이터 디렉토리에 액세스 할 수 있습니다 .

yourapp의 디렉토리 내용을 나열하십시오.

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

com.yourapp의 UID로 전환 하고을 호출 할 때까지 해당 uid를 사용하여 추가 명령을 모두 실행하십시오 exit.

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

 
참고 1 : 일부 HTC Desire 전화 에는 알려진 문제 가 있습니다. /data/data디렉토리 의 비표준 소유자 / 권한으로 인해 run-as해당 전화에서 명령이 실행되지 않습니다.

참고 2 : @Avio의 의견에서 지적 했듯이이 run-as플랫폼 /data/data에서는에 대한 symlink 이기 때문에 모든 버전 (7에서 10.1까지)에서 Cyanogenmod를 실행하는 Samsung Galaxy S 전화에도 문제가 있습니다 /datadata. 이 문제를 해결하는 한 가지 방법은 symlink를 실제 디렉토리로 바꾸는 것입니다 (불행히도 일반적으로 루트 액세스가 필요합니다).


2
이것은 당신이 어디에서 설명했는지에 따라 작동합니다 run-as com.mypackage. 내가 겪은 문제 sqlite3 /data/data/com.mypackage/databases/mydb는 "sqlite3 : permission denied"입니다. sqlite3는 루트 만 실행할 수 있습니까?
styfle

5
내부 저장소에 저장된 파일을 나열 할 때 매력처럼 작동합니다.
zaplec

5
내 응용 프로그램으로 실행중인 cp를 사용할 수 없기 때문에 파일을 sdcard로 옮길 수 있도록 파일에 대한 권한을 변경해야했습니다. 따라서 1) run-as com.package.example, chmod 777 databasefile.db. 2) 종료하고 sdcard, cp /data/data/com.package.example/databases/databasefile.db로 이동하십시오. 그리고 3 단계는 777 권한을 되돌려 야합니다
Maragues

3
터미널에 철자를 정확히 입력해도 패키지를 알 수 없습니다. (
Costa

3
루팅되지 않은 전화에 사용하는 올바른 방법이므로 정답으로 표시해야합니다.
LNI

49

우리가 시작하기 전에, 당신이해야 할 뿌리 전화를? 그렇지 않다면, 당신이 점프를 할 시간이라고 강력히 제안합니다. 이 작업을 수행하는 데 도움이되는 자습서의 99 %는 루팅 된 전화기가 필요합니다 (루팅 된 전화기 없이도 할 수있는 방법을 찾는 데 한 시간 정도 걸린다는 것을 알고 있습니다 .. ) 또한 당신이 그것에 대해 생각한다면, 동일한 작업을 수행하기 위해 iPhone도 뿌리를 내려야합니다. 따라서 합리적입니다. 대답의 끝에서 응원에 대해 자세히 알아보십시오.

명령 행 유형에서 :

adb shell

이것은 당신을 당신의 안드로이드 쉘 comand 라인으로 데려갑니다 shell@android:/ $.

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

이것은 다음의 데이터 디렉토리로 직접 이동해야합니다 com.domain.yourapp.

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

그렇지 않은 경우 (즉, 오류가 발생하는 경우) 루팅 된 전화가 없거나 루트 사용자 권한을 사용하지 않은 것입니다. 루트 사용자 권한을 사용하려면 suadb 명령 줄에 입력 하고 오류가 발생하면 어떤 일이 발생하는지 확인하십시오. 전화가 루팅되지 않은 것입니다. 그렇지 않은 경우 먼저 루팅 한 후이 지시 사항을 계속하십시오.

거기에서 입력 ls하면 db를 포함한 모든 디렉토리를 볼 수 있습니다 .

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

cache
databases
lib
shared_prefs   

그 후 sqlite3을 사용하여 dbase를 찾아 볼 수 있습니다. 설치되어 있지 않은 경우 (입력 한 sqlite3경우 입력하여 찾을 수 있음) command not foundsqlite를 설치하려면 여기의 지시 사항을 따르십시오 .

응원에 대해 : 당신이 전에 휴대 전화를 근절 하지 않고 전화를 망치 걱정이 있다면, 나는 걱정할 것이 없다고 전적으로 확신 할 수 있습니다. 거기에 거의 모든 새롭고 오래된 모델에 대한 빠르고 쉬운 전화 응원 자습서 가 있으며 Mac이있는 경우에도 휴대 전화를 응원 할 수 있습니다 (내 Mac과 함께 내 s3를 응원했습니다 ).


8
run-as작동 하기 위해 루팅 된 전화가 필요하지 않습니다 . 방금 프로덕션 빌드 Galaxy Nexus S에서 사용해 보았습니다.
Ted Hopp

@TedHopp과 b / c는 프로덕션 빌드 Galaxy Nexus S에서 잘 작동합니다. 모든 Android 휴대 전화에서 제대로 작동합니까?
abbood

먼저, 내 전화는 루팅 된 전화가 필요 하지 않음을 보여주는 반례입니다 . 둘째, 안드로이드 2.2 이상인 루팅되지 않은 모든 기기에서 작동해야합니다 ( 휴대 전화에서 작동 하기 때문이 아니라 작동 방식이므로 Idolon의 답변 참조 ).
Ted Hopp

@TedHopp 개인적으로 나는 안드로이드 개발자가별로 아니에요 .. 그래서 지시 build the application as debuggable (either by building it with the Eclipse, or ant debug command)가 당신에게 사소한 것처럼 들릴지 모르지만, 그들은 다소 협박합니다. 내 대답은 안드로이드 폰을 근절하기에 편하지만 안드로이드 개발자 세계에 정통하지 않은 사람들에게는 더 많은 것 같아요. 하지만 우리는이 논의가있어 다행이야 .. 내 대답의 독자가 아닌 다른 응원 대안을 숙지 할 것을 권장합니다
abbood

1
훌륭한 답변입니다. 나는 여기에 몇 가지 다른 전화 (MotoX, nexus4, LG G3, SGIII)를 사용하고 있으며 이것은 모두에게 좋습니다.
채드 빙엄

44

$ adb 쉘

$ cd / data

$ ls

opendir 실패, 권한 거부


이 작업을 수행해야합니다.

$ adb shell

$ cd /data

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

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

확인!


작동합니다! 명령을 실행하기 전에 수행해야 할 몇 가지 사항. 휴대 전화에서 개발자 옵션이 활성화되면 USB 디버깅 도 활성화해야합니다 . 또한 휴대 전화 (HTC M8)에서 디버그 응용 프로그램 선택 이라는 기능을 추가로 활성화 하고 내 응용 프로그램 을 선택했습니다. 모든 전화에서 표준이 될 수 있습니다.
srinij

30

루팅 된 Samsung Galaxy S에서 작동하려고 할 때 비슷한 문제가 발생했습니다. 컴퓨터 셸에서 명령 실행

> adb root

"프로덕션 빌드에서 루트로 실행할 수 없습니다"라는 메시지와 함께 실패합니다. 다음은 루트가 될 수있는 간단한 방법입니다.

위의 명령 대신 다음 두 명령을 차례로 실행하십시오.

> adb shell
$ su

첫 번째 명령 다음에 위와 같이 프롬프트가 '>'에서 '$'로 변경된 경우 adb 쉘 환경에 들어갔다는 의미입니다. 두 번째 명령을 실행 한 후 프롬프트가 '#'으로 변경된 경우 이제 루트 상태입니다. 이제 루트로 장치에서 원하는 모든 것을 할 수 있습니다.

'안전한'쉘로 다시 전환하려면

# exit

프롬프트 '$'가 다시 나타납니다. 이는 루트가 아닌 사용자로서 adb 쉘에 있음을 의미합니다.


13
su : 권한 거부
petrnohejl

3
정말 고마워! 그러나이 작업을 수행하려면 루팅 된 전화가 있어야합니다. SuperSU 또는 이와 유사한 것이 필요할 수도 있습니까? 적어도 "su"를 사용하려고했을 때 SuperSU가 전화로 대화를 나 gave습니다.
Richard Fung

16
/ system / bin / sh : su : 찾을 수 없음
matt lohkamp

1
감사합니다 :) adb shell + su성가신 허가 문제를 영원히 해결했습니다. su: not foundAndroid 4.3 에서 문제가 있었지만 4.4.2로 업그레이드 한 후 문제가 사라졌습니다. 4.3 문제가있는 것 같습니다.

3
su, Nexus 5 / Android 5.1을 사용할 수 없습니다. 해결 방법이 있습니까?
CodeManX

19

나는 이것에도 많은 어려움을 겪었다. 여전히 권한과 루트 실행을 완전히 이해하지 못했지만 / data / data / [package name] /databases/my_db.db에서 데이터베이스 파일을 복사하는 데 도움이되었습니다 (이전 답변 중 하나). 실행 쉘 루트 , 또는 SU을 하지 어떤 이유로 쉘에서 일했다, 나 DB 파일을 복사 (I 디렉토리 비록로 이동 수) 않았고 것은 한 sqlite3를을 .

그래서 이것은 효과가있었습니다! 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>

이제 SDCARD 디렉토리로 이동하여 db_copy.db 파일을 가져 오십시오. 심지어는 숨겨져 있었지만 이메일로 보낼 수있었습니다. Windows로 돌아가서 SQLite Database Browser로 db 파일을 열 수있었습니다. :)


나는-> run-as <app_package_name>을 시도했지만 adb가 app_package_name을 인식하지 못했습니다. 내 AndroidManifest.xml에 지정한 package_name을 사용했습니다. 내가 놓친 것이 있습니까?
ARK

3

루트 액세스 권한을 얻는 두 단계는 다음과 같습니다.

  1. 당신의 안드로이드 장치는 루팅해야합니다.
  2. ADB 쉘에서 su를 입력하면 안드로이드 장치가 y / n? 허용을 선택하십시오.

su .. 유형은 모바일 장치에 프롬프트를 표시합니다 .. 슈퍼 유저를 통해 슈퍼 권한 요청
..it

2

프로덕션 빌드는 / data / app를 입력 할 수 없습니다

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

올바른 소유자로 변경해야 할 수 있습니다.


2

문제는 특별히 최신 CM의 개발 옵션에서 adb 루트 액세스 권한을 부여해야한다는 것입니다. 여기 내가 한 일이 있습니다.

abc @ abc-L655 : ~ $ sudo adb kill-server
abc @ abc-L655 : ~ $ sudo adb 루트 시작 서버 * 데몬이 실행되지 않습니다. 포트 5037에서 지금 시작 * * 데몬이 성공적으로 시작되었습니다. * 시스템 설정으로 루트 액세스가 비활성화되었습니다-설정에서 활성화-> 개발 옵션

개발 옵션을 변경 한 후 ...

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

응용 프로그램 패키지를 알고 있으면 cd해당 폴더로 직접 이동할 수 있습니다.

예 : cd data/data/com.yourapp

그러면 read/writable필요한 디렉토리로 파일이 변경 될 수 있습니다. 의 폴더는 동일 emulator하므로 폴더 경로를 가져 오는 데 사용할 수 있습니다.


2
폴더에 직접 CD를 넣을 수는 있지만 여전히 "opendir 실패, 권한 거부"오류가 발생합니다.
Tyler Collier

adb의 "shell"사용자에게는 디렉토리에 대한 실행 권한이 있지만 읽기 권한이 없기 때문입니다.
Chris Stratton

0

당신이 당신보고 싶다면 DB 및 테이블을 다음 esiest 방법은 사용하는 것입니다 Stetho. SQLiteby by buit 를 사용하는 모든 Android 개발자를위한 멋진 도구입니다 Facobook developed.

Steps to use the tool

  1. 응용 프로그램의 gradle 파일에 아래의 dependeccy를 추가하십시오 (모듈 : app)

'compile'com.facebook.stetho : stetho : 1.4.2 '

  1. Activity onCreate () 메소드에 아래 코드 줄 추가
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

이제 애플리케이션을 빌드하고 앱이 실행 중일 때 URL에서 크롬을 열어 앱 데이터베이스를 탐색 할 수 있습니다.

chrome://inspect/#devices

동일한 스크린 샷은 다음과 같습니다 _

ChromeInspact

ChromeInspact

당신의 DB

당신의 DB

이것이 모두에게 도움이되기를 바랍니다! :)


0

안드로이드 기기가 어떤 식 으로든 루팅 된 경우 작동합니다 (루팅되지 않은 경우 작동하는지 확실하지 않음).

  1. adb shell -껍질에 접근
  2. su -수퍼 유저가 되십시오.

이제 모든 디렉토리의 모든 파일을 읽을 수 있습니다.


-3

장치를 루팅하지 않으면 다음 cmd 스크린 샷을 통해 파일에 액세스 할 수 있습니다.

  1. 사용자에 따라 platform-tools 폴더에서 cmd를 사용하여 adb를 시작하십시오.

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

    설치 한 위치에 따라 다른 폴더에있을 수 있습니다.

  2. 작동 장치를 표시하십시오.

    adb devices

    예를 들어 응답 os 명령은

    List of devices attached
    0123456789ABCDEF     device
  3. 명령을 쓰십시오

        adb -s 0123456789ABCDEF shell "su"

    그것은 열립니다

        root@theDeviceName:/ #

4. 파일 접근, 모든 파일 나열

ls

데이터 폴더와 같은 다른 곳으로의 디렉토리 변경

cd data/data

1
C : \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su"/ system / bin / sh : su : 찾을 수 없음
Solo

내 경우에 그것은 안드로이드 5.0.2 나는 그것이 버전과 다른 @ Koen와 다른지 모르겠다
Mahmoud Ashraf

경로는 안드로이드 스튜디오를 설치 한 위치에 따라 다르며 SDK @Solo
Mahmoud Ashraf

1
문제는 adb가 어디에 있는지 찾지 못합니다. 내 경로에 있습니다. 파일 목록 가져 오기 (또는 실행 su)가 작동하지 않거나 허용되지 않습니다. Android 4.3으로 테스트.
Koen

su를 찾을 수 없습니다
Brill Pappin

-5

장치의 쉘 디렉토리에있을 때. 그냥 뛰어

su - root

그런 다음 data / 폴더에 액세스 할 수 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.