Hatena::ブログ(Diary)

Hacking My Way 〜 itogのhack日記 RSSフィード

2017-04-14

Android SDK auto-downloadをCircleCIで有効にする

SDKのauto-download

AndroidのGradle Pluginでは2.2.0-alpha4 (2016/6/23)からSDKのauto-downloadをサポートしている。

ローカル環境で実行する場合、特に意図することなく自動でDLされるが、CI環境でそれを期待して実行するとエラーになる。

* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
  [Android SDK Build-Tools 25.0.2, Android SDK Platform 25].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html

原因はメッセージにあるようにlicense agreementsをacceptしてないから。

リモート環境の場合は、lisenceファイルをコピーすればいいとリンク先に書いてある。(上記リンクは古く、以下にリダイレクトされる)

https://developer.android.com/studio/intro/update.html#download-with-gradle


CircleCIでlicense agreementを有効にする

さて、上記のとおりにlicenseファイルをCircleCI上に置ければいいのだが、CircleCIにはビルド時に参照出来るようなファイルを単純に置くことは出来ない。解決策としては、ぱっと思いつくので以下3通りのやり方がある。

1. ファイルをリポジトリに置く

一番簡単な方法だが、licenseファイルを公開するのはよろしくない。Privateリポジトリならいいかも

2. licenseファイルをCIサーバから参照できる場所に置いといてダウンロードする

これが一番応用が効くので良いが、今回はお手軽な方法として、次の方法を使う。

3. 環境変数を使う

licenseに同意した時に作られるファイルandroid-sdk-licenseの中身は以下のように文字列のみ

$cat android-sdk-license
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9c55

この値をコピーして、CircleCIの環境変数に設定する。ここではANDROID_SDK_LICENSE_VALUEとした。


circle.ymlのpreセクションでandroid-sdk-licenseファイルを所定の場所に作成する

pre:
    - mkdir $ANDROID_HOME/licenses
    - echo $ANDROID_SDK_LICENSE_VALUE > $ANDROID_HOME/licenses/android-sdk-license

ちなみに、これで足りないSDKおよびBuild ToolsのDownloadは出来るようになったが、ライブラリ等のアップデートは以前と変わりなく必要になるので、全体としては以下のようになる。

  pre:
    - echo y | android update sdk --no-ui --all --filter tool,extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository
    - mkdir $ANDROID_HOME/licenses
    - wget $ANDROID_SDK_LICENSE_URL
    - mv android-sdk-license\?dl\=0 $ANDROID_HOME/licenses/android-sdk-license

2016-12-14

Android Things ことはじめ

f:id:itog:20161214195245j:image

GoogleのIoT platformとしてAndroid ThingsおよびWeaveが発表されたのでさっそく触ってみたよ。

https://android-developers.googleblog.com/2016/12/announcing-googles-new-internet-of-things-platform-with-weave-and-android-things.html

Android Things https://developer.android.com/things/index.html

サポートプラットフォーム

Android Thingsは現時点で以下のハードウェアプラットフォームをサポートしています。

  • Intel® Edison
  • NXP Pico i.MX6UL
  • Raspberry Pi 3

あとIntel® Joule™ 570xとNXP Argon i.MX6ULがcomming soonとのこと。

ここではRaspberry Pi 3にAndroid Things環境を作ります。

Raspberry Pi 3での環境構築

https://developer.android.com/things/hardware/raspberrypi.html

準備

必要なもの

  • Raspbarry Pi 3
  • 8GB以上のSDカード
  • HDMIケーブル
  • HDMI対応ディスプレイ
  • Micro-USBケーブル (電源用)
  • LANケーブル
  • SDに書き込みできる環境

一度環境を作った後は、ディスプレイは使わなければなくても大丈夫ですが、初期設定時は画面にIP Addressが出てくるのでディスプレイが必要です。

また、Raspberry PiはUSBデバイス機能がないため、USBでのadb接続ができずtcpipで接続しますが、初期設定時には有線LANに接続するためLANケーブルが必要です。

システムイメージの書き込み

以下からシステムイメージをDLします。

https://developer.android.com/things/preview/download.html

androidthings_rpi3_devpreview_1.zip

展開した以下ファイルをSDカードに書き込みます。

iot_rpi3.img

書き込み方法はラズパイオフィシャルサイトの以下ページよりWRITING AN IMAGE TO THE SD CARDに従ってください。

https://www.raspberrypi.org/documentation/installation/installing-images/


初期設定

Raspberry Pi 3に

  • イメージを書き込んだSDカード
  • LANケーブル
  • HDMIディスプレイ
  • 電源

をそれぞれ接続、挿入します。

