Androidエミュレーターでrootアクセスを取得する方法?


146

私はすべてのAndroid SDKバージョン(1.5から2.3.3まで)を持っており、Androidエミュレーターでrootを取得するための多くの方法を試しました。私はAndroidデバイスを使用せず、エミュレータ(AVD)ですべてをテストします。

「iptables」および「busybox」機能を使用するには、Androidエミュレーターのいずれかでrootアクセスを取得する必要があります。また、iptablesを使用するには、rootアクセスが必要です。少なくとも「su」コマンドは、ターミナルエミュレータで実行する必要があります。

z4rootアプリもインストールしましたが、

しかし、それは非常に長い時間がかかり、応援を終えず、行き詰まります。システムをRC30以下にダウングレードすると、ルートアクセスを取得できると言う人もいます。これが本当なら、どうやってこれを行うのですか?LinuxとWindows OSの両方を使用しています。

誰かが私のエミュレータをルート化する方法を教えてください。


再起動するたびにシステムをルート化するため、エミュレータをルート化するためにfilecrop(androidシステムのVISIONary)に格納されている「Root.apk」を使用できると思います。ルートアクセスを機能させるには再起動が必要なため、Z4rootは機能しません。英語がおかしいので、私はフランス語です。
JeremLeOuf 2012年

これはどこで入手できますか?これのマニュアルはありますか?
Android開発者

6
Androidエミュレータはすでに「ルート化」されていることに注意してください。デフォルトではrootとしてすでに実行されているため、root adbシェルを取得するために何もする必要はありません。ここで説明するのは、ハッキングされた「su」または類似のシムをインストールして、アプリケーションコードがrootとして実行されるヘルパープログラムを起動できるようにすることです。
Chris Stratton

2
使用Genymotionはgenymotion.comそれは非常に高速だと、デフォルトではルートを持っています。
klimat 14

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 2017

3
このルートはどのアプリにも使用できません。
Enyby 2017

5
これを新しいGoogle Playシステムイメージで機能させようとしている場合、adbdはramdisk.imgで保護するように設定されています。Google APIのイメージからramdisk.imgを使用することで、これを回避することができました。7.0と8.0の両方のイメージでテストしました。
tstaylor7 2017

46
場合はadb root、エラーを与えadbd cannot run as root in production builds、参照stackoverflow.com/a/45668555/1682419を -あなたは「Google APIのシステムイメージ」を必要とするのではなく、「Googleはシステムイメージの再生」。
Jerry101 2017

10
@JRaymond adb rootと入力しましたが、その後何も出力されませんでした

75

Androidエミュレータのルート方法(Android 7.1.1 / Nougatでテスト済み)

要件

指示

  1. SuperSu.apkをインストールする

    • SuperSuアプリを最初にインストールし、ドラッグアンドドロップするだけです(最新のエミュレーターバージョンを実行している場合、またはadb ieを介してサイドロードする場合adb -e install supersu.apk)。

    • インストール後、実行すると以下のような「SUバイナリがインストールされていません。」という画面が表示されます。このエラーは、デバイスがまだルート化されていないことを確認するだけです。

ここに画像の説明を入力してください


  1. エミュレータのシステムパーティションを書き込み可能にする

    • それが示唆するように、システムファイルを書き込むための権限をエミュレータに与える必要があります。

    • これを行うには、次のコードを入力します。 emulator -avd {emulator_name} -writable-system

AVDが複数ある場合は、次のコマンドを使用してAVDのリストを取得できます。 emulator -list-avds

注:ツールに移動します Android SDKがインストールされフォルダーに移動し、Shiftキーを押しながら右クリックしてコマンドプロンプトを開きます。


  1. システムディレクトリにsuバイナリをプッシュする

    • Recovery flashable.zip(異なるアーキテクチャのsuバイナリを含む)を抽出します

重要!avdアーキテクチャーに一致するsuバイナリー(x86、armなど)のみを使用し、これらのバイナリーを抽出したパスに注意してください。

  • ルートとしてadbを実行していることと、再マウントする必要があることを確認してください。これらのコードを入力してください

adb root

adb remount

今度はsuバイナリをプッシュする時です:

これは私が正常に使用したコードですadb -e push C:\Users\User1\Desktop\rootemu\x86\su.pie /system/bin/su

(suバイナリの私の特定の場所については気にしないでください。空白がない限り、どの場所でも問題ありません)

注:前にコンソールで把握binまたはxbin実行するには:> adb shell、>ls /system/xbin/su

これが失敗した場合は、代わりにこのディレクトリへのプッシュを試してください/system/xbin/su。また、Android 5.1以前を実行しているエミュレータではsusu.pie


  1. suバイナリの権限を変更する

    • 次に、suバイナリのパーミッションを少し変更しましょう。これは、adbを介してエミュレータデバイスで行う必要があります。

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

