やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

システムテスト自動化 標準ガイド が発売されます

テスト自動化研究会のメンバーで翻訳・執筆した、『システムテスト自動化 標準ガイド』が12月16日に発売されます。

システムテスト自動化 標準ガイド (CodeZine BOOKS)

システムテスト自動化 標準ガイド (CodeZine BOOKS)

原書は、10年前に書かれた書籍ながらいまだにテスト自動化界隈のアンケートなどで「参考になった」書籍に挙げられることの多い『Software Test Automation (ACM Press)』です。

原書は2部構成になっており、第1部には自動化に関する原理原則、第2部には事例が書かれていました。 本書では、第1部の翻訳に加え、第2部には近年の技術や事例を紹介する形で書きおろしという構成になっています。

第14章 CI(継続的インテグレーション

私も数ページながら、第2部・第14章『CI(継続的インテグレーション)』と題し、(原書で語られている)テストウェアの扱いや自動テストの前処理・後処理について、現在の技術・ツールの実現方法を中心に執筆させていただきました。

また、CIツールの例として、手軽に試すことのできるTravis CIの設定事例を紹介しています。

第14章の目次は以下の通りです。

蛇足

ちなみにこれまで、Amazonで「テスト自動化」で検索すると、拙著『iOSアプリ テスト自動化入門』がトップでヒットしていたのですが、本書によって一位の座を奪われました。く、くやしくなんて(ry

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

Travis CI Meetup Tokyo に行ってきました #travisci_jp

Travis CIのJosh Kalderimisさん、Hiro Asariさんが(RubyKaigiのため)来日されるということで、DeNAさんで開催されたMeetupイベントに行ってきました。

f:id:nowsprinting:20140327064058p:plain

当日撮影された動画および、発表スライドはconnpassの資料ページにまとめてあります

Travis CI Meetup Tokyo - 資料一覧 - connpass

travis-intro(Asariさん)

空のリポジトリから.travis.ymlを書きつつTravis CIの機能を説明していく形の、ライブCIとでも言うべきプレゼン。

使用したリポジトリGitHubで、またビルド履歴はTravis CIのビルドページで参照できます。

ランタイムや環境変数のマトリクスを書いたとき、

matrix:
    allow_failures:
        - rvm: x.x

などと書くと、指定した組み合わせのジョブがfailしてもビルド自体は成功扱いになるという機能、知りませんでした。

Travis CIについて(Joshさん)

Travis CI GmbHのCEO、Joshさんによる、中身の話。

  • Joshさんはニュージーランド住、ドイツ料理好き(Travis CIはドイツの会社)
  • 利用されている言語、travis.org(無料)はnode.jsが多い。travis.com(有料)はRubyが多い。
  • 主に、インフラとUIの2チーム
  • OpenVZ and Docker
  • BIWOMM (but it works on my machine!) からの脱却
  • マルチプラットフォームを提供するのは大変だけどやっている。case insensitiveなOSもあるし大変。
  • Xcode 6対応は近いうちに。
  • Job実行中、10分出力が無いと停止する制限は、'travis_wait'を使うことで回避できる。ただしビルド全体の制限である50分は回避できない。
  • forkされたリポジトリからpull-requestする上でのSecure Variablesの問題、対応を検討中。現状はひとつのリポジトリでブランチからのpull-requestで使って欲しい

LT

Travis API(pinzoloさん)

  • ビルドの履歴をAPIで取得して、Rubyバージョンごとのパフォーマンスを見える化
  • ただしdurationはapt-getの時間も含むので、ビルド単体の時間は取れない

Automated releasing iOS app with Travis CI(岸川さん)

  • iOSアプリのリリースビルドと、実機確認用のビルドを作ってTestFlightで配布する
  • まずリリースビルド(xcarchive)を作り、それを元にipaを作る
  • iTunes ConnectへのアップロードはAPIが無いため手作業だが、Travisで作ったファイルをS3にアップロードして保管し、それで申請している

QUnit on Travis CI(shigemk2さん)

  • 個人で開発しているJava ScriptライブラリをQUnitを使ってテスト

Tachikoma.io(sanematさん)

  • Travis CIは、リポジトリにpushされた契機でしかビルドされないため、依存関係にあるライブラリの更新によってビルドが壊れることを検知できない
  • そこで、定期的にpull-requestを作ってビルドを走らせるTachikoma.ioを作った

Testing your app with Selenium on Travis CI(yandoさん)

  • Travis CIにはFirefox(およびxvfb)が標準でインストールされている
  • やむを得ずheadlessでテストするのではなくGUIブラウザで、Seleniumなどを使った自動テストを実行できる

懇親会で聞いた話(差し支えないと思うので)

  • エンタープライズ用途、つまり、GitHub Enterpriseと組み合わせて使いたいという要望に対応する用意はあるそうで、サポートにメールで問い合わせて欲しいとのこと。
  • Xcode複数バージョンインストールは今後も考えていない。容量がかなり大きいこと、AppleNDAのこと。これは聞いてみたものの、バージョンが上がる過渡期にだけそう思うので、新しいものに更新される今の形で問題ないと思っています。

まとめ・所感

今回、Asariさんの呼びかけで企画され、募集とか司会とかでお手伝いさせていただきましたが、会場まわりは全てDeNAさんにやっていただき、司会のほうもJoshさん自ら質疑応答に入ったり、「あと一人で切ってもらおうか」と思ったら、"last one"と言ってくれるし、LTも皆さん概ね時間通りだし、少し余った分はyandoさんが埋めてくれるし、至れり尽くせりでした!

そしてなにより、Joshさんが楽しそうでよかった。ぜひまた来年もやりたいですね。

Travis CIのアップデートなどはTravis CIのブログでも告知されますが、Asariさんも入ってくれているTravis CI 日本語コミュニティでも色々情報が流れてきます。 Facebookのopen groupですので、どなたでも参加できます。

また、来週、京都と福岡でもMeetupが企画されています。お近くの方はぜひ!

MQTT Meetup Tokyo 2014.08 に行ってきました #mqttja

MQTTに関するアレコレを聞ける会 MQTT Meetup Tokyo 2014.08 (時雨堂さん主催、@niftyさん会場提供 )に行ってきたのでメモ

MQTTの概要(若山さん@ツキノワ)

MQTT(Message Queue Telemetry Transport)の特徴

  • TCPベース、オーバーヘッドが小さく、省電力なのでモバイルでも安心。M2MとかIoTとか。
  • publish/subscribe
  • メッセージごとにQoS(Quality of Service)を設定できる。QoS 0は保証なし、1は必達だが重複の可能性あり、2は正確に一回配信。
  • Will(遺言):クライアント接続時に、切断されたときに送るメッセージを設定できる。サーバ(ブローカー)がよきにはからってくれる
  • Retain:メッセージを配信するときにサーバでこれを保持して、後から接続されたサブスクライバにも配信してくれる
  • CleanSession:CleanSession=falseで接続したサブスクライバは、接続が切断されて再接続したとき、切断されていた間に送られたメッセージも受け取ることができる

現在、MQTT 3.1.1の仕様がOASIS標準の最終プレビュー中。 3.1から3.1.1では、パケット内のプロトコル名の変更、トピック名およびクライアントのIDがUTF-8固定になるなど。

より詳しくは、こちらにまとまっています。

MQTTについてのまとめ — そこはかとなく書くよん。

IBM MessageSight(鈴木さん@IBM

MQTT専用筐体であるIBM MessageSightの紹介。100万台つなげて、16message/secくらい送れている。 パレーマンスレポートも公開されている。

IBM ZP00: IBM MessageSight Appliance - Performance report - United States

MQTTでクラウドに上げたビッグデータのアナライズを部品化して提供するBluemixの紹介。

CoAP(林達也さん@lepidum)

MQTTの競合、CoAP(Constrained Application Protocol)について。

  • UDPベース、RFC7252
  • HTTP/RESTとの親和性(メソッドステータスコードマッピング
  • QoSとかはない
  • firefoxの拡張にcopperというものがある
  • 実用化にむけて追加仕様を検討しつつある。CoAP-MQとか
  • CBOR(しーぼる)
  • 課題は今は安全性、認証、認可、セキュリティ、プライバシー

MQTTブローカーを作った話(voluntasさん@時雨堂)

時雨堂MQTTブローカーを実装するにあたっての苦労など。

  • IBMさんのように専用筐体でなくクラウドで運用するもの
  • MQTT 3.1.1準拠、テストはパスしている
  • MQTT 3.1.1仕様では「メッセージが到達すること」などと書かれており、実装依存箇所が多い
  • クライアントの実装負担が軽い仕様である反面、サーバ側の負担は大きい。また接続数を考えると、リトライなどの負担を軽減することに腐心した。
  • MQTTの外、サービスとして必要な機能も実装。接続数、送信メッセージ数。またRetainの保持期限を設けるなど。

廣江さん@小松電機産業

センサー類→RaspberryPi+Arduino→MQTTをつなげてみた話。

  • アナログセンサー(水位とか)は一定間隔で送るので、QoS 0
  • デジタルセンサー(降雪とか)はON/OFFタイミングでしか送られないので、最低限QoS 1で、かつRetainにする
  • 移動体通信で従量課金であることを考えると、(MQTTといえども)メッセージは集約したい。アナログなら配列、デジタルはビット化するなど。またJSONでなくMessagePackを使うなど。
  • 実装言語は、軽量にするのであればC。その他、Golang、mruby
  • 時雨堂さんのMQTTブローカー(米東部?)を使ったデモ動画。若干の遅延はあるが、厳密なリアルタイム性を求められないなら十分実用的。シンガポールに移って遅延は減っている。

Sangoについて

時雨堂さんのMQTT as a Service。当日の00:00にローンチされた。

MQTT as a Service sango

現在はフリープランのみで、同時接続数3、QoS 0のみ。10月目標で有料プランを準備中。GitHubアカウントでサインアップして利用できる。

使いかたなどはこちら。

MQTT as a Service: Sango のリリースをお手伝いしました — そこはかとなく書くよん。

Android WearでIME (Minuum Keyboard) を使ってみた

Android向けの、小さいサイズのキーボードが売りのIMEであるMinuum KeyboardAndroid Wearに対応したと聞いて*1試してみました。

f:id:nowsprinting:20140717035208p:plain

ありがちな誤解の訂正

まず、ありがちな誤解*2について。以下を踏まえて、以降を読み進めてください。

IME on Android Wear

そもそもAndroid Wearからの入力は、音声入力もしくはGUIからのごく簡素な入力を前提とされています。 従って、プリインおよびGoogle Play Storeで公開されているAndroid Wear向けアプリには、EditTextで文字列を入力させるインタフェースを備えているものはありません。

Android Wear向けアプリでEditTextを使用することは可能ですが、Wearには(少なくとも、LG G Watchには)EditTextをタップしたときに起動するIMEがインストールされていないため、入力はできません*3

端末にインストールされているIMEは、以下のコマンドで確認できます。

$ adb shell ime list -a

これを通常のAndroid端末に向けて叩くと、IMEInputMethodServiceの実装)のID, name, packageNameなどが出力されます。

しかしAndroid Wear端末では、出力がありません(つまりIMEがひとつもインストールされていない)。

IMEのインストールと有効化

AndroidにおけるIMEは、ひとつのアプリとして端末にインストールすることができます。インストールまでは通常のアプリ(apk)と同じ手順で行ないます。

Minuum Keyboard(apkファイル入手方法は後述します)では、adb installコマンドで直接Wearデバイスにインストールします。

$ adb install -r PACKAGE.apk

インストールしたapkは、通常のAndroid端末であれば設定アプリの"言語とキーボード"で有効化を行えますが、Wearデバイスにはこの設定項目がありません。そのため、以下のコマンドで有効化を行ないます(Minuum on Android Wearの最新の手順にはime enableコマンドも書かれていますが、ime setコマンドだけで有効になります)。

$ adb shell ime set PACKAGE_NAME/.SERVICE_NAME

PACKAGE_NAMEにはapkのパッケージ名、SERVICE_NAMEにはInputMethodServiceのクラス名を指定します(Minuum Keyboardでは、インストール方法のメールに書かれています)。

これで、インストールしたIMEを使えるようになります。

Minuum Keyboardの利用

IMEを起動するにはEditTextを配置したActivityが必要です。Minuum Keyboardには、その設定アプリ内に動作確認を行なうことのできるEditTextが配置されているため、それを利用して確認します(独自のIMEをインストールした場合は、EditTextを備えたアプリも用意してください)。

1.ランチャーから"開始..."を選択し、"Minuum Settings"を探してアイコンをタップします

f:id:nowsprinting:20140717040646p:plain

2.起動には少し時間がかかります(一旦Watch Faceに戻りますがそのまま待ちます)。数秒後、MinuumのAgreement画面が表示されますので、内容をよく読んで"I agree"をタップします

f:id:nowsprinting:20140717040842p:plain

3.設定画面が表示されたら下にスクロールして、"Cheat sheet"をタップします

f:id:nowsprinting:20140717041058p:plain

4.チートシートEditText、そしてMinuum Keyboardが表示され、入力することができます。この画面を抜けるには、他のWearアプリ同様、右にスワイプします。

f:id:nowsprinting:20140717035208p:plain

Minuum Keyboardの入手

Android Wearで動作するMinuum Keyboardは、下記ページにサインアップ*4することで、メールでインストール手順とともにapkのダウンロードURLが届くはずです。

メールには、本エントリで具体的には書かなかったパッケージ名なども記載されています。基本的にメールに沿って実行していけば大丈夫なはずです。

Minuum Keyboardの使い勝手

そもそも、Android向けのIMEとしての実績があるアプリケーションで、小さいキーボードと、それに伴なうtypoを前提としてカバーする(予測変換的な)アルゴリズムが売りのようです。

ある程度typoしていても構わず入力していくと、正しい(入力したかった)単語が候補として表示されます。右スワイプで確定&スペース空け、左スワイプで一語削除と、一般的な英文であればスムーズに入力していくことができます。

ただ、記号の入力は辛いのと、老眼の人には細かすぎて厳しいような気がします。私はまだ全然大丈夫です。

現在、様々なデバイス向けのSDKを準備中のようで、下記サイトの下のほうに動画とサインアップフォームへのリンクが貼ってあります。

どのような販売形態・価格体系になるかわかりませんが、Android Wearのようにインストールに制約がある(コンシューマが簡単に使えない)デバイス向けには、SDKとしてアプリにバンドルさせる形を想定しているのではないでしょうか。

所感

Android Wearでも(設定すれば)IMEが使えるというのは面白いですね。 設定には開発者向けツールが必要なのと、インストールしたとしてもIMEを使えるアプリ(EditTextで入力させるアプリ)が無ければ使いどころもないので、すぐ実用化、一般化、となるものではないでしょう。しかし、ひとつのデバイスとして遊びどころはまだまだありそうです。

最後に。Android Wear 勉強会 #2の参加エントリも書かず、こんなの書いててごめんなさい…

*1:Android Wear対応の超小型ソフトウェアキーボード登場 | GGSOKU - ガジェット速報

*2:誤解というか出ている情報だけでは判断つきませんよねー

*3:Logcatを見る限り、特にエラーを吐くこともなく、なにもおこらない

*4:Mailing Listと書かれていますが、いわゆるMLではなく一方通行のアナウンスが送られてきます

QtのiOSアプリ生成を試してみた

Qt 5.2から、iOS/Androidネイティブアプリの生成がサポートされました。とりあえずiOSアプリについて試してみたメモ。

開発環境のインストール

Xcode

Xcode 5.1.1および、Xcode Command Line Toolsのインストールが必要です。

アプリを実機にインストールする場合、またApp Storeにリリースするビルドを行なう場合は、Xcodeメニューの[Preferences...]->[Accounts]画面でiOS Developer Programに加入しているアカウントを追加し、証明書とプロビジョニングプロファイルをダウンロードしておく必要があります。

Qt

今回はQt 5.3.1で確認しました。Download Qtからオンラインインストーラでインストールできます。

インストールパスは

/Applications/Qt/

としました。 ビルドに使用するqmakeなどのコマンドが、Mac OS Xネイティブアプリ向けの

/Applications/Qt/5.3/clang_64/bin

のほか、

/Applications/Qt/5.3/android_armv7/bin
/Applications/Qt/5.3/ios/bin

にもインストールされます。

Qtプロジェクトの作成

QtのIDEであるQt Creator.appを起動して"新しいプロジェクト"をクリック、テンプレートを選択します。 このとき「サポートされるプラットフォーム」が表示されますが、今のところ全てのテンプレートでiOSもサポートされているようです。

f:id:nowsprinting:20140702060952p:plain

テンプレートを選択したら、プロジェクトの格納パスを決定します。

f:id:nowsprinting:20140702061036p:plain

続いてキットを選択します。ここでiphoneos(実機用)とiphonesimulator(シミュレータ用)を選択します。

f:id:nowsprinting:20140702061048p:plain

そのほか、テンプレートに応じた設定などを確認すると、Qtプロジェクトが作られます。

Qtプロジェクトのビルド(IDE

そのままQt Creatorでアプリのビルドを実行してみます。 まず、メニューの[ビルド]->[ビルド/実行キットセレクタを開く…]を選択して下記ウィンドウを出し、キット=iphonesimulator、ビルド=デバッグを選択します。

f:id:nowsprinting:20140702063409p:plain

続いてメニューの[ビルド]->[実行]でビルド、iOSシミュレータへのデプロイ、アプリ起動まで実行されます(iOSシミュレータのバージョン、解像度は指定できないようです)。

また同様に、実行キットセレクタでキット=iphoneosを選択すると、USB接続している実機でアプリ起動まで実行されます。

Qtプロジェクトのビルド(コマンドライン

IDEでなく、コマンドラインでのビルド方法です。 まずqmakeコマンドで、QtからiOSプロジェクトの出力を行ないます。

$ /Applications/Qt/5.3/ios/bin/qmake -r

これでiOS向けプロジェクト(Xcodeプロジェクト)と、上記構成のプロジェクトであれば下記4種類のMakefileが生成されます。

続いてビルドターゲットに応じたMakefileを指定してmakeを実行します。

$ make -f Makefile.ReleaseDevice

ReleaseDeviceの場合、ビルドはRelease-iphoneos/HelloWorld.app/に出力されます。

ipaファイルの生成

.appからipaファイルの生成は、xcrunコマンドを使用します。生成されたipaファイルはそのままXcodeのオーガナイザやiTunesで端末にインストールしたり、TestFlightにアップロードすることが可能です。

$ xcrun -sdk iphoneos PackageApplication Release-iphoneos/HelloWorld.app -o $(PWD)/HelloWorld.ipa

iostoolコマンドでのインストール

Qt Creatorのiostoolによるインストール方法について、@IoriAYANEさんに頼まれた内容の確認を行ないましたが現在まだ成功していません。

端末UDIDの取得

端末をUSB接続した状態で下記コマンドを実行すると、端末のUDIDが取得できるようです。

$ /Applications/Qt/Qt\ Creator.app/Contents/Resources/ios/iostool -device-info

実行結果は以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<query_result>
    <device_id>8af2b012d6ab166f897b91d8919c8812401c1fda</device_id>
    <device_info>
        <item>
            <key>developerStatus</key>
            <value>Development</value>
        </item>
        <item>
            <key>deviceConnected</key>
            <value>YES</value>
        </item>
        <item>
            <key>deviceName</key>
            <value>Koji Hasegawa の iPhone 5s</value>
        </item>
        <item>
            <key>osVersion</key>
            <value>7.1.2 (11D257)</value>
        </item>
    </device_info>
    <exit code="0"/>
</query_result>

なお、UDID自体はiTunesでも確認できますし、ビルドする前にプロビジョニングプロファイルに紐付ける必要もあるので、このタイミングで取得することは稀だとおもいます。

端末へのインストール

下記コマンドでインストールできそうなのですが、うまく行っていません。

$ /Applications/Qt/Qt\ Creator.app/Contents/Resources/ios/iostool -device-id 8af2b012d6ab166f897b91d8919c8812401c1fda -bundle Release-iphoneos/HelloWorld.app -timeout 10000 -run

実行結果(エラー)は以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<query_resultCommandSession ERROR:  "failed to get app Path on device for bundle Release-iphoneos/HelloWorld.app with appId: com.nowsprinting.iostestautomationbook.HelloWorld">
    <msg>TransferAppSession(8af2b012d6ab166f897b91d8919c8812401c1fda, Release-iphoneos/HelloWorld.app)failed to get app Path on device for bundle Release-iphoneos/HelloWorld.app with appId: com.nowsprinting.iostestautomationbook.HelloWorld
</msg>CommandSession ERROR:  "Unexpected reply: ENo such file or directory () (454e6f20737563682066696c65206f72206469726563746f7279202829) vs OK (4f4b)"
    <msg>TransferAppSession(8af2b012d6ab166f897b91d8919c8812401c1fda, Release-iphoneos/HelloWorld.app)Unexpected reply: ENo such file or directory () (454e6f20737563682066696c65206f72206469726563746f7279202829) vs OK (4f4b)
</msg>
    <app_started status="FAILURE"/>
    <exit code="0"/>
</query_result>

-bundleに指定しているパス(.app)は存在し、メッセージ中のappIdはその.app下から読んでいるはずなので間違いないはず。

また、.appでなく上記xcrunコマンドで生成した.ipaファイルを指定しても同様のエラーかつappIdが表示されません。

独自のInfo.plistを使用する

iOSアプリのメタ情報を管理するInfo.plistファイルは、qmakeコマンドで生成されます。この中のCFBundleIdentifierなどを書き換えたい場合、以下の手順で行ないます。

1.あらかじめ専用のInfo.plistファイルを別名で作成する(ここではHelloWorld-Info.plist)

2.HelloWorld*1.proファイルに以下を追記する

QMAKE_INFO_PLIST = HelloWorld-Info.plist

これで、qmakeでデフォルトのInfo.plistは生成されず、続くビルドでHelloWorld-Info.plistが使われます。

*1:プロジェクト名

Gradle+Androidプラグイン(0.7以降)でNDKプロジェクトをビルドする

Androidの新ビルドシステムであるGradle plugin for Androidでは、0.7からNDKのビルドがサポートされました。

が、いまだに(一年前の)0.4ベースのエントリが参照されていたり、ググると上位にいるようなので、現状をまとめなおします。

環境

  • Android SDK Build-tools r19.1
  • Gradle 1.12(1.10以上)
  • Gradle plugin for Android 0.11.0(Gradleによってインストール)

Gradleのインストール方法は、下記エントリを参照してください。

AndroidプラグインのNDKサポート

以前は、build.gradleにカスタムタスクを定義してndk-buildを実行していましたが、現在は以下のように書くことができます。

android {
    defaultConfig {
        ndk {
            moduleName "cppmodule"
            abiFilter "armeabi-v7a"
            stl "gnustl_static"
        }
    }
}

ビルドした共有ライブラリをapkに取り込むために記述していた下記タスクは削除してください。(pkgTask#jniDir()は削除されました)

- tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
-     pkgTask -> pkgTask.jniDir new File(projectDir, 'libs')
- }

ビルド対象のソースは、従来のjni/ディレクトリではなく、src/main/jni/に置きます。また、以下のファイルは自動生成されますので不要になります。

最後に、local.propertiesファイル(もしくは環境変数ANDROID_NDK_HOME)にAndroid NDKのパスを定義します。(パスは各自のインストールパスを指定してください)

ndk.dir=/Applications/android-ndk-r9d/

これで、これまで通り下記コマンドでビルドが実行されます。

$ gradle build

ndkのプロパティ

ndk{}内のプロパティには、Android.mkおよびApplication.mkに定義していた内容を設定することができます。

また例えばabiFilterなどは、defaultConfigでなくプロダクト・フレーバーごとに記述することもできます。新ビルドシステムのサンプルプロジェクトndkSanAngelsでは、プロダクト・フレーバーとしてx86, arm, mips, fatをそれぞれビルドしています。

ビルド済み共有ライブラリの利用

別途ビルドした共有ライブラリ(.soファイル)を利用する場合は、src/main/jniLibsにファイルを格納しておくことでビルド時にパッケージされます。

以上で、ほとんどのケースでbuild.gradleの記述だけでNDKプロジェクトのビルドが実現できるのではないでしょうか。

だが断る

現時点(Gradle plugin for Android 0.11.0)では残念ながら、標準サポートされた機能ではスタティックライブラリ(.aファイル)を含むプロジェクトはビルドすることができません。

スタティックライブラリを含むプロジェクトでは、0.4ベースのエントリに書いた設定をベースに以下を修正してください。

1.ビルドした共有ライブラリをapkに取り込むために記述していた下記タスクは削除してください。(pkgTask#jniDir()は削除されました)

- tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
-     pkgTask -> pkgTask.jniDir new File(projectDir, 'libs')
- }

2.ndk-buildで生成された.soファイルを、libs/からsrc/main/jniLibs/にコピーします。(シンボリックリンクを張るなどでも可)

task ndkCopy(type: Copy) {
    from 'libs'
    into 'src/main/jniLibs'
}
tasks.withType(Compile) {
    compileTask -> compileTask.dependsOn ndkBuild, ndkCopy
}

サンプルプロジェクト

https://github.com/nowsprinting/GradleAndroidNdkExample を更新してあります。

Travis CI Night に行ってきました #eytokyo

Engine Yard 東京オフィスで開催された Travis CI Night に行ってきました。

f:id:nowsprinting:20140327064058p:plain

iOSオープンソースライブラリにおけるCI環境の定番となっている Travis CI に関する国内初イベントとのことで、行ってきました。RubyPHPなどで利用されている方々のお話も聞けて、横のつながり的な良い感じのイベントでした。

会場は業務レベルのPaaSを提供する Engine Yard の東京オフィスさん。

Travis CIについて

以下、メモ書きから。メモしきれなかったので、安藤さんのスライドが公開されたらそちらを参照してください。

  • ベルリンの会社。今回主催の安藤さん@Engine Yardはベルリン好き(偶然の一致)
  • ベルリンといえば熊
  • サービス開始は2011年2月?(ドメイン取得がこのタイミング)
  • 特徴は、オープン、分散、即時。GitHubのパブリックリポジトリであれば無償利用可能
  • .travis.ymlに、最低限language:だけ指定すれば、デフォルトでよきに計らってくれる
  • language: objective-cで、Mac OS Xでビルド可能。他にも類似サービスはあるがMac OS X利用可能なサービスは少ない
  • Seleniumの利用が可能。WorkerにはFirefoxが入っている
  • .travis.ymlに直接書いて晒したくない情報は、travis encriptコマンドであらかじめ暗号化してsecret:記述することが可能
  • ビルド、テスト、Engine Yard などのPaaSへのデプロイ
  • FacebookTravis CI 日本語コミュニティ があり、Travis社の日本人エンジニアAsariさんもいるので、ジョインして盛り上げて欲しい

【3.27追記】安藤さんおよびLTのスライド、動画が公開されています。

iOSアプリ開発でもTravis CI

ついでに書籍の宣伝LTもしてきました。

スライドで触れていますが、本書の7.3でTravis CI、また8.1でCoverallsによるコードカバレッジ表示について書いています。

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門