EDIT MODE

モバイルアプリ開発に関することを書いています

AndroidNDKを含むプロジェクトをCircleCIでビルドする

標準的なAndroidプロジェクトのcircle.yml

2015/5/12現在では、公式サイトによると主要なAndroidSDKは、VMにプリインストールされているとのことです。 そのため、以下のような非常にすっきりしたYAMLファイルで、Androidプロジェクトをビルドすることが出来るようになっています。(テストは省略しています。)

machine:
  java:
    version: openjdk7
test:
  override:
    - echo "Nothing to do here"
deployment:
  master:
    branch: master
    commands:
      - ./gradlew assemble

もしプリインストールされたSDKに、使用したいものが無い場合だけアップデート処理を追記してあげればいいみたいです。

dependencies:
  pre:
    - echo y | android update sdk --no-ui --all --filter "package-name"

AndroidNDKを使用する場合のcircle.yml

公式によると、

We also preinstall the Android NDK; it can be found at $ANDROID_NDK.

とあるので、AndroidNDKもプリインストールされてるようです。 ところが、そのままAndroidNDKを使ったプロジェクトをビルドさせると、以下のようなエラーが出てNDKのタスクで失敗してしまいました。

> Building 2%NDK not configured.
> Building 2%  Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
> Building 2%  (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)

失敗する原因は、$ANDROID_NDKではAndroidNDKのホームディレクトリとして認識出来ないことでした。 そのため以下のように、$ANDROID_NDK_HOMEにプリインストールされているAndroidNDKを指定するとうまくいきました。($ANDROID_NDK_HOMEに言及した元ソースは、思い出せませんでした…)

machine:
  java:
    version: openjdk7
  environment:
    ANDROID_NDK_HOME: /usr/local/android-ndk
test:
  override:
    - echo "Nothing to do here"
deployment:
  master:
    branch: master
    commands:
      - ./gradlew assemble

ビルド中の突然死を予防するcircle.yml

特に具体的なエラーを吐くことなく、ビルドが失敗するケースがありました。 主な対策としては、下記2点が有効なようです。

  1. JVMのHeapSizeを制限する
  2. PreDexingを無効化する
machine:
  java:
    version: openjdk7
  environment:
    ANDROID_NDK_HOME: /usr/local/android-ndk
    JAVA_OPTS: "-Xmx2048m -XX:MaxPermSize=1024m"
test:
  override:
    - echo "Nothing to do here"
deployment:
  master:
    branch: master
    commands:
      - ./gradlew assembleDogfood -PdisablePreDex

JVMのHeapSizeを制限する

JAVA_OPTS: "-Xmx2048m -XX:MaxPermSize=1024m"

ある程度の規模のプロジェクトになると、仮想マシンのメモリを食い尽くしてしまうことが多々あるので、Gradleが使えるリソースに制限をかけてあげると安定します。

PreDexingを無効化する

これは公式サイトのDisable Pre-Dexing to Improve Build Performanceの部分に、詳細が書かれています。 その部分を一部引用すると、以下のように書かれています。

Because CircleCI always runs clean builds this pre-dexing has no benefit; in fact it makes compilation slower and can also use large quantities of memory. We recommend disabling pre-dexing for Android builds on CircleCI.

CircleCIでビルドするときは、PreDexingを無効化してねということらしいです。 やり方は、GradleAndroidPluginのサイトに載ってます。(上記CircleCIのサイトからもリンクが貼られてました。)

まずプロジェクトの直下にあるbuild.gradleに、以下のGradleタスクを追加します。

project.ext.preDexLibs = !project.hasProperty('disablePreDex')

subprojects {
  project.plugins.whenPluginAdded { plugin ->
    if ("com.android.build.gradle.AppPlugin".equals(plugin.class.name)) {
      project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
    } else if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
      project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
    }
  }
}

次にcircle.ymlでビルドコマンドを叩く箇所に、dsablePreDexプロパティを付与してあげます。 これでpreDexタスクは実行されなくなります。

./gradlew clean assemble -PdisablePreDex

参考にさせて頂いたサイト

まとめ

