[Android] 런타임 커맨드 실행해서 파일/폴더 복사하기 (root / noroot)
안녕하세요! 오늘 포스팅은 런타임 커맨드를 이용해 파일/폴더를 복사해 보도록 하겠습니다.
자바코드로 파일입출력을 통해 복사하려 하였지만, 간혹 Permission을 줘도 접근하지 못하는 영역들이 있습니다. (예 : 루팅이 필요한 구간)
그래서 기기를 루팅하면 괜찮겠지 싶었는데, 기기에서 루팅을 시켜줘도 권한이 없다고 동작을 안하면서 에러를 뿜어대더군요..
이럴때 사용해 볼만한 함수가 있는데 바로 Runtime클래스의 exec 함수입니다. 사용법은 아래와 같습니다.
Runtime.getRuntime().exec("커맨드 내용");
디렉토리를 만들고 싶다면,
Runtime.getRuntime().exec("mkdir " + filePath);
이런식으로 입력해주시면, 원하는 경로에 디렉토리를 만들라는 프로세스를 실행시킬 수 있습니다.
이 함수를 이용해서 파일/폴더 복사를 해봅시다.
private boolean run_cmd(boolean runAsRoot, String cmd) { String shell = runAsRoot ? "su" : "sh"; int exitCode = 255; Process p; try { p = Runtime.getRuntime().exec(shell); DataOutputStream os = new DataOutputStream(p.getOutputStream()); os.writeBytes(cmd + "\n"); os.flush(); os.writeBytes("exit\n"); os.flush(); exitCode = p.waitFor(); Toast.makeText(MainActivity.this, "명령을 성공적으로 수행했습니다.", Toast.LENGTH_SHORT).show(); } catch (IOException e1) { Toast.makeText(MainActivity.this, "입출력 오류가 발생했습니다. \n루팅이 되어있는지 확인해 주세요.", Toast.LENGTH_SHORT).show(); Log.e("Exception", e1.toString()); } catch (InterruptedException e) { Toast.makeText(MainActivity.this, "인터럽트 오류가 발생했습니다. ", Toast.LENGTH_SHORT).show(); Log.e("Exception", e.toString()); } return (exitCode != 255); }
이렇게 함수로 만들어 놓고,
run_cmd(true,"cp -r /원본 폴더,파일 경로/ /복사할 폴더의 경로/");
이런식으로 사용하면 편리합니다! 첫번째 매개변수는 root 권한이 필요한 경우 true로 넣어주시면 되겠습니다!