}また、今回のようにGradleプラグインを作成する場合、resources/META-INF/gradle-plugins/にpropertiesファイルを置くことを忘れないようにしましょう。それでけっこうはまっていました。サンプル2サーバからパッチをダウンロードしてきて、それによって任意のメソッドの内容を置き換える、というライブラリです。実用化可能なレベルのものができたら、不具合が見つかった場合や、A/Bテストなどに利用できそうです。スクリプトのダウンロードや実行は、SampleApp2のAndroidライブラリモジュール内に含まれています。・・・31のScriptDownloaderで、PCのlocalhost上に立てたファイルサーバから、スクリプトファイルをダウンロードします。PCのlocalhostは、AndroidエミュレータからはIPアドレス”10.0.2.2”でアクセスできます。Androidアプリでlocalhostを指定すると、それはアプリが動作しているAndroidシステム自体のことをさすため、注意して下さい。2はダウンロードしてきたスクリプトファイルを読み込んで、メモリ上に保持します。3が実際にスクリプトを実行するクラスです。JavaScriptを実行するために、Rhinoを使用しています。privateフィールドやメソッドにもアクセスできるように設定しており、さらにAndroidのContextも渡しているため、組み込んだアプリができることであれば、なんでもできてしまいます。そのような状態で、スクリプトファイルをhttpでやりとりしているため、このライブラリをこのまま使うのは危険です。サンプルとして、試してみるくらいにしておいて下さい。Transformを行っているのは、patcher/PatcherTransformer.groovyです。class以外のクラスの各メソッドに対して、次のようなロジックを冒頭に挿入しています。(メソッドの戻り値の型)スクリプト実行;}つまり、呼び出されるメソッドに対応するスクリプトが存在する場合、それを実行し、その戻り値をキャストして返しています。メソッドの戻り値がvoidの場合は、キャストせず、単にスクリプトを実行して、”return;”としています。リンクスクリプトファイルは、PatchServer/patches内に配置することで、パッチサーバからアクセス可能になります。サンプル用に2つ作って置いてあります。ファイル名は、jp.co.yahoo.android.sampleapp2.MainActivity.increment().patchのように、”パッケージ、クラス、メソッド名.patch”として下さい。引数の型を含めていないので、メソッドのオーバーロードを行っていると、全てに適用されてしまいますね。-1;}のように、apply()という名前の関数を定義し、戻り値を元のメソッドの戻り値と型を合わせて下さい。そのメソッドが現在実行されているインスタンスが、”instance”という変数名で参照可能です。この場合、instanceの型は”MainActivity”です。その他に、メソッドの引数がarg0、arg1、arg2...のかたちで参照可能となります。実際に実行してみてください。スクリプトを書き換えて再ダウンロードすると、動作に反映されているのがわかります。Fixは不具合の修正に限らず、多くの用途に応用可能です。A/Bテストについて考えてみると、これまでの方法は、ユーザーにバケットを割り当て、アプリに各テストパターンに応じたの実装を行った上でリリースし、ある程度行き渡るのを待ちながら数値を確認する方法が主流でした。テストの結果を踏まえて、さらにテストを繰り返すためには、また修正を行ったバージョンをリリースし、ユーザーが更新してくれるのを待つ必要があります。Messaging)のペイロードにスクリプトファイルへのURLを載せて送信し、即座に挙動を変えることも可能になります。json2viewのようなOSSと併用すれば、レイアウトさえ自由に変更できます。一方で、スクリプトに従ってネイティブオブジェクトを自由に操作できるということは、それ自体が脆弱性の原因ともなりかねません。実際に使用するのであれば、今回のサンプルのようなものではなく、よりセキュアな方法に設計し直す必要があるでしょう。自由に変更ができると言っても、あまりに一方的でユーザーに同意のない変更を繰り返していると、ユーザーから不信感を持たれかねません。不具合の修正ではなく、グロースの目的で利用するのであれば、ユーザーを困惑させないよう、適用する範囲と頻度を検討するべきです。APIを使用したライブラリのテンプレートとしては、サンプル1のほうが使いやすいものとなっています。LoggerTransformer#modify()に手を加えるだけで、いろいろな動作を試すことができます。VERBOSEに出力しているログを、DEBUGに変えてみてはいかがでしょうか。uploadArchivesとしてローカルリポジトリにアップロードし、サンプルをリビルドすると、反映されます。年末年始の連休中に、いろいろつついて、遊んでみていただければ幸いです。Rollout.ioは現在、Android版を開発中です。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。