すると以下のような画面が表示されるのでIPアドレスを確認し、adb接続します。

f:id:itog:20161214190941j:image

$ adb connect <ip-address>
connected to <ip-address>:5555

以下adbコマンドでWiFiに接続します。

$ adb shell am startservice \
    -n com.google.wifisetup/.WifiSetupService \
    -a WifiSetupService.Connect \
    -e ssid <Network_SSID> \
    -e passphrase <Network_Passcode>

一度Wifi接続をすれば、次回からは起動時に接続し、画面にIPアドレスが表示されます。


アプリを実行する

アプリのサンプルがいくつかあるので実行してみます。ここではボタンを押すとLEDを光らせるサンプルを実行してみます。

https://github.com/androidthings/sample-button

HW

回路図はReadmeにスクリーンショットが貼ってあるのでそれで十分わかりますが、Fritzingのファイルはルートディレクトリに置いてあります(rpi3_schematics.fzz)

抵抗はプルアップが10k、LEDに直列についているのが470Ωです。

アプリのビルドと実行

アプリは通常のAndroidアプリと同様にAndroid Studioで開いてビルドして実行します。

実行時にdeploy targetでiot_rpi3を選択します。

f:id:itog:20161214233926p:image

ボタンを押すとLEDが光ります。

D

これだけだと、スイッチとLED直結してるのと変わらないw

画面はsetContentView()すらしてないので真っ白です。

f:id:itog:20161214220517j:image

これだけだとAndroidなくてもいいのでUIを連動させてみましょう。

TextViewをレイアウトに配置し、LEDのon/offに合わせて色を変えます。

             setLedValue(true);
+            mText.setBackgroundColor(Color.RED);
             setLedValue(false);
+            mText.setBackgroundColor(Color.BLACK);

これでHW入力をUI上に表示できました。

D

ソースはgithubに置いておきます。

https://github.com/itog/sample-button/tree/support-ui

新規プロジェクトを作成する場合はテンプレートがあるのでそれを使うのが良さそう。

https://github.com/androidthings/new-project-template


SDKについて

組み込みに必要のない機能がオプショナルもしくはサブセットになっています。

また、ブート時に自動で起動するHome Activityが指定できます。

それ以外はごく普通のAndroidといった感じなので、お手軽なAndroid実行環境としても使えそうです。

2015-07-17

「通信の最適化」チェッカーをつくった

「通信の最適化」が議論を呼んでいる。通信内容に含まれる画像や動画などのファイルを、ソフトバンクが強制的に不可逆圧縮をしていて、それを利用するアプリで不具合が生じたために大きな話題となったようだ。

詳しくはこの辺りを参照。

ソフトバンク、「通信の最適化」は『正当業務行為』。解除不可 - Engadget 日本版

「通信の最適化」に関する高木浩光氏の見解 - Togetter

事の良し悪しとは別として、実際にどういった条件で、どれくらい最適化されるのか知りたかったのでアプリを作ったみた。

【実験用アプリ】「通信の最適化」チェッカー - Google Play の Android アプリ

ファイルをサーバにアップロードし、同じファイルをダウンロードして、アップロード前のファイルとダウンロード後のファイルのダイジェストを比較して同じかどうかチェックするだけのアプリ。

WiFi環境でやると当たり前だがファイルの内容が変わるということはない。ソフトバンクの回線でもやってみたが、3MBほどのjpgファイルでは圧縮はされなかった。それ以上大きいファイルはパッと手元になかったのでやってないので、ファイルと帯域に余裕のある人はやってみてくださいw

2015-06-25

ReCoCaで使っているAndroid向けライブラリ

ReCoCa (no title) という車の燃費などを管理するアプリを公開してからまもなくリリースから5年が経とうとしていますが、パッと使った感じには大きな変更がないようにしながらも、継続的にさまざまな機能追加をし、さまざまなライブラリを使っています。以下ReCoCaで使っているライブラリとその所感を紹介します。

基本方針

一度導入したライブラリの利用を止める、他のライブラリに乗り換えるというのは機能追加のように効果を見込んだものではなく、コストもかかるため少人数での開発においては極力避けなければ行けません。そのため、将来に渡って使い続けられることに重きを置いています。

使っているライブラリ

バックエンド Parse.com

バックエンドはParse.comを使っています。Parse以前はバックエンドをHerokuにしたり、GAEにしたり、AWSにしたりといろいろ試して見ましたが、ReCoCaに関してはアプリにフォーカスするためmBaaSを導入しました。mBaaSはParse以外にもありますが、モバイルアプリのバックエンドとしてはParseがリードし続けていると思うので乗り換えることはないでしょう。

非同期処理 Bolts

