Kotlinで作る自由でラクなMOVERIO BT-200開発環境 2ヶ月目

2015年4月30日木曜日

Engadget・エプソン主催のMOVERIO体験会へ参加し、MOVERIO(BT-200AV)を6ヶ月間の無料モニターとして借り受けました。
本記事は、無料モニター2ヶ月目の記事です。
前回: 新MOVERIOは実用端末たりうるか。BT-200AVを借りて試した話
先月は、基本的に一般利用の視点でみていきました。ハードウェアとソフトウェア両面について雑多なメモを書き、特にAmazonのアプリストアを突っ込めば結構多くのシーンでアプリ不足はカバーできるのでまあそれはそれで、という話を書きました。
概況を把握したところで、今月はアプリ開発のための下準備をしました。

ドキュメントを読みました

普段あまりドキュメントを読まずにほいっと開発モードへ入れていじっていくことが多いのですが、BT-200については少々慎重になる理由があります。
3月の下旬に


というツイートを見かけて、「おっ、これはちゃんと開発者用サイトのドキュメントを丁寧に読んだほうがよさそうだ」と感じました。
まずは4月の初旬に開発者登録をおこない、https://tech.moverio.epson.biz/ja/index.htmlから辿れるPDF類をひと通り読みました。
くだんの制限に関しては、他社の端末でもbootloaderのアンロックと同時にDRM用のキーを吹っ飛ばすような仕様はそれなりに見かけるので、まあDRMのかかったコンテンツをそれなりに重視するプラットフォーム(にしたいのだと思う)においては仕方ないかな、という感じでした。
この旨の警告はしっかりと書いてあるし。

当初の開発目標が決まった

開発者用のシステムアップデートを当てることなく、楽に開発できる環境を整えることです。
開発者用のアプデをあてないとADB接続ができないところが当然ネックになります。
ADB接続ができなくて不便なのはこのあたりです。
  • USB経由のアプリインストール
  • USB経由の通信リダイレクト
  • シェル(ターミナル)アクセス
  • logcat(端末ログ取得)
  • スクリーンショット撮影
順に、どう手当をするか考えてみます。

USB経由のアプリインストール

発行元の不明なアプリのインストールが許可されている以上、これはbootstrapにあたるアプリさえ投入しておけば追加のアプリインストールは楽におこなえます。
特にAndroid Studioなどから連携した状態のadb installコマンド並の利便性を実現するのは少々厄介そうですが、特にフル機能が必要なわけでもないように思います。

USB経由の通信リダイレクト

まあいらないでしょう。
技適通っている強みでもあります。

シェル(ターミナル)アクセス

run-as相当の処理は一定できたほうが嬉しそうな気がします。
アプリ内に組み込んでリモートから接続できるエージェントを何かしらの形で用意するなどすると良い感じでしょうか。
開発中のアプリ内のデータを編集する分には、microSDへとデータを書き出しておいて適当に外部で読み出すという手が使えそうです。使えそうですが、そもそもUSB接続でメディアモード接続されるのかを確認していないので定かではありません。
アプリデータの書き込みをおこなった都度毎回抜き差しが必要だったら結構面倒そうです。FlashAirのmicroSD版などがあれば夢が広がる気がしますが、まあさすがにありませんしね。
SD領域に関しては、たとえば60秒ごとにBT-200→開発用のマシンへとrsyncで投げるような策もアリなので、あまり深く考えなくてよさそうです。

logcat(端末ログ取得)

BT-200に搭載されているAndroid OSのバージョンは4.0.4なので、READ_LOGSパーミッションの穴が塞がれる前のものです。
開発用のブリッジアプリを作ったら、そこでシステム全体のログを受けてネットワーク越しに流すようにすれば実用上の問題はなさそうです。
面倒ならブリッジアプリ側は適当なポートで待ち受けておいて、開発マシン側から雑にncで読み出すとかでも良い気がします。

スクリーンショット撮影

前回(3月)のblog記事で書いたように、MicrosoftのOne Driveアプリがなかなか優秀です。スクリーンショット撮影の十秒程度後にはOne Driveへと同期してくれます(Dropboxを使っていない理由も前回の記事参照)。
BT-200に搭載されているのがAndroid端末単体でのスクリーンショット撮影機能が整備された後のバージョンで本当によかった、という感じです。
というわけで、ADB接続がなくてもなんとかなるものが結構多いことが分かりました。
差し当たり必要なものを抽出してみるとこんな感じでしょうか。

BT-200へ開発者用のシステムアップデートをあてずにアプリ開発をするために必要なブリッジ

  • Wi-Fi上の適当な場所からAPKファイルを拾ってきてインストールする機能を持つ
  • 端末上のログを適当に開発マシンへと横流しする機能を持つ
