iPhoneとAndroidの
 アプリ開発最新潮流



   Rakuten, Inc. May/9/2012
今日のトピック




1   開発環境の動向




2   アプリケーションの動向




3   陥りやすいポイント




4   テスト環境




                          1
1   開発環境の動向




              2
標準のツール


•   iPhone
     – Xcode
     – Simulator
     – 言語 Objective-C
•   Android
     – Eclipse + ADT
     – Emulator
         • 最近 GPU サポートがついて幾らか使えるレベルに
     – 言語 Java
     – NDK を使って C, C++ で一部、及び全体を実装することも可能
         • 一部をC,C++で書いた場合、JNI経由で関数を呼び出す。
         • 既存のC,C++で書かれたライブラリを移植する際にも有効




                                            3
iPhone


• 最新の環境は iOS 5.1
• 日本でデビューして間もなく4年
  – 当時は iPhone OS 2.0 だった。
  – 名前も iPhone OS から iOS に
    • iOS 4.0 から
• デバイスの進化とともに OS も機能が増えて進化
  – GPS, 電子コンパス, ジャイロスコープ、iPad
  – 5.1では日本語のディクテーションもサポート




                                 4
アプリの動作対象OSバージョン - iOS


•   新バージョンのOSでしか使えないAPIを使うとき


     if (NSClassFromString(@"UIDictationPhrase")) {
         //使用出来る場合のコード
     }

•   新バージョンのOSにしか存在しないフレームワークを使うとき
    – 対象となるフレームワークを weak link にする。




                                                      5
Android


• 最新の環境は4.0.x (ics … Ice Cream Sandwich)
• 日本での端末デビューからは3年だが、
  – 開発環境はオープンだったため、デバイス登場以前から
    日本Androidの会の元となったAndroid勉強会などの活
    動でアプリ開発は進められていた。
• GPS, 電子コンパス, ジャイロスコープ、に加えてNFCも
  ある。




                                           6
メモリ管理


• iOS
   – リファレンスカウント
   – ARC
      • iOS 5.0 より
• Android
   – Java … garbage collection




                                 7
iOS - ARC


• Automatic Reference Counting
   – GC とは異なる。
   – リファレンスカウントの自動化
       • [object retain], [object release] が不要になる。
   – 人の手だけでは漏れがちなメモリリーク、二重解放などを削減
     できる。
   – コンパイラレベルで自動化されている。
       • Apple LLVM compiler
   – iOS 4以降が対象、積極的に使うべき
      • フルに活用するには iOS 5 以降
         – iOS4では __weak 修飾子が使えない




                                                     8
タブレット対応


• iOS
   – Universal Application
      • iPhone, iPad 両方で動くアプリ
• Android
   – Fragment
      • 画面の広さに合わせて動的にレイアウトを変更
   – Multiple APK Support
      • Google Play (旧 Android Market)
          – 一つのアプリ登録で複数のバイナリ(apk)を登録
            可能




                                         9
Android - Fragment


• デバイスの画面に合わせて画面の構成を動的に変えられる。
• 例:メーラーアプリ
  – 解像度が高く画面も広いタブレットではマルチペイン
  – 画面の狭いフォン端末ではシングルペイン




                                   10
Android – Multiple APK Support


• フィルター毎に別々のapkをビルドして提供出来る。
  – Google Play上は一種類のアプリ
• フィルターの種類
  – OpenGL の textuer 圧縮方式
  – スクリーンサイズ
  – API Level




                                       11
デバイスの画面解像度


•   今やiOSデバイスも4種類!
    –   320x480 … iPhone 3GS 以前
    –   640x960 … iPhone 4 以降 (Retina Display)
    –   1024x768 … iPad, iPad2
    –   2048x1536 … New iPad (Retina Display)
•   Android 多くの種類の解像度
    –   320x480 … 初代Android端末 G1 等
    –   480x800
    –   480x854
    –   540x960
    –   1280x800
    –   …..
•   解像度に依存しない実装を!




                                                 12
解決方法


• iOSのアプローチ
   – Pixel ではなく Point という概念
   – XXX.png と XXX@2x.png というリソースを用意する。
       • 実行時に自動的に判断して読み分けられる。
• Android
   – dip という単位
       • Density Independent Pixels … 密度非依存のピクセル
       • 同じ値ならば異なる解像度でも見た目は同じ大きさになる
         よう表示される。
   – 解像度の細かさ毎のリソースを用意
       • drawable-mdpi, drawable-hdpi 等




                                                   13
