RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

見やすいページを簡単に作る

どうも!デザイナーの渡辺です!

最近エンジニアさんたちと同じ部署に配属されました!

これからたまに出てくると思います!
よろしくお願いしますヽ(=´▽`=)ノ



さてさて、せっかくデザイナーとエンジニアが一緒の部署になったということで、
デザイナーの知識を皆さんにお届けできればなと思います!
なので今回は誰でも簡単にできる、
見やすいページを作る小技をご紹介いたします。パチパチ

やることは簡単! 分ける・空ける・揃える

これだけですね(゚∀゚)
といってもなにをすればいいのって話ですよね!

それでは1つ1つ説明していきます!
(っ’-‘)╮ =͟͟͞͞ 【分ける・空ける・揃える】 ブォン

今回はこちらの情報をもとに説明していきます! f:id:yui_1027:20191024113611p:plain

分ける 大カテゴリ、中カテゴリ、タイトル、テキスト、イメージなど早い話が仕分けですね!
一体それがどんな役割を果たすのか明確にします!

空ける 余白を入れてグループとグループの間を空けます これだけでだいぶ見やすくなりました!

揃える 分けた要素はグループごとに同じ見た目に、
空けた余白は類似のもので同じサイズに揃える!
たったこれだけで断然見やすく情報を伝えられるページになります!

実はこれは小技というよりは、デザインの基本ですね!

逆を言えば、こういう部分に着目するだけで
そのページをデザイナーが作ったかそうでないかがわかります!

「あ、揃えるとこ揃えてない。これデザイナーじゃないな。フム」

こんな具合です |ω・)ミテマスヨ

ページを作るときは、騙されたと思って

分ける・空ける・揃える

を合言葉にぜひ作成してみてください!

それだけであら不思議!見やすいページの出来上がりヽ(=´▽`=)ノ
パワポなどでの資料作成でも使えると思います!

なんだこんな簡単なら、デザイナーもいけるんじゃね?ってなります!
これが簡単そうで意外と出来ないものなんですよ( ・´ー・`)ドヤ

しかしそれが出来たらあなたはもうデザイナー!
ようこそこちらの世界へ!(∩´∀`)∩ワーイ

「そんなの知ってるよ!当たり前じゃないか!」

そう思ったそこのデザイナーさん! 我々はデザイナーを募集しております!ヨッ

www.wantedly.com

見やすいページを作る合言葉は

分ける・空ける・揃える

覚えてくださいねー!
 それでは ノシ

レッスンルームのチャットUIを MessageKit に差し替えたときのツラミとレガシーコードとの向かい方

お疲れさまです。 APP/UI チームの玉置です。

最近のマイブームは鬼滅の刃(きめつのやいば)です。
ツイッターのタイムラインで鬼滅の刃のワンシーンを見てしまい「おっ、刀がメインのアニメか!」と思ってNetflix で動画を見始めたのがきっかけです。
当時の動画のワンシーンは登場キャラの善逸くんが雷の呼吸「雷の呼吸 壱の型 霹靂一閃」を解き放って敵キャラを瞬殺したシーンです。
善逸くんのキャラが「るろうに剣心」の十本刀の「宗次郎」にとても似ていてそのシーンだけで気に入ってしまいました。
(* 善逸くんは宗次郎のキャラとは全然違います)

そんなこんなで動画を見つけた日は善逸くんの上記のシーンまでの動画を徹夜で観ていました。

さて、そんな話しは置いとくとして今日は先月ずっと行っていた
レッスンルームのチャットのデザインで使っていたライブラリのリプレイス作業をずっと行っていました。
そして、やっと今月リリースできそうなのでその当時に色々思うことがありましたので文章化してみました。

リプレイスする前に使っていたライブラリについて

リプレイス前に使っていたライブラリは「JSQMessagesViewController」という名称のものです。

github.com

2016年頃まではチャットアプリでごく一般的に使われていた有名なライブラリです。
こちらのライブラリですが2016年に大体の開発が終了してしまって2017年1月で完全に開発がストップしてしまいました。

