Blogスマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。Blogこの広告は、90日以上更新していないブログに表示しています。#DroidKaigiこんにちは。モバイルチームの中川@Nkznです。2015/04/25droidkaigi.github.ioAndroidエンジニアのためのカンファレンス「DroidKaigi」に登壇する機会をいただきまして、サイバーエージェントのセミナールームでお話してきました。本エントリは、発表原稿としてスライドの元にした文章です。技術的には同一の内容になっています。www.slideshare.netはじめにユーザーがどんな場所にアプリを持っていこうと、私達はそれを制止できません。自分たちのWebサービスを携帯網もWi-Fiもない場所でも使ってほしいと思ったとき、私たち開発者には何ができるでしょうか。GmailアプリやEvernoteアプリのように、オフライン時に閲覧・作成・編集されたデータをサーバーと同期させるための仕組みが、Androidには用意されています。サーバーと同期する際のアルゴリズムについては開発者任せです。本エントリでは、データ同期を実装するにあたって参考にしたものや気にしたことを紹介していきます。農業版Redmineに近づいてる業務システムにはよくある話ですが、マスタデータとトランザクションデータの組み合わせにより農作業記録のデータ構造が作られています。オフライン機能への要望の高まり2012年3月にAndroidアプリのファーストバージョンをリリースしました。この頃は、画面を表示する時点でデータをfetchしてくる方式でしたが、しばらくすると、似たような要望が散見されるようになりました。「圏外の地域でも利用したい」という要望です。近年では人が住んでいる場所がエリア外ということは減ってきているようですが、山の中だったり、広大な北の大地のど真ん中に行けば、容易に圏外になるそうです。「現場で使うアプリ」を標榜しているのに、現場で使えないというのも辛いところです。この問題は、長いこと課題として残っていました。アグリノートの導入を機に法人契約で社員にスマホを持たせている法人農家で、通信費のほうが高く付いている事例も聞こえるようになったことも気になっていました。オフライン動作ができる分には、Wi-Fi接続のみのタブレットという選択肢が生まれるので、これもまた大きなモチベーションになりました。現場では電波が無くてもデータの保存ができて、電波がある場所に戻ってきたときにデータを同期できる。2013年の終わり頃からアプリの全面リニューアルを始めたタイミングで、そんなオフライン機能の検討を始めました。気合で同期機能を実装するさて、自動同期の機能を実現しようとしたら、何が必要でしょうか。定期的に、または何らかのキックによりバックグラウンドで通信を行いアプリ内のDBを更新するこんなところですね。実は2013年にも仕事で同期機能を持ったAndroidアプリを作成したことがありました。当時の私がなんとか知恵を絞って考えたのが下記の構成です。実際にこの方針で実装していく中で、色んな問題が発生しました。並行処理プログラミングに強くない人間が首を突っ込んではいけない領域に足を突っ込んでいたような感じでした。ちなみに同期アルゴリズムとしては、朝イチでログインさせてそのときに前回データを全部消して、それから最近のデータを丸々引っ張ってくるという感じだったので、同期というかただのダウンロードでした。Androidが提供するデータ同期機能まずはAndroid側が用意してくれている仕組みの概要や経緯についてお話します。5)で、アカウント管理の機能が導入されると同時に、データ同期のためのAPIが提供されました。sources.http://developer.android.com/about/versions/android-2.0-highlights.htmlもちろん、この機能は現在でも利用できます。バックグラウンドでデータの送受信を行いたい場合、スレッドの管理や、ネットワーク有無の検知などを自分で管理するのは手間ですが、このSyncAdapterを利用することでAndroid側にそういった管理を任せられるようになるのです。便利には便利なのですが、このSyncAdapterという仕組み、なかなか導入が面倒です。結構な数のファイルを作って適切に配置・設定してあげないと、動き出してくれません。雰囲気としては、AndroidManifest.xmlを起点として、下記のように各機能を繋いであげる必要があります。それぞれの役割としては下記のような感じです。AccountAuthenticatorで認証情報を管理する処理を行うバックグラウンドで動かすためのServiceも実装するSyncAdapterで同期処理を実装するバックグラウンドで動かすためのServiceも実装するContentProviderでデータを管理するそれぞれの処理をAndroidManifest.xmlで繋ぐAuthority文字列やAccountType文字列を揃える非常に面倒ですね。いえ、サンプルがあれば充分に把握可能なものだと思います。・・・?ドキュメンテッドになったのが割と最近GmailやGoogleカレンダーなどはSyncAdapterの便利さを享受していると思われますが、デベロッパーの間での利用が増えてきたのは割と最近のように思われます。I/Oくらいの時期まで、リファレンスの方には断片的に使い方が書いてあったものの、使い方の全体像になる公式ドキュメントが存在しなかったらしいことが見えてきました。インターネットアーカイブサービスで調べてみると、初出が2013年7月13日ということになっています。I/Oレポを覗いてみると、SyncAdapterが紹介されているのが伺えます。前述のとおり、それなりに複雑な設定をしないと動かないものですので、公式ドキュメントの登場により、ようやくデベロッパーが「どんなものか試してみようか」と取り組める下地ができたのではないでしょうか。補足@vvakame氏もやんざむ氏の記事と同じことを言ってるので、I/Oのときにそういう話があったのは確かみたいです。MagicというセッションでSyncAdapterについて言及されたと俺のログには記録されているな。I/Oでの言及や公式ドキュメントの整備を皮切りに、少しずつまとまった資料が増えてきたように思います。Hacks」の中でも、SyncAdapterの使い方が紹介されました。この書籍は江川さんらにより翻訳され、2013年11月に日本語版が出版されています。開発現場ですぐに役立つヒントとコードtatsu-zine.comこの後、2014年の初めにmixi-inc/AndroidTrainingの中で基礎編の中に組み込まれたりしたのを初め、Web上での情報が増えていったような気がします。さんによると、社内の知見をかき集めて何とかしていたようです。Hacksのお陰でSyncAdapterを導入すること自体には大きな問題はありませんでしたが、その一方で、どんなアルゴリズムで同期を実現するかという思想的な部分では悩まされました。結果的に、参考にした資料は下記の2つです。23として紹介されています。紙面では要点を押さえた感じで紹介されていますが、サンプルコードに入っているTODOアプリがかなりしっかりしており、基本を掴むための助けになりました。サンプルにはPython製のサーバーやブラウザ版クライアントも同梱されており、データ同期をより実践的な形で体験できます。