AndroidNDKを使う場合は、$ANDROID_NDK_HOMEの設定が必要でした。 JVMのHeapSize制限は必要に応じて使えばいいけど、PreDexingの無効化はやっておいたほうがよさそうです。

またcircle.ymlの書き方は、まだまだ変わっていきそうなので、定期的に公式サイトをチェックした方がよさそうだなと思いました。 この記事では触れませんでしたが、エミュレーターの起動やテストまわりも書きやすくなってました。

自分史上最高に英語学習に取り組んでみようとしてる

今年に入ってから英語でコニュニケーション出来ないために、「ぐぬぬ…」となる出来事が立て続けに起こりました。仕事で1回、コミュニティ活動で1回、あと勉強会でも1回ありました。

分からない単語は調べながら、そこそこ英語のドキュメントが読めれば十分だと思ってた時期が僕にもありました。

きっと多くの人が同じような感じだとも思ってました。 ところがそうでは無いことも、今年になって急激に知ることとなってしまったんです。

知り合いのエンジニアの多くは海外のエンジニアと英語でコニュニケーションを取ってるし、海外のmeetupでLTもするし、同僚のディレクターは僕の隣で某外資系企業の人と英語でコニュニケーション取ってるんです。

これでもか!ってくらい、英語が話せないことに劣等感を感じまくりました。もうこれは、本気で英語に取り組むラストチャンスかな、という気持ちになりました。

しばらく英語学習系のアプリを試したり、PCサイトやPodcastなどなど手を出してみたのですが、いまいちこのまま進んでいいのか自信が持てない日が続いてました。

そんな時、先日「英語上達完全マップ」にたどり着きました。コンテンツを読んでいたら、ずっともやもやしてたものがスッキリした気持ちになり、これだと思いました。

具体的には、「音読」と「瞬間英作文」を柱とした基礎力の強化を重視している学習法を詳細に解説してくれている点に、これは実践してみたいと感じることが出来ました。

いろいろと情報収集して、このへんを参考にしつつ第一弾として3冊の参考書を買いました。

買ったのは以下の3冊です。基礎の基礎から勉強し直そうと思います。 秋頃には一度TOEICを受けてみる予定です。

くもんの中学英文法―中学1?3年 基礎から受験まで (スーパーステップ)

くもんの中学英文法―中学1?3年 基礎から受験まで (スーパーステップ)

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

どんどん話すための瞬間英作文トレーニング (CD BOOK)

どんどん話すための瞬間英作文トレーニング (CD BOOK)

DroidKaigiで発表してきたこと+ちょっと追記

4/25(土)にDroidKaigiという、Androidエンジニア向けのカンファレンスに参加しました。 今回は久しぶりに運営側として参加したり、発表もさせて頂きました。

運営側視点では、圧倒的当事者意識の体現者である @hotchemi さんが、素晴らしいまとめを書いてくださっているので、ここでは発表した内容の補足や追記をしたいと思います。

DroidKaigiの運営進め方共有(ギークに憧れて)

発表したこと

DroidKaigi当日は、会場Bの方で「JellyBeanとKitkatで実現するマテリアルデザイン」というタイトルで発表しました。 3日前にアップデートされたSupportLibrary-v22.1の中で、主にAppCompat-v7の変更点に触れながら、SupportLibraryを使ったマテリアルデザインの実現方法を解説しました。

4/22日の時点で既に7割ほど出来ていた資料でしたが、SupporLibraryが22日朝に大きくアップデートされたため、急遽一から資料を作り直すことにしたという貴重な体験が出来ました。

結果、「最新情報をキャッチアップした内容が聞けて良かった」という感想を頂く事が出来たので、書きなおしてみて良かったです。 ただ、何を資料に載せるか悩みながら書いたので、今振り返るといろいろと不足していたなと感じる部分が多々あります。

また、発表中にv22.1.1というマイナーアップデートが観測されるというミラクルも起きたので、その部分についても補足したい欲が出てきました。ということで、ここからは上記資料で書ききれなかったことを追記していきます。

1. 新しいInterporatorについて

資料の中で実際にアニメーションさせた動画を載せたのは良かったものの、新しいInterporatorはどういう良さがあるのかきちんと説明出来てないなと思いました。

