Android 에뮬레이터에서 루트 액세스를 얻는 방법은 무엇입니까?


146

모든 Android SDK 버전 (1.5에서 2.3.3까지)이 있으며 Android 에뮬레이터에서 루트를 얻는 많은 방법을 시도했습니다. 나는 안드로이드 장치를 사용하지 않고 에뮬레이터 (AVD)에서 모든 것을 테스트합니다.

'iptables'및 'busybox'기능을 사용하려면 Android 에뮬레이터 중 하나에서 루트 액세스 권한이 필요합니다. 그리고 iptables를 사용하려면 루트 액세스 권한이 있어야합니다. Atleast 'su'명령은 터미널 에뮬레이터에서 실행해야합니다.

나는 또한 z4root응용 프로그램 을 설치

그러나 시간이 오래 걸리고 응원을 끝내지 못하고 막히게됩니다. 일부는 시스템을 RC30 이하로 다운 그레이드하면 루트 액세스 권한을 얻을 수 있다고 말합니다. 이것이 사실이라면 어떻게해야합니까? Linux와 Windows OS를 모두 사용합니다.

누군가 내 에뮬레이터를 근절하는 방법을 알려주십시오.


나는 매번 재부팅 할 때마다 시스템을 루팅하기 때문에 filecrop (android system의 VISIONary)에 저장된 "Root.apk"를 사용하여 에뮬레이터를 루팅 할 수 있다고 생각합니다. Z4root는 루트 액세스를 작동시키기 위해 재부팅이 필요하기 때문에 작동하지 않습니다.
JeremLeOuf

어디서 구할 수 있습니까? 이것에 대한 매뉴얼이 있습니까?
안드로이드 개발자

6
안드로이드 에뮬레이터는 이미 "루팅"되어 있습니다. 기본적으로 루트로 실행되므로 루트 adb 쉘을 얻기 위해 아무 것도 수행 할 필요가 없습니다. 여기서 논의 된 것은 응용 프로그램 코드가 루트로 실행되는 도우미 프로그램을 시작할 수 있도록 해킹 된 "su"또는 유사한 shim을 설치하는 것입니다.
Chris Stratton

2
사용 Genymotion는 genymotion.com 매우 빨리 기본적으로 루트가 있습니다.
klimat

1
wrnong 이미지를 설치했습니다. 여기를 참조하십시오-> stackoverflow.com/questions/43923996/…
wwwwwwwwwwww

답변:


136

이 답변은 모두 불필요하게 복잡합니다. :)

$ > adb shell
generic_x86:/ $
generic_x86:/ $ exit
$ > adb root
restarting adbd as root
$ > adb shell
generic_x86:/ #

52
adb root"adbd는 프로덕션 빌드에서 루트로 실행할 수 없습니다"의 결과를 실행 합니다. 특정 에뮬레이터를 사용하고 있습니까? 자세한 내용을 알려주십시오.
orodbhen

3
모든 앱에이 루트를 사용할 수 없습니다.
Enyby

5
누구나 새로운 Google Play 시스템 이미지에서이 기능을 사용하려고 시도하는 경우, adbd는 ramdisk.img에서 보안되도록 설정되어 있습니다. Google API 이미지에서 ramdisk.img를 사용하여 문제를 해결할 수있었습니다. 7.0 및 8.0 이미지를 모두 테스트했습니다.
tstaylor7

46
경우 adb root오류를 제공 adbd cannot run as root in production builds, 참조 stackoverflow.com/a/45668555/1682419을 - 당신은 "구글의 API 시스템 이미지"가 아닌 "구글은 시스템을 재생 이미지"를해야합니다.
Jerry101

10
@JRaymond 나는 adb 루트에 입력했지만 그 후에 아무것도 인쇄되지 않습니다

75

안드로이드 에뮬레이터를 근절하는 방법 (Android 7.1.1 / Nougat에서 테스트)

요구 사항 :

명령

  1. SuperSu.apk 설치

    • 먼저 SuperSu 앱을 설치하고 드래그 앤 드롭하십시오 (최신 에뮬레이터 버전을 실행하거나 adb를 통해 사이드로드하는 경우 adb -e install supersu.apk)

    • 설치 후, 실행하면 아래와 같이“SU 바이너리가 설치되어 있지 않습니다.”라는 화면이 표시됩니다. 이 오류는 장치가 아직 루팅되지 않았 음을 확인합니다.