サードパーティ製の開発ツール


• Titanium
   – Java Script
• PhoneGap
   – HTML5 アプリケーションをネイティブアプリ化する
• Unity
   – 3Dグラフィクスを活用したゲーム向け
   – C#, Java Script
• これら3つに共通する特徴
   – iPhone, Android どちらのアプリも作ることができる。



                                         14
2   アプリケーションの動向




                  15
UI


• どんどん凝る方向に
   – 例: Path, iPhoto, Clear
• Android
   – ics でハードボタンは無くなる方向に
   – Fragment




                              16
他アプリとの連携


• Android
   – Intentでシームレスに
• iPhone
   – URLScheme
   – Androidほどシームレスではない




                          17
3   陥りやすいポイント




                18
iPhoneとAndroid両方にあるアプリ


• ありがちなこと
  – 「Android版もiPhoneと同じUIに」---×
• 事例: Twitter 公式アプリ
  – iPhone版、Android版ともにリリースされている。
  – タブバーの位置が異なる。
    • iPhoneは下
    • Androidは上




                                    19
セキュリティ


• Android Manifest 設定
   – 不要なものはセットしない
      • 情報を抜き取るアプリではないかと怪しまれる。
• ユーザー識別にUDIDは使用しない
 – iOS 5.0 以降 UDID取得APIはobsoleteに。




                                     20
4   テスト環境




            21
テストの自動化


• 各プラットフォーム固有のもの
  – iPhone
      • UIAutomation
  – Android
     • monkeyrunner
• 両方で使えるもの
  – NativeDriver (Google, Open Source) --- 開発終了
  – MonkeyTalk (GORILLA LOGIC)




                                                  22
CI


• Continuous Integration(継続的インテグレーション)
   – 主にプログラマーのアプリケーション作成時の品質
     改善や納期の短縮のための習慣。XPのプラクテイ
     スの一つで、狭義にはビルドやテスト、インスペク
     ションなどを継続的に実行していくことを意味する。
     … Wikipediaより




                                         23
CIをサポートするツール


• Jenkins
  – iPhone, Androidの開発でも使用事例が増えている。
  – プラグイン
     • Xcode用
     • Android emulator 用
• コードレビューとの組み合わせ
  – Gerrit
  – Jenkinsでビルドが通ることを自動確認し、通らなけ
    れば自動でリジェクト




                                      24