f:id:qed805:20190929184418p:plain
github_commit_log

現在は非推奨となっています。
レアジョブアプリはライブラリ管理でcocoapodsを採用しているため、ターミナルでpod installをした際にこのライブラリが非推奨というワーニングが表示されます。

f:id:qed805:20191014183045p:plain
depricated_JSQMessagesViewController

今はチャットライブラリで有名なものとして「MessageKit」というOSSがあります。
チャットアプリを開発する場合は自作するかこちらのライブラリを使うことが一般的になっています。

github.com

今回はこの「JSQMessagesViewController」からの脱却をメインに書いていきます。

リプレイスするきっかけと足枷になったこと

本当はすぐにでもJSQMessagesViewControllerを脱却したい気持ちがありました。

その理由を挙げるだけでも

  • 2017 年から公式が非推奨
  • 公式からのサポートが得られない
  • 事業的にリファクタリングよりも新規機能の開発が優先
  • リファクタリングのコストを支払っても利益が出ないため報われない
  • リプレイスにかかるコスト(工数見積が定かではない)
  • iOSのライブラリ管理ツールである「CocoaPod」からdepricatedというワーニングが表示

などの要因がありました。
また、当社にはカスタマーサポートの部署があり(以下、CSと省略します)、CSよりユーザー様から
「講師側から長い文章が送信されると最後の1行が途切れている」という問い合わせを受けていました。

f:id:qed805:20191014184124p:plain
最後の1行のメッセージの空白

この問題に対して臨時対応を5月頃に実施して解消されているはずでしたが今年8月にも別のユーザー様から同じような問い合わせを受けてしまいました。

そのため使っていただいているユーザー様のためにもできるだけ早くこの問題の根本原因を解消しなければならないと思い、
チームのタスク的にも8月までに必要なタスクを終えて9月は1ヶ月丸々リファクタリング期間を頂いたのでこれを機会にチャットUIライブラリを差し替える業務に本格的に着手することにしました。

リプレイスする上でのツラミ

実際にライブラリのリプレイスをすると決意してからが大変です。
今回のライブラリは「レッスンルーム」に直接影響を与える箇所ですのでデグレに気をつけなければなりません。
その他、個人的に感じたリプレイスする上でのツラミは

  1. 開発メンバーに申し訳ない感
  2. iOSのキーボードが意図通りに表示してくれない
  3. 差し替えたあとにiPad横画面でデグレが起きる

という三点でした。

それぞれ解説していきます。

開発メンバーに申し訳ない感

こちらはリプレイス云々とは関係ありませんが事前に工数見積をしていても全てが事前に見積もれる訳ではありません。
特に今回のようなレアジョブアプリのメイン機能である「チャット」のデザインだと寧ろデザイン崩れやデグレが発生している方が問題になります。
つまり既存仕様を全て正確に新しいライブラリで再現する必要がでてきます。
ただしどうしても新しいライブラリで「再現できない機能」はチームメンバーやプロダクトオーナーに相談して捨てることは可能だと思っています。

デグレ」と「捨てて良い機能」の定義はタスクや機能によって違いますが、
今回の定義では「事前に把握しているかどうか」です。

それはそうとして話しを戻しますが
今回のような見え方や挙動がだいたい同じデザインだと、作業中も私の中ではタスク全体として「達成感」はあまり感じられませんでした。
着手前と着手後で表向きとしては成果物が「同じ」ですので事業にインパクトを直接与える作業ではないのであまり楽しくなかったんですよね。

なので自分が楽しくないことにひたすら挑戦していたので(おまけに事業の売上に貢献していないことも含めて)
メンバーにその感覚が伝わってそうでリプレイス中はずっとメンバーに申し訳ない気持ちで一杯でした。

このツラさを解消できるKPTでいうところ、「Try」があればいいなと思いました。
そのためチーム全体が楽しくレガシーコードと向き合える方法があればリファクタリングが楽しいものになるんだろうなと思いました。

  1. iOSのキーボードが意図通りに表示してくれない