여기에 이미지 설명을 입력하십시오


  1. 에뮬레이터의 시스템 파티션 쓰기 가능

    • 제안한대로 시스템 파일을 쓸 수있는 에뮬레이터 권한을 부여해야합니다.

    • 이를 위해 다음 코드를 입력하십시오. emulator -avd {emulator_name} -writable-system

AVD가 둘 이상인 경우 다음 명령을 사용하여 avd 목록을 얻을 수 있습니다. emulator -list-avds

참고 : Android SDK가 설치된 도구 폴더로 이동 한 다음 Shift 키를 누르고 마우스 오른쪽 단추를 클릭하여 명령 프롬프트를여십시오.


  1. 시스템 디렉토리에서 su 바이너리 푸시

    • 복구 flashable.zip 추출 (다른 아키텍처의 su 바이너리가 포함됨)

중대한! x86, arm 등과 같은 DVD 아키텍처와 일치하는 su 바이너리 만 사용하고이 바이너리를 추출한 경로를 기록하십시오.

  • 루트로 adb를 실행하고 다시 마운트해야합니다. 이 코드를 입력하십시오

adb root

adb remount

이제 su 바이너리를 푸시 할 시간입니다 :

이것은 내가 성공적으로 사용한 코드입니다 .adb -e push C:\Users\User1\Desktop\rootemu\x86\su.pie /system/bin/su

(su 바이너리의 특정 위치에 대해서는 신경 쓰지 마십시오. 공백이 없으면 모든 위치에 문제가 없습니다)

참고 : > ,> 전에 확인 bin하거나 xbin콘솔에서 수행 하려면adb shellls /system/xbin/su

이것이 실패하면 대신이 디렉토리로 넘어가십시오 /system/xbin/su. 또한 안드로이드 5.1 이하를 실행하는 에뮬레이터의 su경우su.pie


  1. su 바이너리의 권한 변경

    • 다음으로 su 바이너리의 권한을 약간 수정 해 봅시다. 에뮬레이터 장치에서 adb를 통해이 작업을 수행해야합니다.

    adb -e shell su root cd /system/bin chmod 06755 su

중대한!! su 이진 경로를 적어 둡니다 (광산은 / system / bin입니다).


  1. 설정 installSU 바이너리 및 세트 A의 지시를daemon

코드를 입력하십시오 :

su --install

그리고 데몬을 설정하기 위해 :

su --daemon&

중대한!! 간격을 기록해 두십시오


  1. SELinux를 허용으로 설정 (즉, SE Linux 끄기)

    • 마지막으로이 코드를 통해 selinux를 끄십시오 :

setenforce 0


  1. SuperSU 앱을 열고 바이너리 업데이트를 요청하면 일반 방법을 사용할 수 있습니다.

참고 : 부트 루프가 발생하면 바이너리를 업데이트하지 말고 그대로 사용하십시오.


그게 다야 !!

SU 권한이 필요한 응용 프로그램을 두 번 확인하기 만하면 실제로 SUSU가 su 권한을 부여 할 것인지 묻습니다.

여기에 이미지 설명을 입력하십시오

루트가 업데이트를 바이너리로 유지하려면 (일반 방법을 사용하여) temp 디렉토리에서 system.img를 복사 Users\AppData\Local\Temp\Android Emulator하고 (파일의 1359g.tmp크기 는 보통 무작위로 지정됩니다 ) 큰 값을 default로 바꿉니다 system.img.

업데이트 :

필자는 Linux보다 Windows에서 임시 시스템 이미지를 얻는 것이 더 쉽다고 지적했다. 스냅 샷 이미지를 사용해 볼 수 있습니다.

2018 년 8 월 4 일 업데이트

에뮬레이터가 등장 27.3.x하면서 스냅 샷 기능을 통해 루트를 훨씬 쉽게 보존 할 수 있습니다 ( system.img메서드 복사 가 작동하지 않는 경우 ).

이상적으로는 구성이 그대로있는 가상 장치를 최대 절전 모드로 유지하는 것과 비슷하므로 모든 것이 보존됩니다.

스냅 샷

이제 지정된 장치 구성에 대해 여러 AVD 스냅 샷을 저장하고 에뮬레이터를 시작할 때로드 할 저장된 스냅 샷을 선택할 수 있습니다. 스냅 샷을로드하여 가상 장치를 시작하는 것은 전원이 꺼진 상태에서 부팅하는 것이 아니라 절전 상태에서 물리적 장치를 깨우는 것과 매우 유사합니다.