iPhoneとAndroidのアプリ開発最新潮流

  • 1.
  • 2.
    今日のトピック 1 開発環境の動向 2 アプリケーションの動向 3 陥りやすいポイント 4 テスト環境 1
  • 3.
    1 開発環境の動向 2
  • 4.
    標準のツール • iPhone – Xcode – Simulator – 言語 Objective-C • Android – Eclipse + ADT – Emulator • 最近 GPU サポートがついて幾らか使えるレベルに – 言語 Java – NDK を使って C, C++ で一部、及び全体を実装することも可能 • 一部をC,C++で書いた場合、JNI経由で関数を呼び出す。 • 既存のC,C++で書かれたライブラリを移植する際にも有効 3
  • 5.
    iPhone • 最新の環境は iOS5.1 • 日本でデビューして間もなく4年 – 当時は iPhone OS 2.0 だった。 – 名前も iPhone OS から iOS に • iOS 4.0 から • デバイスの進化とともに OS も機能が増えて進化 – GPS, 電子コンパス, ジャイロスコープ、iPad – 5.1では日本語のディクテーションもサポート 4
  • 6.
    アプリの動作対象OSバージョン - iOS • 新バージョンのOSでしか使えないAPIを使うとき if (NSClassFromString(@"UIDictationPhrase")) { //使用出来る場合のコード } • 新バージョンのOSにしか存在しないフレームワークを使うとき – 対象となるフレームワークを weak link にする。 5
  • 7.
    Android • 最新の環境は4.0.x (ics… Ice Cream Sandwich) • 日本での端末デビューからは3年だが、 – 開発環境はオープンだったため、デバイス登場以前から 日本Androidの会の元となったAndroid勉強会などの活 動でアプリ開発は進められていた。 • GPS, 電子コンパス, ジャイロスコープ、に加えてNFCも ある。 6
  • 8.
    メモリ管理 • iOS – リファレンスカウント – ARC • iOS 5.0 より • Android – Java … garbage collection 7
  • 9.
    iOS - ARC •Automatic Reference Counting – GC とは異なる。 – リファレンスカウントの自動化 • [object retain], [object release] が不要になる。 – 人の手だけでは漏れがちなメモリリーク、二重解放などを削減 できる。 – コンパイラレベルで自動化されている。 • Apple LLVM compiler – iOS 4以降が対象、積極的に使うべき • フルに活用するには iOS 5 以降 – iOS4では __weak 修飾子が使えない 8
  • 10.
    タブレット対応 • iOS – Universal Application • iPhone, iPad 両方で動くアプリ • Android – Fragment • 画面の広さに合わせて動的にレイアウトを変更 – Multiple APK Support • Google Play (旧 Android Market) – 一つのアプリ登録で複数のバイナリ(apk)を登録 可能 9
  • 11.
    Android - Fragment •デバイスの画面に合わせて画面の構成を動的に変えられる。 • 例:メーラーアプリ – 解像度が高く画面も広いタブレットではマルチペイン – 画面の狭いフォン端末ではシングルペイン 10
  • 12.
    Android – MultipleAPK Support • フィルター毎に別々のapkをビルドして提供出来る。 – Google Play上は一種類のアプリ • フィルターの種類 – OpenGL の textuer 圧縮方式 – スクリーンサイズ – API Level 11
  • 13.
    デバイスの画面解像度 • 今やiOSデバイスも4種類! – 320x480 … iPhone 3GS 以前 – 640x960 … iPhone 4 以降 (Retina Display) – 1024x768 … iPad, iPad2 – 2048x1536 … New iPad (Retina Display) • Android 多くの種類の解像度 – 320x480 … 初代Android端末 G1 等 – 480x800 – 480x854 – 540x960 – 1280x800 – ….. • 解像度に依存しない実装を! 12
  • 14.
    解決方法 • iOSのアプローチ – Pixel ではなく Point という概念 – XXX.png と XXX@2x.png というリソースを用意する。 • 実行時に自動的に判断して読み分けられる。 • Android – dip という単位 • Density Independent Pixels … 密度非依存のピクセル • 同じ値ならば異なる解像度でも見た目は同じ大きさになる よう表示される。 – 解像度の細かさ毎のリソースを用意 • drawable-mdpi, drawable-hdpi 等 13
  • 15.
    サードパーティ製の開発ツール • Titanium – Java Script • PhoneGap – HTML5 アプリケーションをネイティブアプリ化する • Unity – 3Dグラフィクスを活用したゲーム向け – C#, Java Script • これら3つに共通する特徴 – iPhone, Android どちらのアプリも作ることができる。 14
  • 16.
    2 アプリケーションの動向 15
  • 17.
    UI • どんどん凝る方向に – 例: Path, iPhoto, Clear • Android – ics でハードボタンは無くなる方向に – Fragment 16
  • 18.
    他アプリとの連携 • Android – Intentでシームレスに • iPhone – URLScheme – Androidほどシームレスではない 17
  • 19.
    3 陥りやすいポイント 18
  • 20.
    iPhoneとAndroid両方にあるアプリ • ありがちなこと – 「Android版もiPhoneと同じUIに」---× • 事例: Twitter 公式アプリ – iPhone版、Android版ともにリリースされている。 – タブバーの位置が異なる。 • iPhoneは下 • Androidは上 19
  • 21.
    セキュリティ • Android Manifest設定 – 不要なものはセットしない • 情報を抜き取るアプリではないかと怪しまれる。 • ユーザー識別にUDIDは使用しない – iOS 5.0 以降 UDID取得APIはobsoleteに。 20
  • 22.
    4 テスト環境 21
  • 23.
    テストの自動化 • 各プラットフォーム固有のもの – iPhone • UIAutomation – Android • monkeyrunner • 両方で使えるもの – NativeDriver (Google, Open Source) --- 開発終了 – MonkeyTalk (GORILLA LOGIC) 22
  • 24.
    CI • Continuous Integration(継続的インテグレーション) – 主にプログラマーのアプリケーション作成時の品質 改善や納期の短縮のための習慣。XPのプラクテイ スの一つで、狭義にはビルドやテスト、インスペク ションなどを継続的に実行していくことを意味する。 … Wikipediaより 23
  • 25.
    CIをサポートするツール • Jenkins – iPhone, Androidの開発でも使用事例が増えている。 – プラグイン • Xcode用 • Android emulator 用 • コードレビューとの組み合わせ – Gerrit – Jenkinsでビルドが通ることを自動確認し、通らなけ れば自動でリジェクト 24