SW 그리고 아빠 엔지니어링 중...

아는 만큼 보이고, 경험해봐야 알 수 있고, 자꾸 써야 내 것이 된다.

개발/생각한 것 개발하기

Android - 다른 앱의 로그를 수집하는 방법 정리 및 App 코드

보리남편 김 주부 2022. 5. 30. 02:07

수정 : 22.06.11

 

수집의 필요성

N 개의 앱들의 로그는 시스템에서 일괄적으로 관리 한다. App 입장에서는 한정된 로그로 인해 디버깅의 불편함이 있다고 해서 로그 용량을 늘리거나 별도의 파일을 만드는 일들은 시스템 관점에 허용해 줄수없는 trade off 이다.

 

샘플앱을 만들어서 로그를 저장하는 앱을 만듦

앱자체에 별도 로그를 저장하도록 넣는 것은 앱 본연의 기능은 아니기에 별도 앱으로 개발하여, 로그 확보가 필요한 App의 품질에는 영향을 주지 않으면서 로그를 취득하고자 한다.

 

문제점

저장된 로그가 샘플앱의 로그만 저장 됨.(여러가지 실패 케이스는 다른 포스트로 정리가 되는대로 올리겠다.)

 

개인정보 문제로 Android 4.2 부터 다른 앱의 로그를 저장하는 기능이 원천적으로 막힘

(이에대한 자세한 설명은 여기를 참조 하기 바란다.)

 

하지만 여러가지 우회하는 방법으로 시도해봄

1) logcat -f 를 하면 파일이 생성이 되는데 본인 process 의 로그 파일만 생성이 됨

 

2) 별도 프로세스로 logcat 을 실행하여 해당 process 를 벗어나서 로깅을 시도했는데 부모 프로세스인 실행 app의 로그만 저장이 됨. ex) "logcat > log.txt" 

 

3) adb shell로 연결하여 실행된 logcat 은 전체 로그를 볼 수 있기에 logcat 을 sh 파일안에 넣어 실행을 해봄

L 2) 의 케이스와 같게 sh 을 실행하는 process 의 부모 프로세스의 로그만 취득함

 

4) python에서 명령을 전달 받아 Logcat이 실행되어 App을 벗어난 전체 로그를 저장해 본다.

파이썬 파일들은 product 된 단말에서 실행권한을 부여할 수 없어 python 파일을 실행할 수가 없다.ㅜㅜ


5) logging 되는 파일을 복사해오는 방식

읽기가 안되는 파일을 내가 핸들링 할수 있는 곳으로 복사해 와서 읽기를 시도 시 복사한 파일에 권한이 없어서 읽을 수 없다. 

java.io.FileNotFoundException: //storage/self/primary/logcat1.log : open filed : EACCES (Permission denied)

복사해온 파일을 permission 변경을 시도는 되지만 실제론 변경이 안되어 읽을 수 없다.

 

 

/dev/log 에 저장이 되며 logcat 을 통해서 stdout 되므로 별도로 취득할 수 있는 방법이 있을 듯 하지만 현재까지는 이 방법을 해결은 못했다. 좀더 관련 정보가 쌓여서 해결이 되면 추가 포스팅 하도록 하겠습니다.

https://elinux.org/File:Android-logging-kmc-kobayashi.png

 


Android 4.2 부터 타앱의 기록이 안된다고 했지만 4.2 에서까지는 다른앱의 로그를 취득하는 방법이 있었다.
보안상 우회하는 방법이기도 하고 접근이 된다는 것 자체가 kernel 에 영역에 영향을 미칠 수 있는 부분 이기에 
추천하지 않는다.

추가 확인 플랫폼 정보 : 플랫폼 버전 Android 4.2 / API 레벨 17/ 플랫폼 명 JellyBean

 

방법은 간단하다. 공유id를 log 와 같게 맞춰주면 로그 프로세스의 권한을 가지며 전체 로그를 취득할 수 있는 권한을 가지게 된다.

 

<manifest xmlns:android ....

    android:sharedUserId = "android.uid.log"

   .... > 

sharedUserId 를 변경하고 App 실행시 아래 에러가 발생을 한다.
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

sharedUserId 는 linux 의 user Id 와 유사한 개념이라 기존 앱과 호환이 안되서 발생하는 것으로 이는 앱을 삭제하고 다시 실행하면 된다.

$ pm uninstall <package>
android에 내장된 공유 UID
android.uis.system (SYSTEM_UID, 1000)
android.uid.phone (PHONE_UID, 1001)
android.uid.bluetooth (BLUETOOTH_UID, 1002)
android.uid.log (LOG_UID, 1007)
android.uid.nfc (NFC_UID. 1027)

data/system/package.xml 내에 위 5개가 정의되어 있다.
공유 id 관련 좀더 자세한 정보를 윈하면 여기 
단 rooted 된 device 여야만 가능하다. 

플랫폼 4.4 KitKat 버전 단말에서 확인해 봤을 때는 로깅이 안되서 플랫폼이 4.2 까지 가능하다고 생각했었는데 그게 아니라 공유 id 로 매칭을 시켜줘도 로그의 권한을 획득하지 못해서 사용이 불가능한 것이였다. (인증서 셋트가 일치하지 않기 때문 ex) 플랫폼을 빌드할때 썼던 인증키를 이용해서 빌드한 키를가지고 빌드를 했다면 로그의 권한을 얻었겠지만 키가 일치하지 않아 권한을 얻지 못함)

 

* 로그의 권한을 부여 받았는지 확인하는 방법은 폴더를 생성할때 소유자와 그룹이 log 로 생성이 된다.(아마도 log의 프로세스의 권한을 가져서 인 것 같다.) 하지만 일반 단말(rooted가 안된 단말)에서는 아래와 같이 소유자와 그룹의 권한이 일반사용자의 권한만 가지고 있다고 확인할 수 있다.

drwxrwx--- root sdcard_r 2022-06-12 01:41 logs

shell@c1ktt:/mnt/shell/emulated/0/LoggerApp17/logs $ 
-rwxrwx--- root sdcard_r 1163264 2022-06-12 01:41 logcat_20220612014143.txt

 

참고 : sharedUserId를 API 29 레벨에서는 지원중단된다고 공식사이트에 게재되어 있기에 (여기) rooted 된 device 라도 동작하지 않을 수 있다.

 

작성된 app의 전체 코드는 아래 경로 참조

https://github.com/jabdong4ny/LoggerApp

 

GitHub - jabdong4ny/LoggerApp

Contribute to jabdong4ny/LoggerApp development by creating an account on GitHub.

github.com

 

728x90