이것은 에뮬레이터를 시작하기위한 유일한 요구 사항은 -writable-system매개 변수를 일반 emulator -avd [avdname]명령에 추가 하여 에뮬레이터를 시작하는 것입니다. ( 에뮬레이터 만 emulator -avd [avdname]실행하면 루팅 된 버전 / 복사본이 시작되지 않거나 약간의 오류가 발생할 수 있습니다 )

API 레벨 22에서 테스트

또한 bootloop 문제에 대해서는 다른 게시물을 참조하십시오 : Android Emulator : 루팅 후 부팅 루프를 피하는 방법? 및 그 업데이트.

비고

참고로 대부분의 내용은 이전 안드로이드 버전에 대한 것이기 때문에 내가 수정 한 다른 명령과 경로의 이유입니다.

감사의 말


1
참고 : 콘솔에서 bin 또는 xbin do를 확인하려면> adb shell,> ls / system / xbin / su
djdance

1
@xavier_fakerat 예, 바이너리 업데이트를 중단했습니다. 문제는 재부팅 할 때마다 컴퓨터를 다시 마운트 su --install && su --daemon&하고 에뮬레이터에서를 실행 한 다음 setenforce 0루트 를 가져와야한다는 것입니다 . 재부팅시 루트에 대한 영구적 인 수정 사항을 알고 있습니까?
Cristian Holdunu

1
좋은! 이 방법은 adb를 통해 루트에 액세스 할 수있는 실제 장치에서도 작동합니다.
Mygod

1
-writable-system을 사용하지 않을 때 이미지를 루팅 한 후 android 에뮬레이터가 예기치 않게 닫히는 이유에 대해 대답했습니다. 스냅 샷 때문입니다.
Rodrirokr

1
저는 Pixel 2 XL을 사용하고 있습니다. 사람들은 Pixel XL과 같은 문제가있는 것 같습니다 : forum.xda-developers.com/pixel-xl/how-to/…
noraj

33

에뮬레이터가 실행되는 동안 실행 해야하는 명령 목록은 다음과 같습니다.이 솔루션을 Android 2.2에서 avd로 테스트합니다.

adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system  
adb push su /system/xbin/su  
adb shell chmod 06755 /system  
adb shell chmod 06755 /system/xbin/su

su 바이너리는 작업 디렉토리에 있다고 가정합니다. http://forum.xda-developers.com/showthread.php?t=682828 에서 su와 수퍼 유저를 찾을 수 있습니다 . 에뮬레이터를 시작할 때마다이 명령을 실행해야합니다. 에뮬레이터를 시작하고 루트로 만드는 스크립트를 작성할 수 있습니다.


15
블로그 게시물의 관련 부분을 여기에 포함하십시오. SO는 링크가 아니라 답변을위한 장소입니다.
cHao

2
그러한 파일이나 디렉토리가 없습니다
Mahendran

4
이것은 에뮬레이터 2.2, 2.3 또는 2.3.3에서 작동하지 않습니다. adb 푸시에 대한 오류 만 발생합니다. 메모리 부족, dir이 비어 있지 않습니다.
Pointer Null

2
@ mice : 오류에 따르면 가상 장치에 충분한 공간이 없기 때문에 바이너리를 푸시 할 수 없습니다. 에뮬레이터를 시작할 때 -partition-size파티션 크기를 지정하는 옵션을 추가 할 수 있습니다 . 당신의 에뮬레이터를 실행하십시오tools/emulator -avd MyAndroidVirtualDeviceName -partition-size 256
ABD

2
최신 에뮬레이터에서 remount 명령이 작동하지 않을 수 있습니다. 다음 adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system 과 같이 바꿀 수 있습니다 . adb root adb remount
Kamran Ahmed

20

5.1.1 및 6.0이 포함 된 AVD의 경우 Windows에서 다음 스크립트를 사용했습니다.

set adb=adb -s emulator-5558
set arch=x64
set pie=
adb start-server
%adb% root
%adb% remount
rem %adb% shell mount -o remount,rw /system
%adb% shell setenforce 0
%adb% install common/Superuser.apk
%adb% push %arch%/su%pie% /system/bin/su
%adb% shell chmod 0755 /system/bin/su
%adb% push %arch%/su%pie% /system/xbin/su
%adb% shell chmod 0755 /system/xbin/su
%adb% shell su --install
%adb% shell "su --daemon&"
rem %adb% shell mount -o remount,ro /system