重要!!suバイナリパスに注意してください(私は/ system / binです)


  1. 設定installのsuバイナリとセットAに関する指令をdaemon

コードを入力してください:

su --install

デーモンの設定:

su --daemon&

重要!!間隔に注意してください


  1. SELinuxをPermissiveに設定する(つまり、SE Linuxをオフにする)

    • 最後に、次のコードでselinuxをオフにします。

setenforce 0


  1. SuperSUアプリを開くと、バイナリの更新を求められる場合があります。通常の方法を使用できます。

注:ブートループが発生している場合は、バイナリを更新せず、そのまま使用してください。


それでおしまい!

SU権限を必要とするアプリケーションを開いて、ダブルチェックを行い、実際にSuperSUにsu権限を付与するかどうかを尋ねます。

ここに画像の説明を入力してください

ルートパーシスタントをバイナリに更新するには(通常の方法を使用)、次に一時ディレクトリからsystem.imgをコピーし(Users\AppData\Local\Temp\Android Emulatorファイルは通常、たとえば1359g.tmp大きなサイズでランダムに名前が付けられます)、defaultを置き換えますsystem.img

更新

私は、WindowsよりもLinuxで一時システムイメージを取得する方が簡単であると述べました。スナップショットイメージを使用してみてください。

2018年8月4日更新

エミュレーターの登場により、27.3.xスナップショット機能を使用してrootを保持することがはるかに簡単になりました(system.imgメソッドの)。

理想的には、configをそのまま使用して仮想デバイスをhibernarigに似ているため、すべてが保持されます。

スナップショット

これで、特定のデバイス構成の複数のAVDスナップショットを保存し、エミュレーターの起動時にロードする保存済みのスナップショットを選択できます。スナップショットをロードして仮想デバイスを起動することは、電源がオフの状態から起動するのではなく、物理をスリープ状態から復帰させることに似ています。

