2016-08-31 6 views
1

私はGradleスクリプトを通していくつかのAndroid SDKツールをインストールするプロセスを自動化しようとしています。多数のandroid-sdkツールをインストールして自動的にライセンスを受け入れるにはどうすればよいですか?

考え方は、メインビルド自体を発行する前に環境を準備するDockerマシン内でこのbuild.gradleスクリプトを実行することです。

問題は、私がインストールしている関連パッケージのライセンスを自動的に受け入れることです。

this SO question後、私はこの方法を使用しようとしている:

echo "y" | android update sdk -u -a -t 2,4,56,57,58 

私はターミナルでそれを実行した場合、それは一つのコマンドで最大6つのパッケージが、私はそれより多くのパッケージをインストールしたい場合は動作しますが、例えば:

echo "y" | android update sdk -u -a -t 2,6,7,4,30,153,160,161,167,54,53,63,56,57,58,59 

は次にコマンドは失敗します。

Do you accept the license 'intel-android-extra-license-3626590a' [y/n]: 
Unknown response ''. 
Do you accept the license 'intel-android-extra-license-3626590a' [y/n]: 
Unknown response ''. 
Max number of retries exceeded. Rejecting 'intel-android-extra-license-3626590a' 
Package Android TV Intel x86 Atom System Image, Android API 24, revision 6 not installed due to rejected license 'android-sdk-preview-license-d099d938'. 
Package Android Wear ARM EABI v7a System Image, Android API 24, revision 1 not installed due to rejected license 'android-sdk-preview-license-d099d938'. 
Package ARM 64 v8a System Image, Android API 24, revision 6 not installed due to rejected license 'android-sdk-preview-license-d099d938'. 

以上に私のためにGradleを実行する必要があります。そうすると、何らかの理由で最初のエコー(エコー "y")の出力がパイプにリダイレクトされないようです。私は、関連するGradleのタスクを実行したときに

だから:

12:46:01.178 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTING 
12:46:01.179 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Waiting until process started: command '/bin/echo'. 
12:46:01.183 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTED 
12:46:01.183 [DEBUG] [org.gradle.process.internal.ExecHandleRunner] waiting until streams are handled... 
12:46:01.183 [INFO] [org.gradle.process.internal.DefaultExecHandle] Successfully started process 'command '/bin/echo'' 
12:46:01.184 [QUIET] [system.out] y | /usr/local/bin/android update sdk -u -a -t 2,6,7,4,30,153,160,161,167,54,53,63,56,57,58,59 
12:46:01.184 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: SUCCEEDED 
12:46:01.185 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'command '/bin/echo'' finished with exit value 0 (state: SUCCEEDED) 
12:46:01.185 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':installSdkBuildTools' 
12:46:01.185 [INFO] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] :installSdkBuildTools (Thread[main,5,main]) completed. Took 0.023 secs. 
12:46:01.185 [DEBUG] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] Task worker [Thread[main,5,main]] finished, busy: 0.023 secs, idle: 0.001 secs 
12:46:01.185 [DEBUG] [org.gradle.execution.taskgraph.DefaultTaskGraphExecuter] Timing: Executing the DAG took 0.044 secs 
12:46:01.185 [LIFECYCLE] [org.gradle.BuildResultLogger] 
12:46:01.186 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD SUCCESSFUL 

echoコマンドは終了ステータス0で正常に終了したが、パッケージはインストールされていません。

3つのミニコマンドにコマンドを分割しようとしましたが、毎回6つのパッケージをインストールしますが、echo "y" | android...コマンドは上記のように正しく解釈されません。

関連Gradleのタスクはそうのようになります。

task installSdkBuildToolsPart2(type: Exec) { 
commandLine '/bin/echo', "y", '|', '/usr/local/bin/android ', 'update ', 'sdk ', '-u -a -t 160,161,167,54,53' 
} 

そして、私もそのようにしようとしたが、無駄に:

task installSdkBuildToolsPart1(type: Exec) { 
    commandLine 'bash', '-c'," '/bin/echo', "y", '|', '/usr/local/bin/android ', 'update ', 'sdk ', '-u -a -t 2,6,7,4,30,153'" 
} 

これはGradleの質問です...どのようにすべきcommandLineディレクティブをbuild.gradleファイルに正しく書き込んで、コマンドが正しく解釈され、パッケージがインストールされ、ライセンスが受け入れられるようにしますか?

誰でもこの問題を解決する方法を知っていますか?事前に

おかげで、

+0

Jake Wharton SDK Managerプラグインをご覧になることができます:https://github.com/JakeWharton/sdk-manager-plugin – Budius

+0

ありがとうございますが、私はむしろ廃止予定のプラグインを使用しません。 –

+0

推奨されていませんが、機能しないというわけではありません。我々は私たちのCIで使用し、それは正常に動作します。 – Budius

答えて

1

あなたの問題は、Gradleの中のexecタスクは、パイプについて知らないということですので、あなたが書かれているものエコーするためにいくつかの文字列を渡すだけです。 "y"、パイプ "|"、アンドロイドパス、更新コマンドなど

これを実行する1つの方法は、パイプや他のシェルリダイレクション文字を含むコマンドをシェルに入れることですスクリプトファイルを開き、Gradleタスクでそのシェルスクリプトをexecします。

+0

良い音、すぐにテストします –

0

私たちは私たちのために完璧に動作し、このコマンドを、持っている:

(sleep 5 && while [ 1 ]; do sleep 1; echo y; done) \ 
| android update sdk --all -u -t 
+0

gradle commandLine形式でどのように書きますか? –

+0

とにかく6つ以上のパッケージでこの方法を試してみましたが、ライセンスを受け入れるのを待っているプロセスを停止します –

関連する問題