exit /b

SuperSU의 UPDATE.zip이 필요합니다. 아무 폴더 에나 풀었습니다. 위의 내용으로 박쥐 파일을 만듭니다. 필요한 아키텍처 및 장치를 지정하는 것을 잊지 마십시오 : set adb=adb -s emulator-5558set arch=x64. 5.0 이상에서 Android를 실행하는 경우로 변경 set pie=하십시오 set pie=.pie. 그것을 실행하십시오. 현재 실행에 대한 임시 루트를 얻습니다.

시스템 파티션을 다시 마운트 할 때 오류가 발생하면 명령 행에서 AVD를 시작해야합니다. Android 7의 첫 번째 단계는 아래를 참조하십시오.

영구적으로 유지하려면 SuperSU에서 바이너리를 업데이트하고 기본 system.img의 대체로 temp 폴더에서 system.img를 저장하십시오.

영구적으로 결과 임시 루트를 변환하는 방법

먼저 SuperSu로갑니다. 이진 업그레이드를 제공합니다. 정상적인 방법으로 업데이트하십시오. 재부팅 거부.

둘째-에뮬레이터에만 해당됩니다. 동일한 AVD. 결론은 시스템 이미지의 변경 사항이 저장되지 않는다는 것입니다. 스스로 보관해야합니다.

에뮬레이터마다 명령이 다릅니다.

AVD의 경우 임시 파일 system.img를 찾아 어딘가에 저장하고 에뮬레이터를 시작할 때 사용할 수 있습니다.

Windows에서는에 위치하고 있으며 %LOCALAPPDATA%\Temp\AndroidEmulator이름은 다음과 같습니다 TMP4980.tmp.

폴더 avd 장치 ( %HOMEPATH%\.android\avd\%AVD_NAME%.avd\)에 복사 하고 이름을으로 변경했습니다 system.img.

이제 평소 대신 처음에 사용됩니다. SDK의 이미지가 업데이트되면 이전 이미지를 갖습니다.

이 경우이를 제거 system.img하고 생성 작업을 반복해야합니다.

러시아어로 된 자세한 매뉴얼 : http://4pda.ru/forum/index.php?showtopic=318487&view=findpost&p=45421931


안드로이드 7의 경우 추가 단계를 실행해야합니다. 1. 수동으로 에뮬레이터를 실행해야합니다. SDK 폴더로 이동하십시오 sdk\tools\lib64\qt\lib. 다음과 같은 옵션으로이 폴더 에뮬레이터에서 실행하십시오 -writable-system -selinux disabled .

F:\android\sdk\tools\lib64\qt\lib>F:\android\sdk\tools\emulator.exe -avd 7.0_x86 -verbose -writable-system -selinux disabled
  1. adbd루트에서 다시 시작해야 합니다.

    adb -s 에뮬레이터 -5554 루트

그리고 시스템을 다시 마운트하십시오 :

adb -s emulator-5554 remount

실행 에뮬레이터 당 한 번만 기부 할 수 있습니다. 그리고 다시 마운트하면 쓰기 모드가 중단 될 수 있습니다. 이 때문에 remount와 같은 다른 명령을 실행할 필요가 없습니다 mount -o remount,rw /system.

다른 단계는 동일하게 유지됩니다-바이너리 업로드, 바이너리를 데몬으로 실행 등.

루트가있는 AVD Android 7 x86의 그림 : 루트가있는 AVD Android 7 x86


su바이너리 를 실행할 때 PIE에 대한 오류가 표시되면 잘못된 바이너리를 에뮬레이터에 업로드합니다. su.piearchive 내부에 이름이 지정된 바이너리를 업로드해야 하지만 에뮬레이터에서는 이름이 su아닌 로 이름이 지정되어야합니다 su.pie.


루트를 지속시키는 단계를 알려주시겠습니까?
Satya

update binary in SuperSU and store system.img from temp folder as replace of default system.img.
Enyby

이 단계를 사용하여 temp.1에서 system.img를 가져 왔습니다. 1) cp / tmp / android / emulator-X8F7Hr ~ / Desktop / system.img 2) Android SDK의 시스템 이미지에서 temp 에서이 system.img를 복사했습니다. 에뮬레이터를 다시 시작하면 에뮬레이터가 루팅 된 상태가 아닙니다 ... 정확한 경로를 알려주십시오
Satya