後述する内容ですがリプレイス先の「MessageKit」のInputBarAccessoryViewがうまく意図通りに動いてくれなかったため、全ての挙動を既存仕様に合わせることが難しかったです。
特にキーボードの表示・非表示の制御がiPhoneiPadに関わらず大変で着手中ずっとキーボードの制御に苦しめられました。
レアジョブアプリではチャットのviewがメインのViewControllerにCotainerとして乗っている設計でchildViewControllerになっています。

(main) RoomViewController > MenuViewController > ChatViewController (child)

という設計になっています。

この場合は ChatViewController で MessageKit のInputBarAccessoryViewを表示しようとすると初期表示時にInputBarAccessoryViewが画面外に隠れてしまう現象が起きます。

f:id:qed805:20191014193557p:plain
InputBarAccessoryViewが画面下にあるので表示されない

このような問題にも対応しなければなりませんでした。

念の為、この問題を解消するのに参考になったページを張っておきます。

github.com

github.com

  1. 差し替えたあとにiPad横画面でデグレが起きる

最後のツラミとして、今年5月頃に私が開発したものですがiPadのレッスンルームを横画面にも対応したのですが、MessageKitがそのあたりもいい感じに補正してくれると期待していたところ見事にそれを裏切ってくれました。

iPhoneでだいたい既存の同じ挙動になることを確認してからデグレ起きなかったらいいなと淡い期待を持っていましたが、

単純にJSQMessagesViewControllerからMessageKitに差し替えてもiPadを横画面にすると既存と全く同じ挙動にならなかったのです。
ライブラリリプレイスの本実装の調査前の段階である程度工数見積をしましたが、
iPad横画面ではその当時確認していませんでした。できなかったこともありますが。
そのため実際にこれを改修する前にデザインが崩れてしまう現象のパターンを洗い出して再度工数見積を行いました。

着手前に見積もっていた工数も残りわずかというか使い切ってしまいましたので、
恐怖に思いながらiPad横画面でのデグレ箇所の工数見積をしていました。

想定外のデグレ工数はメンタルに良くないですね。

実際のリプレイス作業

ということで長々と書いてしまいましたが、ここで実際にライブラリをリプレイスしたときに行った手順を復習します。

ライブラリ自体の調査と挙動の調査 (工数見積まで)

  • アプリの既存の動きの調査
  • MessagesKit自体のデザインの調査
  • MessagesKitがどこまで柔軟に対応できるか
  • 試しimport でどれだけのデグレが発生しているか

実際にライブラリをimportする (実際に着手開始)

  • MessageInputBar が使えず、InputBarAccessoryViewが必要
  • どのバージョンのInputBarAccessoryViewを使えばいいのか情報が少ないのでその調査を行う

そのためcocoapodのPodfileは下記のようにInputBarAccessoryViewをimportしました。

  pod 'MessageKit'
  pod 'InputBarAccessoryView', '4.2.2'

ハマリポイントの改修 (想定外の対応)

  • ChildViewControllerでは初期表示時にInputBarAccessoryViewが表示されない
  • レッスンルームを一つのViewController で管理できるかの調査 (既存設計を大きく変える方法の調査)
  • メインのViewController で becomeResponder()を読んでinputBarを意図的に表示させたときの調査 (既存設計を踏襲する場合の調査)
  • iPad横画面でのデグレの対応

上記のような流れになりました。

レガシーコードと向き合った感想と気をつけるべきこと

今回はレガシーコードではなくライブラリのリプレイス作業について解説してみました。
新規事業だとガンガン突き進めて事業にもインパクトを与えられますがレガシーなものを新しいものに書き換えるようなリプレイス作業は見た目が変わらないので作業していてもなかなか辛い部分がありました。