公式ではAnimation > Authentic motionにて

To draw attention to an object for a specific purpose, or to add character to an animation, vary its change in speed when starting and stopping.

とあります。

また日本語でもこちらに

ゆっくりと始まり、ゆっくりと終わる典型的な遷移とは異なり、マテリアル デザインにおけるオブジェクトは素早く動き始め、ゆっくりと最終位置につきます。(中略)結果としてユーザーは遷移動作が終わるのを待つ必要がなくなり、モーション化によるマイナス効果は最小限に抑えられます。

とあります。

つまりは、アニメーションを見せつつ、ユーザーがその変化から受けるネガティブな面を、極力小さくするということのようです。微妙な違いではあるけど、Lollipop端末を触ってみるとその違いは大きいのが良く分かります。

とても理にかなっているなと思うので、Kitkat以下でも同様の表現が出来るようになったのは嬉しいですね。

2. v22.1.1について

DroidKaigiでの発表が終わる(16:30くらい)頃、数名の方から「v22.1.1が出たみたいだよ!」と声を掛けられました。会場設営のため朝早く脳が活動低下してきていたので、最初意味が分かりませんでした。

しばらくして調べてみたら、主にbug fixesがメインっぽかったのでホッとしました。主にRenderScriptまわりのbug fixesのようでした。

差分について、最初に書いた内容が誤りだったため訂正します。(4/29追記)

指摘くださったのは、DroidconMontrealでJake神にどら焼きを届けるという偉業を成し遂げた zaki50 さんです。ありがとうございました!

ソースのDiffを取ると分かるとのことだったので、取ってみました。