avd 디렉토리에 더 나은 사본. 그러나 먼저 정상 모드에서 SuperSu의 바이너리를 업데이트해야합니다.
Enyby

일반 모드에서 바이너리를 업데이트하고 AVD 디렉토리에 복사 한 다음 루트도 지속되지 않습니다
Satya

13

내가 가장 쉬운 방법은 명령에 대한 별칭을 만드는 것입니다 믿고 sh, 예 :

adb shell
mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
cd /system/bin
cat sh > su && chmod 4775 su

Android Emulator 3.0 이상에서 테스트되었습니다.


이것은 xbin_64 android 5.02 에뮬레이터에서 나에게도 효과가 있었지만 xbin에 설치하는 위의 제안은 그렇지 않았습니다.
Yannick

7
내가 가지고mount: '/system' not in /proc/mounts
케니 와이 랜드에게

Duna

3

여기 당신이 필요로하는 내 팩. 또는이 스크립트를 사용할 수 있습니다 :

echo on
set device=emulator-5554
set avd_name=
set adb=d:\Poprygun\DevTools\Android\Android-sdk\platform-tools\adb -s %device%
set emulator=d:\Poprygun\DevTools\Android\Android-sdk\emulator\emulator
set arch=x86
set pie=

echo Close all ANDROID emulators and press any key
pause
start %emulator% -avd Nexus_One_API_25 -verbose -writable-system
echo Wait until ANDROID emulator loading and press any key
pause

%adb% start-server
%adb% root
%adb% remount
%adb% shell setenforce 0
%adb% install D:\SuperSU\SuperSU.apk
%adb% push D:\SuperSU\su\%arch%\su.pie /system/bin/su
%adb% shell chmod 0755 /system/bin/su
%adb% push D:\SuperSU\su\%arch%\su.pie /system/xbin/su
%adb% shell chmod 0755 /system/xbin/su
%adb% shell su --install
%adb% shell "su --daemon&"
pause
exit /b

2

~에 대한 속성을 대체하고 ~ / Android / Sdk / system-images / android-22 / google_apis / x86 / system.img에 속성을 할당했으며 이제 Android 5에서는 새로운 시스템에도 항상 루트가 있습니다 .SuperSu를 설치하기에 충분합니다. APK

Android 6 is necessary only
adb root
adb shell
>/system/xbin/su --daemon &
>setenfoce 0

그 후 SuperSu.apk는 루트를 봅니다. 하지만 바이너리 파일을 업데이트하지 않습니다


1

위의 솔루션에서 방법의 일부를 사용했습니다. 그러나 그들은 완전히 작동하지 않았습니다. 최신 버전의 Andy에서 이것은 나를 위해 일했습니다.

Andy (루트 쉘)에서 [GetyAndy 아이콘을 마우스 오른쪽 단추로 클릭하고 Term Shell을 선택하십시오.]

쉘 내부에서 다음 명령을 실행하십시오.

mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
cd /system/bin
cat sh > su && chmod 4775 su

그런 다음 SuperSU를 설치하고 SU 바이너리를 설치하십시오. 이것은 방금 생성 한 SU 바이너리를 대체 할 것입니다. (선택 사항) SuperSU를 제거하고 CWM으로 Superuser를 설치하십시오. su 바이너리를 다시 설치하십시오. 이제 루트가 작동합니다!


1

SuperSU를 포함하여 위의 제안을 많이 시도했지만 아무런 효과가 없었지만 내 목적에 맞는 훨씬 간단한 것을 발견했습니다. 필자의 경우 명령 프롬프트에서만 sqlite를 실행할 수 있기를 원했습니다. 이전 버전의 Android (Lollipop)로 에뮬레이터를 돌리고 즉시 루트 액세스 권한을 얻었습니다.


-1

기본 API 23 x86_64 에뮬레이터가 기본적으로 루트라는 것을 알았습니다.


내가 아는 바로는 "adb root"를 입력 할 때 #이 있다고해서 앱이 루트 권한을 이용할 수 있다는 것을 의미하지는 않습니다. / system의 어느 곳에서나 쓰려고 시도하면 RO 오류가 발생하여 RW로 다시 마운트하려고 시도했습니다.
Fusseldieb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.