ですがレガシーコードは綺麗にせずにそのままにしておくと将来の負債となったりメンテナンスできなくなって「ゼロから作り直し」になったりする非常にセンシティブな部分でもあったりします。
現場によってはプロジェクトのソースコードを「1から作り直し」になってしまった所もあるのではないでしょうか。
モバイルアプリは最初の1,2年は開発していてとても楽しいですがさらに長く運用していると様々な要因で昔のレガシーコードが影響して開発スピードが著しく遅くなってしまう傾向がありますね。

またAppleGoogleSDKが年々新しくなって昔のソースコードがいきなり非推奨になったりします。
なので、時間がある時にできる限りソースコードを綺麗にして保守性を上げる開発体制が一番安全かなと思いました。

今回のチャットUIを新しくしたことでレアジョブアプリを使って頂いているユーザー様により快適にレッスンルームをご利用頂けると思うと開発者として報われる気持ちになりますね。

ということで長文になりましたがぜひレッスンルームを使って頂ければと思います。

10月25日「Global Engineer Night vol.1 Mercari x Quora x RareJobが考えるグローバルエンジニアの条件とは?」を開催します !!

こんにちは、レアジョブ 技術本部副部長 の @jumboOrNot です。

f:id:rj_tech_dept:20191017104430p:plain

10月25日「Global Engineer Night vol.1 Mercari x Quora x RareJobが考えるグローバルエンジニアの条件とは?」を開催します !!

Global Engineer Night vol.1とは

グローバル化の波は押し寄せており、日本と世界との垣根はどんどん下がる中、エンジニアにも国内外で活躍する場が増えています。Global Engineer Night (GEN)では、「日本でも海外でも垣根なく活躍できるエンジニアには、どのようなスキルセットが備わっているのか?」をテーマに、業界著名人をゲスト講師として招き、パネルディスカッションや交流会を開催します。

10月25日イベント概要

日時:2019年10月25日(金)19:00〜22:00 場所:東京都港区六本木6-10-1六本木ヒルズ森タワー18F 人数:60名(増枠しました!) 参加費:無料 詳細・お申込はconnpassのイベントページより。

どんなイベント?

日本と海外で要求されるスキルに違いはあるか? 英語の壁をどうやって乗り越えるか? エンジニアが世界で戦うためにはどんな準備が必要か?

などなど、普段なかなか聞けない本当にグローバルで活躍するために必要なことや、悩みをパネルセッションで聞くことができます。 今回は 広木さんをモデレーターにお迎えして、グローバルに活躍するMercari x Quora x RareJobの三社がいろいろな質問にお答えします。 当日は弊社エンジニアもスタッフとして参加したりしているので、懇親会でも是非お話しさせていただければと思います。

開催に向けて

グローバルキャリアってなんなんだ!そんなことを考えながら日々生きている私ですが、「海外で働く」「海外の人と働く」「海外向けのサービスを作る」等どんな形でも必要なのは英語力、、、だけじゃなくていろいろなスキルやマインドセットが必要だと私自身グローバルな企業で働きながら感じています。 うまく言語化できないこのハラハラやワクワク感みたいないろいろな感情をすごい勢いで乗り越えてきたであろう豪華パネリストの皆様から聞けるのは一参加者としてもとても楽しみです。

お待ちしております!

gen.connpass.com

デザインチームの運用をワークショップ形式で洗い出してみた

関東に台風が向かっております。 そのためコロッケを急いで買いに行かないといけないのですが、当番なので急いで書きます。

技術本部の副部長兼、デザインチームのリーダーのジャンボです。

皆さんは普段からの運用・作業の改善作業をどうやって洗い出しますか? 思いついても優先順位や難易度が読めずに結局着手できなくなっていませんか?

そんな時にオススメのやり方があります。

  1. ふせんかstormboardを用意する
  2. カテゴリ別に課題を洗い出す
  3. みんなで相談しながら優先度・効果のマトリクスで整理する

です。

早速ですが今回デザインチームでやってみた結果が以下です。(ちょっとぼかしてます)

f:id:jumbos5:20191011162100p:plain

赤ピンが上期で解決したものです。