上記ParseのAPIがBoltsに対応していることもあって使っています。JavaScriptのpromiseのJava番で、非同期処理をシーケンシャルに実行したり、複数の非同期処理の待ち合わせに使います。

promiseの考え方がわかっていても、Javaになるとどうしても定形文的なクラス、メソッドを書かないと行けないので見やすくはないですが、これは慣れるしかないかなと思います。

最近RxJavaが話題なので試して見たいとは思いますが、費用対効果を考えると乗り換えることは当面はなさそうです。

クラッシュレポート Crashlytics

いまはTwitterに買収されFabricという開発ツール郡の一つになっているクラッシュレポートツール。Google Playにも標準でクラッシュレポートツールがありますが、反映の早さや使いやすさなどこちらが圧勝のため使っています。

理想的には公開前に多機種での検証をするに越したことはないのですが、リソースが限られている場合はクラッシュレポートと次に述べるテスト配信、段階的公開を使うのも一つの手だと思います。

テスト配信 Google Play, β

テスター向けへの配信は、Google Playのα/β公開機能を使っています。アプリをリリースビルドしたらまずはα公開して社内でテスト、次に必要があればβ公開して社外テスターによるテスト、そののち段階的公開を行います。

新規開発アプリであればCrashlyticsの配信ツールβを使います。

利用状況解析 ParseAnalytics, Mixpanel, Google Analytics

基本Parseを導入すると解析も簡単に導入できるので有効にしています。DAU/MAUなどはこれでチェック出来ます。

Mixpanelは無料枠のAPIコール数が限られているので一部しか撮っていませんがファンネルなどユーザーの行動までわかるので、たまにチェックしているという感じです。

Google Analyticsは、、、実はだいぶ前に導入してからアップデートしてないwしないと。

広告 AdMob

以前はnendを使っていましたが、アダルト、ゲーム系の出稿が多いため乗り換え。自動車会社の広告がそこそこの頻度で出るので個人的にはクリックしたくなる広告が増えたのですが、CTRはそこまで変わりませんでした。

Twitter連携 Twitter4j

老舗のTwitterライブラリ。一度連携した後はノーアクションでTweetされるというのが、ユーザーがReCoCaを選ぶ理由のひとつにもなっているので使い続けています。

Twitter4jは今年8周年を迎え、お祝いを募集中です。

no title

利用するのをやめたライブラリ

Aviary

所有車の写真を設定する際に使っていたライブラリ。国内のアプリだとメルカリに使われています。いつかのバージョンでビルドが通らなくなり、その後Adobeに買収されてCreativeSDKに統合されてからは追ってません。

TestFlight

やめたというか使えなくなったんだけどねwずっとiOSのみサポートしていて、やっとAndroid対応したので喜んで配信に使っていたのですがAppleに買収されて使えなくなるという、、無料を喜んでばかりはいられないと思いました。

TestFlight買収に見る無料サービスの怖さ - Hacking My Way 〜 itogのhack日記

今後導入予定のライブラリ

Data binding

これまでAndroidではViewのレイアウトとオブジェクトを結びつけるのに毎回findViewById()などを呼ばなくては行けませんでした。View Injectionするライブラリのりようも考えたことはありますが、View要素が頻繁に変わることはないことと、将来標準サポートされることを願って使いませんでした。ということで待ってました!

まとめ

以上がReCoCaで使っているライブラリ郡です。こう見るとそこそこ長期間に渡って使っている物が多く、その他の自社アプリ、受託開発アプリでも上記を使うことが多いです。

一方で、何度も導入を試してはあきらめているのがテスト系のツールです。最近Googleがこの辺にも力を注ぎ始めているようなので今後に期待です。

2015-04-14

Androidのカレンダーアプリで予定に自動で画像が表示されるようになってる

Androidのカレンダーアプリで、予定のタイトルによっては、予定詳細画面に自動でイメージ画像が表示されるようになってた。

例えば、予定に「プール」と入れると以下のように表示される。

f:id:itog:20150414203522j:image

スポーツ系は充実してる。

ランニング、テニスはともかくスキーまで。

f:id:itog:20150414203526j:image

f:id:itog:20150414203523j:image

f:id:itog:20150414203524j:image

ところがサッカーは、

f:id:itog:20150414203525j:image

なんでやねん!

美容院とかもある。

f:id:itog:20150414203528j:image

ちょっと残念なのは「レストラン」。夕食、とかだと対象外。予定に「レストラン」とは入れないからなぁ。

f:id:itog:20150414203527j:image

どういう基準で追加されてるのかは気になるなぁ。

あわせて読みたいブログパーツ テクノラティのお気に入りに追加する