これは、エミュレータを起動するための唯一の要件が、エミュレータを起動する-writable-systemための通常のemulator -avd [avdname]コマンドにパラメータを追加することであることを意味します。(だけでエミュレータを実行しemulator -avd [avdname]ても、ルートバージョン/コピーが起動しないか、エラーが発生する可能性があります

APIレベル22でテスト済み

また、ブートループの問題については、別の投稿を参照してください:Android Emulator:応援後にブートループを回避する方法は?そしてその更新。

備考

参照のほとんどのコンテンツは、古いandroidバージョンに関するものであり、したがって、さまざまなコマンドとパスが変更された理由です。

謝辞;


1
注:前にコンソールでbinまたはxbinを実行するには:> adb shell、> ls / system / xbin / su
djdance

1
@xavier_fakeratはい、バイナリの更新を中止しました。問題は、再起動するたびに、マシンを再マウントsu --install && su --daemon&してエミュレーターで実行し、続いてsetenforce 0rootを取得する必要があることです。再起動時のrootの永続的な修正を知っていますか?
クリスティアンホルドゥヌ2017

1
いいね!この方法は、adbを介してrootにアクセスできる実際のデバイスでも機能します。
Mygod

1
-writable-systemを使用しない場合、Androidエミュレーターがイメージをルート化した後に予期せず閉じる理由について、あなたは私に答えました。それはスナップショットだからです。
Rodrirokr 2018年

1
私は、ピクセル2 XLを使用しています:人々はピクセルXLと同じ問題を抱えているように見える:forum.xda-developers.com/pixel-xl/how-to/...
noraj

33

エミュレーターの実行中に実行する必要のあるコマンドのリストを以下に示します。Android2.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バイナリが作業ディレクトリにあると想定しています。ここでsuとスーパーユーザーを見つけることができます:http : //forum.xda-developers.com/showthread.php?t=682828。エミュレータを起動するたびに、これらのコマンドを実行する必要があります。エミュレータを起動してルートするスクリプトを記述できます。


15
ブログ投稿の関連部分をここに含めてください。SOはリンクではなく回答の場所です。
cHao

2
そのようなファイルやディレクトリ「SU」はありません
Mahendran

4
このエミュレータ2.2での作業、2.3または2.3.3は、私はadbのプッシュのための唯一のエラーを取得できません:メモリ不足、dirが空にされていない、など
ポインタヌル

2
@マウス:エラーが示すように、仮想デバイスに十分なスペースがないため、バイナリをプッシュできません。エミュレータを起動するときに-partition-size、パーティションサイズを指定するオプションを追加できます。でエミュレータを起動してみてくださいtools/emulator -avd MyAndroidVirtualDeviceName -partition-size 256
abd

2
新しいエミュレータ上で再マウントコマンドは、動作しない場合がありますが交換することができる: adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system と: adb root adb remount
カムランアーメドを

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が必要です。それらを任意のフォルダに解凍します。上記の内容でbatファイルを作成します。必要なアーキテクチャおよびデバイスを指定し忘れないでください:set adb=adb -s emulator-5558set arch=x64。Androidを5.0以上で実行している場合は、に変更set pie=set pie=.pieます。それを実行します。現在の実行の一時的なルートを取得します。

システムパーティションの再マウントでエラーが発生した場合は、コマンドラインからAVDを起動する必要があります。以下のAndroid 7の最初のステップを参照してください。

永続化する場合は、SuperSUのバイナリを更新し、デフォルトのsystem.imgの代わりに一時フォルダからsystem.imgを保存します。

結果の一時ルートをパーマネントに変換する方法

最初に-それはSuperSuに行きます。バイナリアップグレードを提供します。通常の方法で更新します。リブートを拒否します。

2番目-エミュレータにのみ関連します。同じAVD。つまり、システムイメージの変更は保存されません。自分で保管する必要があります。

すでにエミュレータごとに異なる手順があります。

AVDの場合、一時ファイルsystem.imgを見つけてどこかに保存し、エミュレータを起動するときに使用できます。

Windowsでは、%LOCALAPPDATA%\Temp\AndroidEmulatorにあり、次のような名前が付いています。TMP4980.tmpます。

それをavdデバイス(%HOMEPATH%\.android\avd\%AVD_NAME%.avd\)のフォルダーにコピーし、名前をsystem.img

これで、通常ではなく、最初に使用されます。SDKのイメージが更新された場合、Trueになり、古いイメージになります。

この場合、これを削除する必要があります system.imgし、作成時に操作を繰り返す。

ロシア語のより詳細なマニュアル:http : //4pda.ru/forum/index.php?showtopic=318487&view=findpost&p=45421931


Android 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 emulator-5554 root

そしてシステムを再マウントします:

adb -s emulator-5554 remount

実行エミュレータごとに1回だけ寄付できます。そして、別の再マウントは書き込みモードを壊す可能性があります。このため、次のようなremountで他のコマンドを実行する必要はありません。mount -o remount,rw /system

別のステップは同じままです-バイナリをアップロードし、デーモンとしてバイナリを実行するなど。

ルートを持つAVD Android 7 x86の画像: ルートを持つAVD Android 7 x86


suバイナリの実行時にPIEに関するエラーが表示される場合は、エミュレータに間違ったバイナリをアップロードします。su.pieアーカイブ内で名前が付けられたバイナリをアップロードする必要がありますが、エミュレータではsu、ではなくと名前を付ける必要がありますsu.pie


ルートを永続化する手順を教えてください。
サティア

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

これらの手順を使用して、tempからsystem.imgを取得しました1)cp / tmp / android / emulator-X8F7Hr〜/ Desktop / system.img 2)このsystem.imgをtempからAndroid SDKのsystem-imagesにコピーしましたが、エミュレータを再起動すると、エミュレータはルート化された状態になりません...正しいパスを案内してください
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以降でテスト済み。


これは(x86_64 android 5.02エミュレーターで)私にも機能しましたが、xbinにインストールするという上記の提案は機能しませんでした。
Yannick、

7
私が得たmount: '/system' not in /proc/mounts
ケニーワイランド

システムは72で失敗しました
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

suの属性を〜/ Android / Sdk / system-images / android-22 / google_apis / x86 / system.imgに置き換えて割り当てたところ、Android 5では、新しいシステムでも常にrootになり、SuperSuをインストールするだけで十分です。 apk

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

その後、SuperSu.apkはルートを参照します。しかし、私はバイナリファイルを更新しません


1

上記の解決策のメソッドの一部を使用しました。ただし、それらは完全には機能しませんでした。アンディの最新バージョンでは、これは私にとってはうまくいきました:

Andy(ルートシェル)で[取得するには、HandyAndyアイコンを右クリックし、[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でスーパーユーザをインストールします。suバイナリを再度インストールします。これでrootが機能します!


1

SuperSUを含む上記の提案の多くを試してみましたが、どれも動作しませんでしたが、私の目的にはうまくいく、もっと単純なものが見つかりました。私の場合、コマンドプロンプトでのみsqliteを実行できるようにしたいと思っていました。古いバージョンのAndroid(Lollipop)を使用してエミュレーターを起動し、すぐにrootアクセスを取得しました。


-1

デフォルトのAPI 23 x86_64エミュレーターがデフォルトでルート化されていることがわかりました。


私が知っていることから、「adb root」と入力したときに#があるからといって、アプリがroot権限を利用できるわけではありません。/ systemのどこかに書き込みを試行すると、RWとして再マウントしようとしても、ROエラーが発生しました。
フッセルディエブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.