エンジニアとの責務の分割や、サービスに対するUXに対するガイドラインなど解決が時間がかかりそうなものが右上に寄っています。一方でなんとなくルールはないけど、やったほうがいい・決めたほうがいいものなどは比較的すぐ実行でき効果が高いことがわかったので右下に整理されました。

最初は基準となるようなタスクを配置して、そのタスクとの相対的な位置をイメージして進めていくと進めやすいです。 これを作り右下から進めていくことで、チーム内での課題と優先度、そして効果のすり合わせをしながら良きデザインチームになっていければと思います。

www.wantedly.com

こういったプロセスをもっとよくしたい、もっと改善したい人を弊社では絶賛募集中です。

それではベランダのハーブが心配なので定時ダッシュでドロンします。 皆さんもplease keep safe.

EC2 Auto Scalingを導入する際のポイント

f:id:shino8383:20191004131442p:plain

おはようございます。レアジョブDevOpsチームのshinoです。

 

世間では消費税増税だとか軽減税率だとか話題になっています。

特に軽減税率は複雑ですよね。

私は考えることをやめました。 

 

さて、私は普段AWS上でレアジョブのシステム基盤に関わる業務を行っています。

AWSに移行した話

appeal.rarejob.co.jp

 

現在は、運用コストの削減、信頼性の向上、パフォーマンス効率の向上などの改善を主に行っています。

AWS上でアーキテクチャの設計や運用を考える際には、どのような点に気をつける必要があるのでしょうか?(突然の問題提起)

AWS上での設計や運用に関するベストプラクティスをまとめたAWS Well-Architected Frameworkなるものもありますが、こちらは非常に概念概念していて

「具体的にどうすれば?」

となる方も多いと思います。僕はなります。

 

今回はAWS上でのパフォーマンス効率化、特にEC2 Auto Scalingを導入する際にポイントとなることを言語化したいと思います。

 

 

EC2 Auto Scalingとは

Doc: EC2 Auto Scaling

端的に言えば

 

EC2インスタンス

リソースの使用状況に合わせて

自動で水平スケールする

 

サービスです。 

f:id:shino8383:20191004110903p:plain

他にも手動でのスケールやスケジュールベースのスケールもできますが、Auto Scalingを使う一番の恩恵は需要に合わせて自動スケールする機能だと思います。

 

すごく素敵なサービスに思えますが、無条件でAuto Scalingを導入できるわけではありません。

EC2 Auto Scalingを導入するためにポイントとなるアーキテクチャ設計があります。

 

EC2 Auto Scailing導入のポイント

既存のEC2クラスターにAuto Scalingを導入する際に気をつけることが大きく2つあります。

 

  1. インスタンス間の差異を無くす
  2. クラスターごとにエンドポイントを設ける

インスタンス間の差異を無くす

どういうことかというと

f:id:shino8383:20191004111738p:plain

 

AとBで設定に差があったらだめ、ということです。

・・・当たり前といえば当たり前なんですが。

 

例えばAはスレーブDB1を、BはスレーブDB2を直接参照しているような設定になっているとAuto Scalingできません。

自動で起動終了されるインスタンスは同じAMIから作られるので、同じクラスター内の既存のインスタンス間で差異がある場合は、差異がなくてもアプリケーションとして正常になるように改善する必要があります。

逆に言えば、アプリケーションの動作に関係ないcronが特定のインスタンスで動いていてそのインスタンスは消したくない、などという状況であればインスタンス間の差異があってもAuto Scalingの導入はできます。

その場合は、インスタンス保護を用いたり、Auto Scalingのインスタンス終了設定の「新しいものから消す」という設定と、最低起動台数の設定を組み合わせることで、既存のインスタンスを終了させずに保つことができます。

 

スケーラビリティを獲得するためにインスタンスをステートレスにしましょう。

 

クラスターごとにエンドポイントを設ける

ELBを使ってクラスターを形成していたらエンドポイントが既にあるはずなので、これも当たり前のように思えます。

ここで大事なのは、スケーラビリティを獲得するために意識的にエンドポイントを作る必要があるということです。

 

