Android에서 셸 명령 실행: 일반적인 함정 분석
Android 개발 시 셸 명령 실행이 필요한 경우가 발생할 수 있습니다. . 그러나 Java 애플리케이션 내에서 이러한 명령을 실행하려고 할 때 일반적인 함정이 발생할 수 있습니다. 이러한 함정 중 하나는 루팅된 장치에 슈퍼유저 권한을 부여하는 "su" 명령에서 발견됩니다.
screenrecord 명령을 사용하여 화면을 캡처하는 시나리오를 생각해 보세요. 애플리케이션 에뮬레이터 터미널을 통해 실행하면 명령이 녹음을 성공적으로 시작합니다. 그러나 Runtime.getRuntime().exec() 메서드를 사용하여 Java에서 동일한 명령을 실행하면 녹음이 생성되지 않습니다.
명령을 "su" 프로세스에 전달하는 방법에서 불일치가 발생합니다. 에뮬레이터 터미널에서는 명령을 직접 입력할 수 있지만 Java에서는 명령이 표준 입력을 통해 "su" 프로세스에 대한 입력으로 제공되어야 합니다.
해결책에는 명령을 "su" 프로세스의 프로세스로 리디렉션하는 방법이 포함됩니다. DataOutputStream을 사용하는 표준 입력. 수정된 코드 조각은 다음과 같습니다.
try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); }
명령을 표준 입력으로 리디렉션함으로써 "su" 프로세스는 명령을 수신하고 이를 루트 권한으로 승격시켜 화면 녹화를 성공적으로 실행합니다. 이 기술을 사용하면 수퍼유저 권한이 필요한 경우에도 Android 애플리케이션에서 셸 명령을 효과적으로 실행할 수 있습니다.
위 내용은 Java 및 에뮬레이터 터미널에서 'su' 명령을 다르게 실행하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!