ずっと興味がありながらも敬遠してきたAndroidアプリの開発。iOSのアプリを移植したかったのもあり、ちょっとだけ手を出してみました。
目的や性格によってそれぞれ最適な方法は変わりますが、どうやったら挫折せずに効率よく勉強できるかなと考えたので、Androidに興味あるiOS開発者の参考になれば幸いです。
この記事は、Android開発をしたことがないiOS開発者向けに書かれているので、Android開発者には当たり前のことが多いと思う。「iOSから見たらそう思うのか」ぐらいの面白さはあるかも。
実をいうと、「Androidは端末も多いし、OSもバラバラだし、iPhoneに比べてはるかに大変やろ。iOSのXcodeは凄くよくできていて最高だよ。アップルさんには出来るだけ頑張ってもらって、Androidは可能な限り手を出したくないな。」と敬遠してた。
ところが、Android開発、思ったよりやりやすくて一気に印象変わりました。なんか噂だけ聞いて敬遠していたあの人が、話してみると結構気さくで面白かったみたいな。
まだ一週間ちょっとだけど、練習がてらPlayStoreにListTimerというアプリをリリースしたので勉強過程を書いてみた。
最初の目標
まずは、「開発 => PlayStoreリリース」の流れを大雑把に爆速で理解したい。
小さなものを作ってリリースするのがよいだろうと言うことで、iOSで作ったListTimerという簡単なアプリのAndroid版を作ることに決定。
*参考
標準アプリが不便なので、爆速セットできるタイマーアプリ作った
お勉強戦略
実は数ヶ月前にAndroid開発やるかなと思って、モチベーションが上がらず3時間ぐらいで挫折した経験がある。人間、常にやる気がなくなるリスクがあるので、実機を買う前にシミュレータで開発することにしました。
なにをやるにも、はまり時間を最小にして、最も効率のよい方法を考えるのが重要です。
そういう理由で、ハマった時に見比べられるよう、プログラミング始めたての頃は本を10冊ぐらい購入して挑んでた。
ただ、最初は簡単なことしかやらないのと、初心者用の動画が豊富なのもあり、今回はネットオンリーで。
主なリソースはこの3つ。
*StackOverFlowや他のネット記事
*Youtube (検索したら解説動画がいっぱい)
*公式ドキュメント (iOSに比べて公式ドキュメントが読みやすい印象)
とくにGoogleの公式ドキュメントは凄く見やすい。サンプルコードも多い。iOSはiOS7やiOS8のデザイン特集など、最近だいぶマシになってきたけど、それぞれのフレームワークの説明書はAndroidのほうがかなり読みやすいと感じた。
1. iOSに例えてAndroidSDKの概要を理解
今までの経験から、習得に時間がかかるのはプログラミング言語ではなく、Androidフレームワークのほうだと分かっていたので、Javaの勉強よりAndroidSDKの概要をざっくりと知りたかった。
一番効率のいい方法はなんだろと考えたところ、Androidを始めたiPhone開発者向けに書かれた記事だと思い、そういう記事を探したら、これが大ヒット。凄くわかりやすかった。
@UIデザインの違い
iOS な人が Android アプリを開発するときに気をつけたいこと
SmartNews開発者ブログから。主にUIデザインの違いを解説した良質な記事。
実機があればGoogle純正のアプリを触るのが一番早いけど、実機持ってないので公式のDesign Patternsをさらっと読んだらかなりよくできていた。
@開発環境やSDKの違い
Android Development Tips For iOS Devs
短い記事ながら、iPhone開発者向けにAndroid開発の要点を書いてる。英語だけど、短くて簡単なので最初にオススメ。
Android 101 for iOS Developers
死ぬほど良質なiOSの記事で有名なObj.ioのAndroid特集。長文で英語なのが難点だけど、これが一番まとまってる。
こういう切り口の日本語の記事があまりなさそうなので、今度ブログで書いてみようかと思った。
例えば、こういう具合。
ViewController => Activity
TableView => ListView
Storyboards/NIBs => XML記述が主流
ViewControllerの値受け渡し => intent使う
2. Youtubeで基礎勉強
慣れてきたら情報が詰まった文字のほうがいいけど、初心者の頃は動画のほうが絶対わかりやすい。
なぜかというと、AndroidStudioのどの部分のボタンを操作すればいいかとか、こういう書き方をしたら予測変換が出るのかとか、動画を見るだけで多くのことがわかる。
こういう当たり前のことは文字で書くのには限界があるし、スクリーンショットでも限界がある。シームレスに映像が繋がって全部が見える動画が最適です。
ということで、まずはAndroid StudioでYoutube検索するとよさげなのがいくつか出てきた。
いくつかざっと見ると一気に理解が深まる。
Android Studio App Development | Getting Started
ドットインストールのAndroid入門。 (こちらは日本語。)
僕が初めてプログラミング始めたのは4,5年前だったと思うけど、当時はここまで解説動画が多くなかったのでいい時代になったなあと思った。初心者の頃は動画で勉強するのが本当に効率的。ちなみにYoutubeはccボタンで英語字幕もでます。
*参考
新しい言語とかフレームワーク覚えたいヨチヨチ歩きに動画学習サイトは最高
3. 開発環境がちょい面倒
概要がなんとなくわかった段階で、さっそく作り始める。
ポールグレアムも言っているように、モノを作りたいなら、一番効率がいい学習方法はいきなり作り始めて、必要に応じてわからない部分を調べることであります。
昔はEclipseを使ってたらしいけど、最近はAndroidStudioが主流みたいなので、AndroidStudioを選択。
AndroidStudioなんだけど、iOSのXcodeと違って、インストールしてさあ始めよう!とならないのが面倒だった。
AndroidStudioを開いて、SDKのバージョンごとに、AndroidSDKというのを設定からそれぞれインストールする。最初、どれインストールしたらいいかよくわからんかった。
また、GradleというRubyのGemみたいなものがあって、これのバージョンが違うとか、いろいろ言われて最初は戸惑った。
あと、シミュレータが遅すぎて使い物にならないらしく、GenyMotionという早く動くシミュレータをインストールした。この点、シミュレータも速くてすぐに始められるXcodeはいいなあと懐かしみました。
Webプログラミングの環境構築の面倒さを思い出した。ちなみに、GenyMotionは後回しでもOKだし、実機があれば実機でデバッグすればよし。
4. Youtube参考にListViewを作る
Hello Worldとシミュレータで動かすことができたので、ListTimerに必要なListViewをチュートリアル見ながら作る。
まずは、Youtubeで”ListView”と検索したら、ListViewの使い方の動画が出てくるのでそれを見ながらガリガリと書いていった。
iOSでいうところの、TableViewResourceみたいなのがAdapterという概念らしく、このへんが最初戸惑う。
iOSだと、TableViewのセルをタップした時に呼び出されるDelegateというのがあって、そういうのに似たものがAndroidにもあった。
こんなの。
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
}
このへんはiPhoneの下地があったら同じモバイル開発で似ているので理解しやすい。Androidは結構シンプルな気がして書きやすいかもと思いました。
Android Studioの予測変換もかなり軽快で嬉しい。Importが必要なクラスを含んだコードを書くと、ワンクリックで自動でインポートしてくたりする。これはXcodeにも欲しい。
ちなみにJavaの基礎勉強は飛ばしました。最初は大したことしないのでサンプルコード読んだり、その都度検索で特に問題なく覚えていけた。のちのち本を買ってちゃんと勉強しようと思う。
5.View部分をxmlで書くのに戸惑う
iOSと大きく違った部分が、Viewの表示をxmlで書くという部分です。
一応iOSのストーリーボードみたいなマウス操作で作れるものもあるけど、正直使いにくい。知り合いの人に聞いてもxml直書きだよと言ってたし、ネットの記事でもxml直書きが主流と書いていた。そういうことなんだろうと思う。
RelativeLayoutとか、LinearLayoutの違いも最初分かりにくかった。ここはiPhoneと違って、htmlやcssを使ったWebサイトのような書き方でやっていく形。
ただ、Androidはたくさんのスクリーンサイズがあるから、Webサイトのようにいろんな画面サイズに対応させる書き方という意味では理にかなっているのかも。
こんなの。
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Cancel”
android:textSize=”28dp”
android:id=”@+id/cancelButton”
このへんは、やっぱXcodeのストーリーボードがいいなあ。
6. Nexus4を買う
3日ぐらいやってみて、「おお、Android開発今回は挫折せずに楽しく続いている!これはいける!いけるぞ!」と思ったので、Android端末を購入する決心をしました。
最初はNexus5を買おうと思ったんだけど、シェアが一番多いのはOS4.4であり、Nexus5を買うとOS5がインストされてたりする。iPhoneと違ってAndroidはOSを無理やりダウングレードできるらしいが、保証が効かなくなるとか、面倒そうだ。
なおかつ、最初の一台なら少し古い端末でテストしたほうがバランスがよいだろうということで、Nexus4をヤフオクで買った。2万でした。Nexus5だったらヤフオクで3万オーバーだった気がする。
僕のアプリは日本向けなので、日本人が一番持っているであろうXperiaをテスト機として買ったほうがいいんじゃないか?と浅はかにも最初は思ったりもしました。
しかし、Android開発している人に聞くと、Nexusのほうが起動早かったり、rootがごちゃごちゃできたり、あれもこれもということで、素直に開発機にはNexus買っとけよということらしい。
ヤフオクなので、購入してから届くまで3日ぐらいかかってしまいました。
あと、Androidは実機で動かすのがiPhoneと比べて簡単でよい。実機つなげてAndroidStudioでボタン押すだけみたいな。
iOSだとprovisionProfileの登録がかなり面倒で、最初はkeychainの登録とか、いろいろとハマる。あれはあれでiPhoneのセキュリティの高さを意味しているのだろうと思うけど。
届くまでバックグラウンドの処理を追加したり、Admobをつけたりしてみた。
7. ライブラリの追加は?
Androidはどうやってライブラリ追加すんの?と最初思いました。CocoaPodsみたいな簡単にいれられる仕組みがないと困りますよと。
そしたら、Gradleっていうのに、一行書いてSyncするだけという超絶簡単な仕組みで感動した。
Gradleってなんかバージョンが違うとか、アップグレードしろとか言ってきてウザいやつだなと思ってたけど、ここで「ああ、こいつはこういう役目があったのか。。やるじゃないか。。」と見直しました。
例えば、helpshiftのライブラリ追加はGradleの一行追加するだけ。
dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘com.android.support:appcompat-v7:21.0.0’
compile ‘com.crashlytics.android:crashlytics:1.+’
compile ‘com.helpshift:android-aar:3.7.1’
}
あとは、iOSでいうところの、CocoaControlsみたいなライブラリのギャラリー集やら、COCOAPODS SEARCHみたいな今人気のライブラリを検索できるサイトがないかなと探してます。
8. PlayStoreに提出
端末が届くまでにPlayStoreに提出する練習をしてみた。スクショやアイコンはiOS時代のものを適当に使う。
PlayStoreに提出するには、初回の25ドル登録料が必要。しかし、iOS開発だと毎年一万円近くAppleに更新料払っているので、「え、初回だけでいいの?安いね!」と感じた。
さらにPlayStoreコンソールはTunesConnectより使いやすい。サイトがサクサク速い。アプリデータのアップロードも速い。さすがWeb企業のGoogle。
なんといっても、提出して数時間でリリースできるのに感動。これならバグがあってもすぐに修正版出せるので、アップデート時の心理的ハードルが死ぬほど低くなる。
iPhoneだと一週間ぐらい審査に時間がかかるし、レビューワーにリジェクトされたら、その後のやりとりでさらに数日かかるのはざら。その分ゴミが少ないと思うけど、Web的な速さは体験するとストレスフリーで素晴らしい。
PlayStoreとAppStoreの違いは、ビジネス的な要素で面白い比較ができそうなので、今度またブログで書こうかとも思いました。例えば、レビューの仕組みや課金の仕組みとか、動画やスクショ、説明文の更新など。
まとめ
とりあえず、サクッとお手軽なものを作ってPlayStoreリリースまですることで大雑把に流れがわかった。
普段自分が使わないAndroidアプリは開発のモチベーションが出ないだろうと思ってたけど、そうでもなかったというのが今回の一番の発見でした。
わからないことだらけで、新しいことを勉強するのも新鮮で楽しく、これは自分にとってものすごく価値がありました。
まだ、複数の端末対応とか、タブレットのスクリーンサイズ対応とか、Androidの大変そうな部分を経験していないのでは辛いのはここからな気もするけど、気分が乗っている間にゴリゴリ作りたい。
iOSのListTimerみたいに終了時刻表示もやる予定。課金も実装してみようと思う。タイマー終了時にアプリを強制的に一番前に表示させられたりと、バックグラウンドの挙動がiOSに比べて自由度高い。
*家計簿と読み上げのアプリ作ってます。自己紹介と過去ログはこちら。