f:id:shino8383:20191004120724p:plain

 

 

例えば、APIがスレーブDBを参照する場合を考えます。

この場合、スレーブDBのエンドポイントを設けていれば全てのAPIインスタンスはそのエンドポイントを参照すればいいので、APIインスタンス間で設定に差異は生まれません。

しかし、エンドポイントを設けていない場合、特定のDBインスタンスを参照することになります。

APIインスタンスごとに特定のスレーブDBを指定するような設定を行えば、APIインスタンス間に差異が生まれ、Auto Scalingを適用することができなくなります。

 

また、一般的に、エンドポイントという抽象的なものに比べて、特定のDBインスタンスという具体的なものの方が変更の影響を受けやすいです。

つまり、変更される可能性が高いものに依存するということは、それだけ依存する側も変更を加える必要があります。

スレーブDBの台数を増やす場合などを考えると運用コスト的にもつらいことが想像できると思います。

 

Auto Scalingを用いることでインスタンスが勝手に増えて勝手に減るので、その変化の影響を受けない疎結合な依存関係を作る必要があるということです。

 

クラスター間の依存関係を作る際は、より抽象的なもの=エンドポイントに依存させることで、ステートレスな変更容易性を獲得し、疎結合アーキテクチャを実現させましょう。

 

あとがき

今回はEC2 Auto Scalingの導入に関して、アーキテクチャに必要なことをざっくり言語化しました。

導入する際は、どのAMIを使うか、どんなメトリクスをどんな閾値でトリガーとするかなどまだ考えなければいけないことはありますが、それはまたの機会に。

 

我々はこれからもAWS上での設計・運用のベストプラクティスを目指して邁進して参ります。

そんなチャレンジを一緒にして頂ける仲間を募集しております!

こちらからどうぞ

採用/求人情報 | アピール | 未来の教育を作る人のマガジン インフラエンジニア(AWS)

RareJobでのプロジェクトと英語の必要性について考えてみた

こんにちは。
サービス開発チームのすずきです。 RareJob(以下RJ)では弊社のメインサービスであるRareJob英会話のバックエンド開発を行っております。 最近の投稿では技術的内容が多いですが、 たまには弊社でどんなプロジェクトがあるのか知っていただき少しでもRJに興味を持っていただけたらと思います。
また、RJ採用サイトでも弊社エンジニアについて知っていただけるので ご興味あればご覧ください🙇‍♂️

RareJobでのプロジェクトって?

RJでのプロジェクトにはどんなものがあり、どのような進め方をしているのでしょうか。

  • 英会話サービスを展開しているから、みんなバリバリ英語を使ってコミュニケーションをとってるのでしょうか?🤔
  • 色々な国を跨いでプロジェクトは進められるのでしょうか?🤔

今回は私が参画しているプロジェクトに関してお話しさせていただきます。

本題

現在私が参画しているプロジェクトですが、以前プレスリリースした米国発のEdTechサービス「Voxy(ヴォクシー)」と連携 | 株式会社レアジョブになります。
Voxy社とはニューヨークに本社をもち、RJと同様に英語のeラーニングを提供している企業です。 世界150カ国以上😳に渡ってサービスを展開しており、RJにはなかったアクティビティを通じて学べる教材を提供しています。

今回のプロジェクトの目的は、

Voxyが提供する教材をRJの生徒様にシームレスに利用していただき
 Voxy社の教材を自主学習(インプット)→ RJのレッスンでアウトプット

という学習サイクルにて学習定着率を高めていただくことを目的としています。
外部のインプット教材を利用し、インプット教材に対応したスピーキングレッスンをRJが独自で開発するという RJでは初めての取り組み となります。

英語はやっぱり必要なのか?

