2013년 5월 20일 월요일

[Android] root 경로 접근 및 파일 처리


루팅된 디바이스에서 다른 어플의 데이터를 접근해야 할 일이 생겨서

관련된 코드들을 좀 찾아봤는데

일단 국내 사이트에선 관련 자료가 정말 없더이다 ㅠ


일단 나의 목적은

root 경로의 파일 브라우징 및 파일 복사 처리였는데


처음엔 어리석게도 su 권한 얻은 상태에서

File 객체 열고 file.listfiles() 쓰면 root 경로 파일들도 다 볼 수 있을 줄 알았음 ㅋㅋㅋ

현실은 리턴 null이 날 반겨주네 ㅠ

몇 시간을 왜 null이 리턴되냐고!! 하며 삽질을 하다가

su 권한은 그렇게 쓰는게 아니라는걸 알게됨 ㅋㅋㅋㅋ 창피해라.


결론은 root 경로에선 File 객체 함수, FileInput/OutputStream 이딴거 못쓴다.

그럼 뭘 써야되냐

shell 명령어를 사용해야 함 (ls, cat)

관련해서 참고해야할 좋은 오픈 소스들이 있다.

- busybox 제작하신 분이 제공하는 roottools 라이브러리
https://code.google.com/p/roottools/

- ultra explorer 제작하신 분도 소스를 공개
https://github.com/kshark27/UltraExplorer

정말 고마우신 분들임.


이제 관련 코드를 간단히 살펴보자

BufferedReader reader = null;
try
{
 Process p = Runtime.getRuntime().exec("su");
 DataOutputStream os = new DataOutputStream(process.getOutputStream());
 reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
 os.writeBytes("명령어구문");
 os.flush();

 if(process.waitFor() != 0)
 {
  //
 }
 return reader;
}catch (IOException e)
{
}


뭐 대충 이런 식이다. (Ultra explorer 참고)

파일리스트를 얻고 싶으면 명령어구문에  ls 명령으로

결과값들을 BufferedReader에 담아 그걸 파싱해서 사용한다.

파일 복사는 'cat 파일 > 파일' 명령어를 사용한다. (cp는 busybox 없인 사용 못한다더라)

위 방법으로 다른 shell 명령들도 사용 가능.

자세한 내용은 오픈 소스를 참고하자.


댓글 3개:

  1. Root권한에서 dalvikvm으로 자바 코드 실행하면 루트권한에서 File 등을 실행할 수 있기는 하죠.

    답글삭제
    답글
    1. dalvikvm 처음 들어보네요. 안드로이드 초보라 ㅋㅋ
      한번 알아봐야겠네요. 좋은 정보 감사합니다.

      삭제
  2. 근데 디바이스 루팅은 어떻게 하셨나요 ?

    답글삭제