意外とシンプルなもので済みそうです。以降これを適当にブリッジアプリと呼ぶことにします。
まあ、あまり工夫せずに作ると今ひとつ使いやすさの欠けたものができそうではありますが。

BT-200用ブリッジアプリを試作してみる

今回はKotlinで書きました。
といっても美しいKotlinではなく、「セミコロンがなくてvar使えて型が後置のJava」ぐらいのノリで使っています。
APKはそこそこ巨大である場合もあろうというのと、細かな制御をするのが面倒だったのでDownloadManagerを使いました。
概ね定型パターン(リスト1)ですが、Kotlinで書かれているだけでなんとなく新鮮さを感じますね。
リスト1 DownloadManagerでAPKを拾ってくるだけ
public class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      var btn = findViewById(R.id.btn_fetch) as Button
      btn.setOnClickListener {
        var downloadManager =
          getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
        var builder = Uri.Builder()
        builder.scheme("http")
        builder.authority("10.0.1.2")
        builder.path("/test.apk")
        var request = DownloadManager.Request(builder.build())
        var ufile = File(
          getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "test.apk")
        request.setDestinationUri(Uri.fromFile(ufile))
        request.setTitle("fetch APK")
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI)
        request.setMimeType("application/zip")
        downloadManager.enqueue(request)
      }
    }
    ...
}
まあ平和に動きました。
ダウンロード結果は普通にBroadcastReceiverを組んで登録しておきました。

BT-200用ブリッジアプリを試してみる

組んだので実際に使ってみました。
この仕組みだと見ての通り80番ポートで待ち受けるサーバが必要なのですが、面倒だったのでnpm install -g http-serverとして適当な場所をベースディレクトリとしてHTTPサーバを走らせることにしました。
ブリッジアプリをtest.apkとして保存してhttp-serverを開始したら、まずBT-200側のWebブラウザからブリッジアプリの場所を指定します(図1)。


図1 ブリッジアプリをWebブラウザからダウンロード 

適当にダウンロードされたものを開くと、インストールの確認ダイアログが表示されます(図2)。


図2 ブリッジアプリをインストール

ブリッジアプリをインストールし、開いて画面上部のボタン(半透明で隠れてしまった状態のスクリーンショットしかないのでわかりづらいですが)を押すと、同じ場所(http://10.0.1.2/test.apk)にあるAPKファイルを再度取得して自動的にインストール確認ダイアログを表示します(図3)


図3 ブリッジアプリの更新確認

ここでOKを選択すると、ブリッジアプリが更新されます。
今回は、最初にtest.apkを配置した後でボタンの縦幅をBT-200側で押しやすいように大きくする変更を加えたものを上書きインストールしてみました(図4)。
図4 ブリッジアプリの更新結果 

ちなみに、ターミナルで待ち受けているhttp-serverはこんな感じです(図5)。
図5 ターミナルの状態 

この状態で、開発マシン側のtest.apkを他のファイル(例えば、開発途中のAPK)に差し替えてブリッジアプリ側のインストールボタンを叩くと、当然そのアプリをインストールできます。
結局シンプルなことしかしていないのですが、「開発者用のシステムアップデートをあててDRM系を捨てることなくアプリ開発をおこなう」という目的の多くは達せられそうです。

将来

あまりこればかりやっているわけにもいかないのですが、現状の作りだと不親切すぎるので、せめて人へ配布できる程度までは仕上げようと考えています。

1 件のコメント:

  1. Thanks for sharing, nice post!

    Chia sẻ các mẹ trẻ sơ sinh ngủ ít có sao không hay trẻ thức đêm với trẻ sơ sinh ngủ ngày thức đêm hay vacxin tiêm phòng cho trẻ với vacxin 6 trong 1 gồm những bệnh gì hay nấu cháo cho bé ăn dặm với cách nấu cháo cho bé hay nguyên nhân trẻ đái dầm ban đêm cũng như cách trị đái dầm ở trẻ em hiệu quả hay uống nước đúng cách với có nên cho trẻ sơ sinh uống nước hay sự phát triển của trẻ bé 14 tháng biết làm gì hay khi trẻ bị bỏng thì phải làm sao với cách chữa bỏng nước sôi hay bị bỏng trẻ nên ăn và kiêng gì với bị bỏng kiêng ăn gì hay trẻ mẩn đỏ ngứa thì sao với trẻ bị mẩn ngứa tắm lá gì hay sự phát triển của trẻ giai đoạn trẻ 10 tháng tuổi biết làm gì hay cách xử lý trẻ bị tiêu chảy với bài trẻ sơ sinh bị tiêu chảy phải làm sao xử lý như thế nào.

    返信削除