$ diff support-v4-22.1.0-sources.src/android/support/v4 support-v4-22.1.1-sources.src/android/support/v4
diff --git a/support-v4-22.1.0-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java b/support-v4-22.1.1-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
index ee1a413..06e72f4 100755
--- a/support-v4-22.1.0-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
+++ b/support-v4-22.1.1-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
@@ -49,7 +49,16 @@ class LayoutInflaterCompatHC {
         final LayoutInflater.Factory2 factory2 = factory != null
                 ? new FactoryWrapperHC(factory) : null;
         inflater.setFactory2(factory2);
-        forceSetFactory2(inflater, factory2);
+
+        final LayoutInflater.Factory f = inflater.getFactory();
+        if (f instanceof LayoutInflater.Factory2) {
+            // The merged factory is now set to getFactory(), but not getFactory2() (pre-v21).
+            // We will now try and force set the merged factory to mFactory2
+            forceSetFactory2(inflater, (LayoutInflater.Factory2) f);
+        } else {
+            // Else, we will force set the original wrapped Factory2
+            forceSetFactory2(inflater, factory2);
+        }
     }

     /**

発表でもリンクを貼ったGoogle+の投稿のコメント(4/25 IanLake氏)に、

FYI, 22.1.1 is available now with the fix for widget tinting inflated from fragments. Thanks for the reports everyone!

ともありました。(確認不足でした。すみません。)

3. support.design.widgetパッケージ?

すみません、これは完全に脱線した内容ですが、2について調べている過程でSupportLibraryのリポジトリを見ていたら、support.design.widgetという見慣れないパッケージがありました。 中を見るとFloatingActionButton.javaが存在してました。他にも、NavigationDrawerView.javaやTabLayout.javaがあります。

f:id:androhi:20150428012534p:plain

気付かなかっただけかなと思い、ローカルにDLしたSupportLibrary-v22.1.1を見たけど、やっぱりありませんでした。もしかしたら、ついに公式のFloatingActionButtonなどがリリースが近いのかも。

4. AppCompatDelegateについて

Google@yuichi_arakiさんの、SupportLibraryでもPreferenceActivityが使えるようになった、というツイートを見かけたので確認してみました。

AppCompatではv22.1でAppCompatDelegateという抽象クラスが追加されてます。このクラスを使えば、どんなActivityクラスにもAppCompatの機能を継承することが出来るようです。

この仕組みを使って、PreferenceActivityにAppCompat(ActionBar的な機能)を追加できるということでした。詳細はAppCompatPreferenceActivity.javaというサンプルコードがあるので、それを見れば一目瞭然でした。便利ですね、AppCompatDelegate。

SupportLibrayのサンプルコードは、Platformのサンプルと同様に、SDK Manager経由で取得します。Extrasの中にあるAndroid Support RepositoryAndroid Support Libraryを最新にすると、以下の手順でサンプルプロジェクトを見ることが出来ます。

今回見たいAppCompatPreferenceActivityは、Support-v7のサンプルなのでSupport7Demosというプロジェクトに入っています。

  1. SDK ManagerでSupportLibraryのv22.1.1をDLする
  2. AndroidStudioでFile > New > ImportProject...を選択する
  3. [sdk]/extras/android/support/samples/Support7Demosを選択する
  4. ライブラリの依存関係が未設定なのでapp/build.gradleに以下を追加する
dependencies {
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.android.support:cardview-v7:22.1.1'
    compile 'com.android.support:gridlayout-v7:22.1.1'
    compile 'com.android.support:palette-v7:22.1.1'
    compile 'com.android.support:mediarouter-v7:22.1.1'
    compile 'com.android.support:recyclerview-v7:22.1.1'
}

f:id:androhi:20150428012625p:plain

まとめ

発表のまとめの最後に、今年のGoogle I/OがMaterialDesign発表後の最初のI/Oなので、今後に関する何かしらの発表があったらいいなと言いましたが、今回新たなパッケージを見つけたり、SupportLibraryは今後も進化していきそうなので、楽しみな流れになってきたと思います。

日本の通信キャリアから発売されてるAndroid端末は、いまだにLollipopへのアップデートが全くの未定です。SupportLibraryによってKitKatでも、少ない労力で適切にMaterialDsignのメリットを活かすことが出来るようになればいいなと思いました。

Androidアプリ開発にRxJavaを導入したいと思って参考にしたサイト

まとめが欲しかったのでまとめました。

RxJavaの存在は知っていたけど、学習コストの高さから尻込みしている方も多いと思います。僕もそうでした。正直ドヤ顔するためのライブラリだろうと思ってた時期さえありました。

ところがAndroidアプリ開発にRxJavaを導入することで得られる、さまざまなメリットを知るようになって考えが変わっていきました。とはいえ学習コストが高いのは事実です。 そもそもReactiveXの世界が理解できないと、サンプルコードを見ても全くしっくりきませんでした。そんな中で以下のサイトのおかげでようやく自分でも手を動かせるようになってきました。

他にも素晴らしいサイトがあると思います。ご存知の方は教えていただけると嬉しいです。

概要とかプログラミング・パラダイムとか

サンプルコードから学ぶ

多言語だけど雰囲気をつかめる

本家

DroidKaigiで発表してみませんか!

DroidKaigiというAndroid技術者のためのカンファレンスが、2015年4月25日(土)に開催されます。

先日、実行委員会の中で(微力ながら僕もこのカンファレンスの実行委員をしています)、「もっとたくさんのエンジニアの方に発表の応募をしてもらおう!」 という話しになり、実行委員会でブログを書くことにしました。

この記事はその中の一つです。

DroidKaigiですが、カンファレンスの主旨としては以下の2点に尽きるかと思います。(サイトからの引用です。)

  • エンジニアが主役のAndroidカンファレンスです
  • Android技術情報の共有とコミュニケーションを目的に

普段からアプリ開発に関連する勉強会は多々ありますが、人気のテーマだとすぐ定員になってしまいますし、時間も限られているので割と特定の分野であったり、別のプラットフォームの話しが混ざっていたりもすると思います。

そんな中でDroidKaigiではAndroidというプラットフォームに絞りつつ、いろいろなテーマのセッションを1日の中で聞くことが出来るカンファレンスになる予定です。

2月25日(水) までは、発表してくれる方の応募を受け付けています。

最新技術や人気の技術に関するものは人目を引くのかもしれませんが、エンジニアのみなさんが毎日の中で経験したことや調べたこと、自らの手で書いたコードが何より重要な技術情報だと思っています。

それらをぜひDroidKaigiで他のエンジニアに共有して頂けると、とても有意義なカンファレンスなる気がします。というか、実行委員のメンバーはそれを楽しみに開催に向けて頑張っています。

もし興味を持たれた方は、こちらから詳細を確認できますので応募してみて下さい。 DroidKaigi Call For Papers

Tech Instituteというアプリ開発講座でサポート講師をしました

7月から12月にかけて、 Tech Institute というアプリ開発者養成講座が開催されています。 不定期ですが、この講座でサポート講師をさせて頂くことになったので、ちょっと雰囲気紹介しつつ感想を書いてみます。

概要とかスケジュールは公式サイトで公開されてます。あとは一般向けにも オープンセミナー が定期的に開催されるみたいです。

やったこと

今日僕が参加したのは、開発環境のセットアップをする回でした。 流れとしては、以下のような形で進められました。

  1. JDKインストール
  2. 環境変数の設定
  3. ADT Bundleのインストール
  4. 新規プロジェクトの作成
  5. エミュレーターの作成と起動
  6. Android Projectをエミュレーターで実行
  7. Android Projectを実機で実行
  8. SDK Managerの使い方

結構盛りだくさんな内容なので、当然スムーズに進む人とそうでない人もいたりするので、サポート講師としてはそのあたりを個別にフォローさせていただいたり、細かい質問に答えたりしました。

授業の様子

会場は中野国際コミュニティプラザにある早稲田大学さんの エクステンション・センター という場所で開催されてます。2014年にオープンしたばかりとのことで、とても綺麗な教室でした。 教室はだいたい40人くらいのキャパだったかと思います。

思っていたよりもいろいろな方が受講者として集まっているなぁというのが最初の印象でした。 プログラミングの経験などはフェーズ的に分からないけど、PCやAndroid端末の慣れ具合だけでも個人差ある感じでした。 サクサク手を進めてJellyBean出して遊んでいるような人もいれば、File Pathのコピペに苦戦してしまうような人など。(Windowsに不慣れなだけだったかもしれませんが)

でもみなさん共通していたのは、ものすごくやる気を感じました。 ちょっと詰まってしまった時などに挙手して質問してくるのですが、ちゃんと自分でいくつか試行錯誤した上でどういう現象になってるかきちんと説明してきてくれます。 毎回そういったスタンスで臨んでいれば、みなさんすぐにコツを掴めるんじゃないかなと思いました。

今回のハイライト

基本的には受講生の方々が使用するPCはWindows機だったのもあって、実機を認識させるのがハマりまくってました。最初は8割くらいの人が認識出来ない状況。

いろいろと試していくものの、原因は様々で「こうすれば認識する」っていう単純なものでは無かったのが、とにかく大変でした。USBケーブルの抜き差しくらいじゃダメで、Eclipse再起動とかUSBケーブル交換とか端末のWi-Fiをオフにしてみるとか、いろいろやりました。一番多かったのが、USBケーブルの相性でしたね…。

個人的にはやっぱりMacLinuxで開発するのがいいよな〜と、改めて思ったのは内緒です。

感想など

僕も同じようにエンジニアを育成する Javaスクール という講座がスタートだったので、勉強し始めたときのことを思い出したりして、よい刺激をもらえた気がします。

まだまだ先は長いけど、Androidアプリ開発の楽しさを知ってもらって、エンジニアって職業に興味持ってもらえたらいいなと思いました。

そのためにも授業をサポートする立場ではあるものの、ただ正解を教えるだけではなくて、どうやったら問題を解決出来るのか?という考え方とか、流れみたいのをうまく伝えることが出来るといいなと思いました。

Google I/O 2014 の What's new in Android development tools のセッション感想

今回見たのは、What's new in Android development tools というセッションです。


Google I/O 2014 - What's new in Android ...

まだあまりAndroidStudioをよく知らないという方は、とにかく一度 19:30 くらいから始まるデモは見た方がいいと思います。 きっとAndroidStudioの素晴らしさが、垣間見えるはずです。

全体でおよそ45分のセッションなのですが、主に3つのパートに分かれていました。

  1. Android Dev Tools (00:00)
  2. Android Studio (19:30)
  3. What's Next (33:56)

要点や感想などを、まとめてみました。

続きを読む