いつくもの国を跨いでサービスを展開しているVoxy社ということで国籍は様々。
NY、ブラジル、シンガポールと様々な拠点とコミュニケーションをとって日々の開発は進められます。
やり取りの共通言語は英語になります。悲しくもここでの共通言語は笑顔ではなく英語です♪ 私自身英語でのコミュニケーションは得意ではないのですが、周りのメンバーに支えられてVoxy社との開発を進めています。 メンバーの英語力はそれぞれですが、英会話サービスを展開している弊社にジョインするからには英語の必要性は理解しており、 英語でのコミュニケーションに自信はないけれども積極的にチャレンジするメンバーには周りがサポートするような環境もあります💪

もちろん、英語はできる人に任せてオレはバリバリ開発するぜ〜っていうメンバーもいるので、 絶対に英語が必要というわけではないですが、いざという時にチャレンジできる気概があるとより良いという感じでしょうか。

(おまけ)英語よりも大切なこと

ここからポエミータイムですが、 こんな感じでRJのフィリピンメンバーやVoxyとの開発を進めいていく中で英語よりも大切なことは多様性を受け入れることなんじゃないかなと感じます。 活動時間も違うし、働き方も違うし。仕事の進め方も考え方も違います。
自分たちと違うことに対して抵抗感を持つのではなく、 そういうやり方なのだと理解して共生していく方法を探せるかが多国籍なプロジェクトでは求められる気がしました。

最後に

私が携わっているプロジェクトを簡単に説明させていただきましたが、 少しでもRJを知っていただき、興味を持っていただけたでしょうか☺️
RJでは生徒様へ今までとは違った新しい学習体験の提供にチャレンジしております。
そんなチャレンジを一緒に邁進してくれる技術でも英語でもおまかせあれエンジニアの方を募集しております!

こちらをチェケラください🤞
採用/求人情報 | アピール | 未来の教育を作る人のマガジン サーバサイドエンジニア

Android Qの折りたたみ式デバイス対応を試してみた話

ネイティブアプリ開発を担当している杉山です。 今月上旬ついにAndroid 10がリリースされたということで、そのことについて書いていこうと思います。

環境

AndroidStudio 3.5

AVD: 7.3 Foldable API 29 Android 10.0

*画面開閉を擬似的に行うには、AVDの横に表示されるメニューの画面開閉ボタン?を押してください。

f:id:r_sugiyama:20190919131044p:plainf:id:r_sugiyama:20190919131046p:plain

画面比率を意識

折りたたみデバイスでは、画面開閉時などに画面比率が変化します。

画面比率の問題をクリアするためにマニフェストファイルにmaxAspectRaitoまたはminAspectRaitoを記述しましょう。

maxAspectRaitoは、サポートできない画面比率がある場合などに用います。 またminAspectRaitoは、最小アスペクト比を設定します。

*minAspectRaitoは、10進数形式で最小アスペクト比を設定します。

*minAspectRaitoは、下記「マルチウィンドウを意識」に記述した「resizeableActivity=true」との併用はできません。(記述は可能ですが、属性が無視されます)

マルチウィンドウを意識

マルチウィンドウモードでもアプリがスムーズに動作するよう、マニフェストファイルにresizeableActivityの設定をしましょう。

resizeableActivityにtrueを設定することにより、折りたたみデバイスを含むアプリの動作環境との互換性を高めることができます。 また、resizeableActivityにfalseを設定することにより、マルチウィンドウモードを無効化することができます。

リソースへの排他的アクセスの対処は「onTopResumedActivityChanged」を利用しましょう。

こちらのコールバックメソッドは、アクティビティの再開状態を得た場合もしくは失った場合に呼び出されます。

主にマイクやカメラなどの単一ユーザーの共有リソースを使用している場合に、この情報を確保しておくことが重要となってきます。

まとめと余談

折りたたみ式スマホ(フォルダブル)の対応は、基本的に画面比率とマルチウィンドウを意識すること、 その中でリソースが欠落しないかを確認することが主なようです。

個人的には、画面の回転対応やアプリのマルチウィンドウ化の延長線のようなものだと感じました。

ほかにもAndroid Qから様々な要素が追加されているので、色々と試してみたいと思います。

Android Qの正式名称がAndroid10になり、お菓子のコードネームがなくなって少し寂しい…