未分類

【Android】iOSエンジニアがAndroidに挑戦してみた

はじめに

僕はエンジニア歴1年半ぐらいで半年ぐらい前からswiftによるiOSアプリの開発をメインでやってます。いま担当しているプロダクトがiOS版しかリリースしてなかったのを今回Android版をリリースすることになりそのときに初めてAndroid開発に携わることになったのでそのときにiOS開発をしていた人の視点で思ったことをまとめていこうと思います。

  • 環境 AndroidStudio 3.0 Preview
  • 開発言語 java

言語選定

まず言語選定なのですがAndroidはjavaがメインだったと思うのですが最近kotlinがGoogleの公式サポートに選ばれたのでこの2択でした。僕はどちらもさわったことがなかったのですが、kotlinのほうがswiftに近いのでとっつきやすいのではないかという話をちらほら聞いたのですが、javaがかければkotlinは書けるっていう意見と、両方できるようになりたいなと思ったのでまずはjavaを書けるようにしようと思ってjavaで書いていくことにしました。(本当はメンバーにkotlin触ったことない人がいたのでjavaになったのが最大の決め手でした。)

開発の流れ

当時Android開発出来る人が1人もいない状況下でPMから1ヶ月でリリースしろと意味不明な判断が下ったのでとにかく時間がありませんでした。僕の高校の同期にAndroidめっちゃ書ける人がいて、そいつにまず教えてもらいに行きました。というのも作ろうとしてるアプリはiOSでいうtableViewで作られている部分が多かったのでtableViewを作る流れみたいなののお手本が1つできればそれを真似つつ学びながら効率よく作っていけると思ったからです。なのでそいつに教えてもらうというていで基盤となるものを作ってもらいました。なので今回javaの文法とかを1から勉強したりみたいな時間は、時間効率を重視するのとswiftある程度できるし雰囲気でわかるっしょ!って強気の姿勢でとらないかんじで進めていきました。
中盤あたりでAndroid書ける正社員が入ってくれたので開発も順調に進みました。

Javaの基本文法

とくにJavaの文法は時間を割いて勉強したわけではないですが他の言語をやっていればなんとなくでわかるかなっていうかんじでした。Swiftと比較していきます。

変数定義

// swift
  var a: String = "aaa"
  let b: Int = 1
// java
  String a = "aaa";
  final int b = 1;

上の例で示したようにSwiftとの違いは、

  • 型の定義が逆
  • ;が必要
  • javaでは定数にする場合はfinalをつける

というようなかんじです。なんとなく雰囲気でわかるかんじでした。

関数定義

// swift
  func add(a: Int, b: Int) -> Int {
      return a + b
  }

  private func print(a: String) {
      print(a)
  }
// java
  public int add(int a, int b) {
      return a + b;
  }

  private void print(String a) {
      System.out.print(a);
  }

これも似たような感じで、

  • 引数のラベルと型が逆
  • 返り値を書く場所が逆
  • funcがいらない
  • voidは省略しない

これもなんとなくの雰囲気でわかるかんじでした。

このまま続けていくと似たようなことの繰り返しなので続きはやらないことにします。
とりあえず似たような雰囲気だということがわかったかと思います。いまは基本的な機能を作っていくだけの段階だったので文法的には雰囲気でその都度書き方を合わせるぐらいの感覚で大丈夫でした。

Android開発とiOS開発の違い

言語の文法はわりと似たような雰囲気だったかと思いますが開発の仕方はそれぞれの特色がでていて違う部分が割りと多かったです。

まずそもそもですがAndroidアプリとiOSアプリでは推奨されているセオリーが違います。
例えば、

  • iOSアプリではスワイプバックがデフォルトで出来るがAndroidはない。
  • Androidでは下に戻るボタンが標準装備、iOSにはない
  • Androidではよこからスワイプするとドロワーというメニュー画面みたいなのがでてくる
  • デザインの雰囲気も違う

https://developer.android.com/design/material/index.html?hl=ja
これにGoogleが推奨しているデザインがまとまっています。

なので今回のようにiOS版だけリリースしててAndroid版を出す場合に単純にまったく同じものを作ればいいというわけではないので、AndroidとiOSでのデザインの差分を適用したものを作っていくかんじにしました。

AndroidStudioの便利機能

今までXcodeでiOSアプリ開発をしていてAndroidStudioでAndroid開発をした時に思ったことをまとめていきます。

デフォルトでわりと出来上がった画面が用意されてる

スクロールしたときにヘッダーが出てくるアニメーションなど用意されてます。Googleが推奨しているマテリアルデザインにそったものがそろっています。たくさんあるのでまだ全然使いこなせれてないです。

ライブラリ管理が楽

build.gradleに追加していくだけで書き換えると上に「Sync Now」というのがでてきてそれをクリックするだけでライブラリが使えるようになります。めちゃくちゃ楽ちんです。

リソースの管理がしやすい

画像等を保存する流れはXcodeと似たようなかんじですが、使用する際に、R.drawable.ic_aaaというように書くことができて全て補完が効いてくれるので使いやすいです。iOS開発をする際にRSwiftというライブラリがあってそれを使用していましたがAndroidでは標準の機能で、それに似せて作られたのがRSwiftみたいです。

レイアウトはXMLで行う

XMLを直接いじっていくことになるのでAndroidStudioの使い方がわからなくてもXMLがかければできるのでとっつきやすいです。

よく使うものをXMLにまとめることができる

例えば色とかは毎回定義するのはめんどくさいのと、メインで使ってる色が変更になったときに1つずつ変更することになるので、名前と値を保存しておくことができます。

// colors.xml
  <resources>
      <color name="white">#FFFFFF</color>
      <color name="red">#F44336</color>
      <color name="blue">#2196F3</color>
      <color name="green">#4CAF50</color>
      <color name="orange">#FF9800</color>
  </resources>

  // dimens.xml
  <resources>
      <dimen name="large_font_size">16sp</dimen>
      <dimen name="middle_font_size">15sp</dimen>
      <dimen name="small_font_size">14sp</dimen>
  </resources>

  // strings.xml
  <resources>
      <string name="text">aaa</string>
  </resources>

      <TextView
          android:id="@+id/text_view"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/text"
          android:textColor="@color/white"
          android:textAppearance="@style/TextAppearance.Nueva.Bold"
          android:textSize="@dimen/small_font_size" />

みたいに書くことができます。
文字列は直接書くのではなく、string.xmlにまとめるのがセオリーです。

使ってないプロパティ、メソッド等がわかりやすい

使ってないプロパティやメソッド、import部分が文字色が薄くなってわかるようになっています。Xcodeの場合はメソッド内で定義した変数は警告が出るようになってますが、AndroidStudioはあらゆる部分でわかるようになっているのですごく便利です。

定義名を変更しやすい

途中で変数名など変えたくなったとしたときに、「Refactor」を使えば参照している部分も全て同様に自動で変更してくれます。

今回は基本的なものを紹介していきましたがこれからさらに理解を深めていきたいと思いました。