0%

Ubuntu에서 adb no permissions 또는 ????? no permissions 뜨는 현상

기존 ADB No Permissions 이슈를 다룬 포스트가 있어, 이 포스트로 통합 작성 및 수정을 완료했습니다.


시작

현재 여러 안드로이드 디바이스들을 활용하여, 앱 테스팅을 작업하고 있습니다.

진행 환경은 Ubuntu 18.04에서 Android Studio 로 작업하고 있습니다.

그런데 아무래도 adb CLI를 다루는 것에 좀 친숙해야하니까,
억지로라도 CLI 입력하여 작업하고 있는데..

1
2
List of devices attached
???????????? no permissions

화면에 떠 있는 저 두 줄이 저에게 찾아온 것이죠.


해결해봅시다

USB Debugging

Options > About Phone > Build number (또는 설정 > 단말기 정보 > 빌드 넘버 )를 3번 눌러서
Developer Options (개발자 옵션)을 활성화 시킵니다.
그리고 USB Debugging (USB 디버깅) 옵션을 체크합니다.

아마 대부분 이 건 체크를 하셨을테고…


USB 연결 모드 설정

이 부분은 많이들 까먹는 경우가 많습니다! 일부 기기들은 USB 디버깅할 때마다 매번 설정해줘야 하기 때문입니다.
대부분 USB Debugging 옵션을 설정하는 거에 마치는 분들이 많은데..
간혹 USB 연결시 ‘Charging(충전)’ 모드로 활성화하시는 분들이 계십니다.
adb 연결시 MTP (File Transfer) 프로토콜 연결을 활성화시킬 필요가 있습니다.
(PTP; Picture Transfer Protocol 도 지원하는 경우가 있으나, 보통은 MTP 옵션으로 맞추는 것이 일반적입니다.)

  1. 설정 (Settings) 이동
  2. 저장소 및 USB (Storage) 이동, 또는 개발자 옵션 (Developer Options) 이동
  3. USB 설정 선택 (USB Computer Connection) 화면 선택
  4. PTP (Picture Transfer Protocol) 라디오 버튼 선택

51-android.rules

Ubuntu(또는 Fedora 등) Linux 환경에서 개발하기 위해선, 각 기기의 USB Configuration 항목이 설정된 udev 파일을 추가해줘야합니다. 그리고 이 udev 파일에는 반드시 고유 제조사의 ID 번호가 반드시 기록되어 있어야 합니다.

이렇게 Android Debugging 용도로 추가해야 하는 파일의 이름은 51-android.rules 입니다.
이 파일의 경로는 /etc/udev/rules.d에 위치하여야 합니다.

/etc/udev/rules.d/51-android.rules

파일 존재 유무 확인

이 파일이 존재한지 확인합니다. 존재하다면 아래 과정을 진행해주세요

이 파일을 기록하는 포맷은 다음과 같습니다.

1
SUBSYSTEM=="usb", ATTR{idVendor}=="2a48", MODE="0600", OWNER="wgtech.dev"

여기서 가장 중요한 부분은 ATTR{idVendor} 입니다.

Windows는 각 제조사의 USB Driver를 이용하여 각각 설치해야하고,
Mac은 크게 설치해야하는 부분이 없다는 것과는 다르게, Linux 환경에서는 각각의 고유 제조사 번호를 알아야합니다.

아무튼 설명으로 돌아오자면

  1. SUBSYSTEM
  • 이는 USB로 연결할 것이라고 선언하는 문구입니다.
  1. ATTR{idVendor}
  • 여기를 참고하여 adb 연결할 기기의 제조사 ID를 입력해야합니다.
  1. MODE
  • 권한을 설정합니다. (여기서 600 = u+rw = 사용자에게 읽기(r;read)와 쓰기(w;write) 권한을 부여합니다.)
  1. OWNER
  • 시스템 프레임워크 개발시 Build 작성자의 이름을 정할 수 있습니다.
  • 여러 기기를 사용할 경우, 모든 줄(설정)의 OWNER 부분은 반드시 동일해야합니다. (그래야 헷갈리지 않으니까요!)

여기서 질문!

Q. 제조사 번호 (idVendor) 값을 모르겠어요..

A. lsusb 명령어를 이용하면 됩니다.

USB 연결 전 lsusb

1
2
3
4
5
6
7
8
9
10
11
$ lsusb

Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 020: ID 046d:c31d Logitech, Inc. Media Keyboard K200
Bus 001 Device 022: ID 2516:0051
Bus 001 Device 021: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

USB 연결 후 lsusb

1
2
3
4
5
6
7
8
9
10
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 020: ID 046d:c31d Logitech, Inc. Media Keyboard K200
Bus 001 Device 028: ID 2a48:5103
Bus 001 Device 022: ID 2516:0051
Bus 001 Device 021: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

차이를 확인하셨나요?

이 마치 수수께끼 같은 느낌..

정답은..

Bus 001 Device 028: ID 2a48:5103

여기서 2a48이 제조사 번호입니다. (여기서 2a48은 ‘일반 USB 기기’를 의미하는 제조사 번호입니다.)

제조사 번호와 기기ID를 파악했으니 51-android.rules 파일을 생성하여 다음과 같이 작성하면 됩니다.

/etc/udev/rules.d/51-android.rules
1
SUBSYSTEM=="usb", ATTR{idVendor}=="2a48", MODE="0600", OWNER="woody"

그리고 …!


AndroidManifest.xml 파일 수정

Android Studio, IntelliJ 또는 Eclipse 등의 IDE/Tools 프로그램에서
AndroidManifest.xml 파일을 아래와 같이 작성이 되어 있는지 확인해주세요.

1
2
3
4
<application>
(..중략)
android:debuggable="true">
</application>

adb 재실행

1
2
3
4
5
6
7
8
9
10
11
12
# adb가 켜져 있다면 종료 먼저 하기!
$ sudo adb kill-server

# 아래 중 여러분의 리눅스 환경에 따라 1가지를 골라 udev 서비스를 재시작해주세요.
$ sudo /etc/init.d/udev restart
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
$ sudo reload udev
$ sudo service udev restart

# 그리고 다시 adb를 실행시켜주세요.
$ sudo adb start-server

이로써, no permissions 나 ??????? 가 뜨는 현상은 해결될 수 있을 것입니다.


참고