Gradleを使用してプロジェクトを構築するときにパスワードを入力する

Android用のプロジェクトを構築する場合、Gradleでは、Google Playでダウンロードする準備ができているパッケージをアセンブルおよび署名できるパラメーターを指定できます。 ただし、プライベートキーのパスワードなどの一部のデータをパブリックリポジトリにダウンロードする価値はほとんどありません。 以下の翻訳の記事では、著者はプロジェクトの組み立て中にパスワードなどの個人情報を入力する方法について説明しています。



Gradleでは、System.console()メソッドを使用してコンソールにアクセスできます。 コンソールはパスワードを読み取るための方法を提供するため、次を使用できます。

def password = System.console().readPassword("\nPlease enter key passphrase: ")
      
      





これで、ビルドスクリプトの任意の場所でパスワードを使用できるようになりました。これで完了です。





問題番号1-常に私を悩ませる必要はありません。



build.gradleにこの行を追加すると、何かを収集するたびに実行されることがわかります。 このアセンブリで何かに署名する必要があるかどうかは関係ありませんが、とにかくパスワードが要求されます。



この問題を解決するには、 TaskGraphを使用して、このキーを必要とするタスクが実行されているかどうかを確認します。 taskGraphはビルドプロセスの開始時に入力されるので、入力されるまで待つ必要があります。

 gradle.taskGraph.whenReady { taskGraph -> // ,  TaskGraph . }
      
      





ビルドスクリプトにこのコードを配置するだけで、グラフの準備ができたらコードが実行されます。



次に、パスワードが必要なタスクを実行していることを確認する必要があります。 TaskGraphには、特定のタスクがビルド時に確実に実行されるように設計されたhasTask()メソッドがあります。 タスク名をパラメーターとして指定する必要があります。 また、ルートディレクトリの名前の前にコロンを指定する必要があります。 タスクがいくつかのサブモジュールで定義されている場合(通常、Androidプロジェクトの場合)、このモジュールの名前も指定する必要があります。 プロジェクトにアプリモジュールがあり、assembleReleaseを実行するときにキーパスワードが必要になります。 したがって、必要なチェックを行うことができます。

 gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { //  ,      def pass = System.console().readPassword("\nPlease enter key passphrase: ") // readPassword  char[],       String pass = new String(pass) //      pass } }
      
      





今度は、パスワードが必要になるまでgradleは気にしません。



問題番号2-コンソールがありません。



IDE(Android Studioなど)またはgradle.daemonを使用して上記のコードを実行しようとすると、コンソールにアクセスできず(System.console()はnullを返します)、例外によりアセンブリが壊れます。 しかし、panicてないでください、この問題は解決されます。 コンソールにアクセスできない場合でも、UIがあります。 GroovyのSwngBuilderを使用して、簡単なパスワードダイアログを表示できます。



まず、インポートする必要があるので、build.gradleの先頭に次の行を配置します。

 import groovy.swing.SwingBuilder
      
      





これで、SwingBuilderを使用して簡単な入力ダイアログを表示できます。

 def pass = '' new SwingBuilder().edt { dialog(modal: true, //    ,    . title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, //     . pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password; dispose(); }) } } }
      
      





パスワードを要求する必要がある場所にこのコードを追加すると、ユーザーがpass変数に入力したパスワードを受け取ります。



すべてをまとめる。



すべてまとめましょう。 UIは良い(わかりました、以前使用したものはあまり良くありませんが、自由に変更することができます: SwingBuilder docs )、しかし、場合によってはコンソールのみでグラフィカルインターフェイス(ビルドサーバーなど)がないシステムでビルドする必要がありますそして時々あなたのIDEから。 ユーザーがパスワードを入力していない場合、アセンブリをキャンセルすることもできます。 ビルドスクリプトは次のようになります。

 gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { def pass = '' if(System.console() == null) { new SwingBuilder().edt { dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password dispose(); }) } } } } else { pass = System.console().readPassword("\nPlease enter key passphrase: ") pass = new String(pass) } if(pass.size() <= 0) { throw new InvalidUserDataException("You must enter a password to proceed.") } // ----- //      pass ,  ! // ----- } }
      
      





groovyのドキュメントに自由に飛び込み、このUIを改善する方法をご覧ください。



All Articles