少しずつキャッチアップしていくAndroidアプリ開発
あるあるLT	#13	@	オンライン
2020/11/04
Fumiya	Sakai
自己紹介
・Fumiya	Sakai
・Freelance	App	Engineer
アカウント:
・Twitter:	https://twitter.com/fumiyasac

・Facebook:	https://www.facebook.com/fumiya.sakai.37

・Github:	https://github.com/fumiyasac	

・Qiita:	https://qiita.com/fumiyasac@github
発表者:
・Born	on	September	21,	1984
これまでの歩み:
Web	Designer
2008	~	2010
Web	Engineer
2012	~	2016
App	Engineer
2017	~	Now
iOSのUI実装本を執筆しています!
少しの工夫で実現できるTIPS集 ライブラリ表現の活用集
書籍に掲載したサンプルのバージョンアップや続編等に現在着手中です。
過去に技術書典8で電子版だけ頒布した書籍紹介
Vol.1及びVol.2に頒布したものの中で書籍に載せきれなかったものを紹介
第1章:	メディアアプリ型のUI	
第2章:	構造が複雑な写真表示UI
記事一覧を無限スクロールする様な形のアプリ
UIを一覧/詳細表示を簡素化した実装を紹介。
現在はBoothにて販売中です! https://booth.pm/ja/items/1835468
¥1,000	-	iOSアプリ開発「UI実装であると嬉しいレシピブック	まかない編」
サンプルコード:	https://github.com/fumiyasac/meals_ios_ui_recipe_showcase
第3章:	Combine	+	UICollectionViewCompositionalLayout
タイル状のフォトギャラリーや一覧表示型のア
プリUIでライブラリを活用した実装を紹介。
実務でも利用&考察したもの
特に第1章と第2章の内容に関し
ては、実際に相談されたり、実
装アイデアとして活用する機会
があったものになります。
	全てUIKitを利用
新たに技術書典9で電子版だけ頒布した書籍紹介
表現や動きが特徴的でユーザーにもほんの少し遊び心を与える様なUI実装を紹介
現在はBoothにて販売中です! https://booth.pm/ja/items/2360379
¥1,000	-	iOSアプリ開発「UI実装であると嬉しいレシピブック	おもしろ編」
サンプルコード:	https://github.com/fumiyasac/meals_2nd_ios_ui_recipe_showcase
実務導入前の検証段階
若干一癖がありそう、ぱっと見
だと実装の方針が立ちにくい感
じに見受けられそうなUI実装や
構造に関して考察しました。
	UIKit	&	SwiftUIを利用
第1章:	面白い表現のフォトギャラリーUI	
第2章:	画面ロック機能を利用したUI
UICollectionViewを活用したユニークなレイア
ウト表現と画面遷移カスタマイズ実装を紹介。
第3章:	SwiftUI	+	OSS	Libraryの活用
SceneDelegateの機能や端末認証を利用した画
面ロック機能を盛り込んだ実装を紹介。
今年の5月末よりAndroidアプリ開発もするように
Javaは過去に経験はあったけど、Androidアプリ開発は今回初めて
参考:	比較的軽めのタスクをこなしながらキャッチアップ期間を過ごした時の記録

https://note.com/fumiyasac/n/nec1c3c80f12d
Webエンジニアをしていた際に業務経験としてはあるんだけどもKotlinに触れているわけではなかった。
1.	過去にSpring(Java)等は経験はあったけど…
ざっくりとしたAndroid側の知識はあれどもネイティブアプリ側の開発経験はほぼ皆無といっても良い。
2.	過去にReactNativeを触っていた際にAndroid側に触れたことは少しあったけど…
個人的に「共通点と相違点を見つけながら」という部分にフォーカスを当てて進めていました。
いきなり触るのではなく自分なりにコードにおける大事な部分を言語化しながら読み進めていく。
3.	最初はiOS側の開発と並行しながらAndroid側のコードも読む時間を取る様にする。
基本的には予習と実践の2段構成
(1)	Server	Side	Kotlinでまずは自分なりに練習
簡単にAPIサーバーを立てて試してみようというところから始める
Kotlinそのものに触れる機会を業務外でも持つ
まずはKotlinの書き方そのものに慣れる&Layered	Architectureの基本を知る
iOSアプリサンプル実装で利用するバックエンド用のAPI通信サンプルを元に実装する
自分が経験のある技術スタックからヒント	→	Laravel	/	Rails
Language:
Framework:
Middleware:
Infra:
POST処理実装
テストユーザー作成・認証
GET処理実装
DB格納表示データ返却
Server	Side	Kotlin	+	Spring	Bootのコード例(1)
簡単に責務を分離した状態でDB側とのやり取りをする処理
@Repository

interface	ItemRepository	:JpaRepository<ItemEntity,	Int>	{

	 @Query(value	=	"SELECT	*	FROM	items	ORDER	BY	id	ASC	LIMIT	:limit	OFFSET	:offset"	,	nativeQuery	=	true)

	 fun	selectItemPerPage(@Param("limit")	limit:	Int,	@Param("offset")	offset:	Int):	List<ItemEntity>

}
@Service

class	ItemService	{

				@Autowired

				private	lateinit	var	itemRepository:	ItemRepository

				fun	findListPerPage(limit:	Int,	offset:	Int):	List<ItemEntity>	{

								return	itemRepository.selectItemPerPage(limit	=	limit,	offset	=	offset)

				}

}
@Entity

@Table(name="items")

data	class	ItemEntity(・・・MySQL側のカラム構造と合わせた構成にする・・・)
「Entity	⇆	Repository	⇆	Service」の3層構成
Entity: DB格納内容とのMapping
Service: RepositoryのSQL処理との仲介
Repository: ライブラリJPAを利用してSQLを組み立てる処理
Server	Side	Kotlin	+	Spring	Bootのコード例(2)
実際にJSONの形式でデータを返却するための処理
@RestController

@RequestMapping(“/api/v1")

@Api(description	=	"iOSアプリトップ画面アイテム一覧に関するエンドポイント(表示コンテンツ)")

class	ItemController	{

	 private	val	LIMIT_PER_PAGE	=	9

	 @Autowired

	 private	lateinit	var	itemService:	ItemService

	 @GetMapping("/items")

	 fun	findListPerPage(@ApiParam(value	=	"ページ番号",	required	=	false)	@RequestParam(required	=	false,	defaultValue	=	"1")	page:	
String):	ItemListResponse	{

	 	 val	currentPage	=	page.toInt()

	 	 if	(currentPage	<	1)	{	throw	BadRequestException(“パラメーターの値が不正です。")	}

	 	 val	hasNextPage	=	(currentPage	*	LIMIT_PER_PAGE	<	itemService.findAllCount())

	 	 val	offset	=	(currentPage	-	1)	*	LIMIT_PER_PAGE

	 	 val	items	=	itemService.findListPerPage(limit	=	LIMIT_PER_PAGE,	offset	=	offset)

	 	 return	ItemListResponse(result	=	items,	currentPage	=	currentPage,	hasNextPage	=	hasNextPage)

	 }

}
実際にAPIレスポンスを返却するController部分
Annotationの理解: 結構最初は取っ付きづらい部分
Pagination処理: Service層へ必要なものを送る
(2)	あれ、感覚が似ているかもしれない…?
コードの書き方の部分や設計に関する細かな部分での類似点に触れる
①
GUIを利用したレイアウトの作成について(1)
AutoLayout(iOS)	&	ConstraintLayout(Android)を見てみる
10
24
24
10
CenterX:280
CenterY:200
相対的な位置関係の調節を
コードまたはGUIで実装
<androidx.constraintlayout.widget.ConstraintLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content">

				<View	

								android:layout_width="0dp"

								android:layout_height="wrap_content"

								app:layout_constraintTop_toTopOf="10dp"

								app:layout_constraintBottom_toBottomOf="10dp"

								app:layout_constraintStart_toStartOf="24dp"

								app:layout_constraintEnd_toEndOf="24dp"	/>
contentView.addSubview(childView)

childView.snp.makeConstraints	{	make	in

					make.top.equalToSuperview().offset(10.0)

					make.right.equalToSuperview().offset(24.0)

					make.left.equalToSuperview().offset(24.0)

					make.bottom.equalToSuperview().offset(10.0)

}
contentView.addSubview(childView)

childView.snp.makeConstraints	{	make	in

					make.centerX.equalToSuperview()

					make.centerY.equalToSuperview()

					make.height.equalTo(200.0)

					make.width.equalTo(280.0)

}
<LinearLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content"

				android:gravity="center_horizontal"

				android:orientation="vertical">

				<View

								android:layout_width="280dp"

								android:layout_height="200dp"	/>
iOS:	AutoLayout	(with	SnapKit)
Android:	ConstraintLayout	&	Gravity
①	相対配置
②	中央寄せ
①
②
②
GUIを利用したレイアウトの作成について(2)
UIStackView(iOS)	&	LinearLayout(Android)を見てみる
UIStackViewの内部にXibで切り出したりコードで
作成したView要素のクラスを追加する。
iOS:	UIStackView
match_parent/wrap_contentで親との位置関係を
指定しorientationで横・縦方向の指定をする。
Android:	LinearLayout
レイアウトを構築する上で
も活用機会が多いView要素
Horizontal
Vertical
<LinearLayout

				android:layout_width="match_parent"

				android:layout_height="wrap_content"

				android:orientation=“vertical">

この中に各種要素やConstraintLayoutを配置

</LinearLayout>
contentsStackView.addArrangedSubview(contentView1)

contentsStackView.addArrangedSubview(contentView2)
コードでの実装例:
contentView2
contentView1
縦に長い可変の画面要素の配置や等間隔での要素
の整列時に用いる場面など結構な頻度で活用する
ConstraintLayoutとも上手に併用しながら実装
アーキテクチャの大枠をiOS/Androidで合わせる
iOS/Android間で設計思想を合わせておくことで考えやすくなると感じています
責務に適切に分割/分離することで実装が考えやすくなる。
1.	MVVM(MVP)+	Layered	Architectueの構成
共通の拠り所とできうる基準を持つことでの安心感がある。
2.	ドメイン駆動設計(DDD)の世界に触れてみる
Entity
Service
Repository
DataTransfer
Factory
UseCase
Presenter
ViewModel
Activity
Fragment
BindingModel
iOS開発/Android開発を行ったり来たりしなければいけない場合にはこの恩恵を感じる場面は多いはず。
InfraStructure
DataStore
Context
①
②①
②
iOS/Android間でも実装や機能設計の際にお互
いのコードを比較しながら参考にしやすい
View要素や画面構築の手法やライフサイクル
が違うので切り分けて考える必要がある
APIサーバーより取得したデータの内容を画面に表示する際の処理の例を考えてみる
実装方法の手法をできるだけ統一する(1)
iOS側はRxSwift	/	Android側はRxJavaを利用した処理の事例
UseCase
Presenter
Repository層で定義したAPI通信後の処理をそれぞれ定義する。(※One	Usecase	has	many	Repositories)

Repositoryの処理を実行	→	flatMapでレスポンス内容を変換	→	Single<T>	/	Maybe<T>	/	Completableに変換
Repository
InfraStructure
UseCaseで実行された処理に対してUI側で実施する処理をそれぞれ定義する。

UseCaseの処理を実行	→	Main	Threadで実行する	→	成功時	/	エラー発生時	/	処理完了時	に合わせてUI処理を実行
今回例として挙げる部分はこちら
REST	APIやGraphQLを利用してサーバー側との非同期通信を実施する基盤となる処理
非同期通信の処理結果を元にEntityに変換したり内部キャッシュに保存する処理
※	RxSwift	/	RxJavaのStreamに乗せていくイメージ
doSomethingUseCase.execute()

.observeOn(

				uiScheduler

).subscribeBy(

				onSuccess	=	{	dto	->

//	MEMO:	処理成功時の処理(Viewの組み立て)

//	→	iOS側とほんのちょっと違う部分

								view.setUpContent(

												SomethingConverter.convertToBindingModel(dto)

								)

				},

				onError	=	{	error	->

//	MEMO:	エラー発生時のハンドリング処理

				},

				onComplete	=	{

								//	MEMO:	処理が完了した際に実施する処理

				}

).addTo(disposables)
Point1:
doSomethingUseCase.execute()

.observeOn(

				mainScheduler

).subscribe(

				onSuccess:	{	[weak	self]	dto	in

								guard	let	weakSelf	=	self	else	{	return	}

								//	MEMO:	処理成功時の処理(Viewの組み立て)

								weakSelf.view?.setupContent(

												SomethingConverter.convertToViewModel(dto)

								)

				},

				onError:	{	[weak	self]	error	in

								//	MEMO:	エラー発生時のハンドリング処理 

				},

				onCompleted:	{	[weak	self]	in

								//	MEMO:	処理が完了した際に実施する処理

				}

).disposed(by:	disposeBag)
実装方法の手法をできるだけ統一する(2)
実際のコードとして実装を当てはめてみるとこのような形にできる(Presenter)
スレッドや非同期
通信時処理はある
程度は類似した形
Android:	RxJavaを利用
Point2:
iOS:	RxSwiftを利用
RxSwift	/	RxJava
での記法をヒント
にして実装する
Maybe<Dto> Maybe<Dto>
iOS/Androidで頻出のOSSライブラリを調べてみる
iOS/Androidのよく用いられているものを知っておくと結構ヒントになることも
RxSwift(Ractive	Programming),	Resolver(Dependency	Injection),	Alamofire(Networking),	SwiftyJSON(JSON	Decoder),

Kingfisher(Image	Cache),	Quick	+	Nimble	+	SwiftyMocky(Unit	Testing),	…
1.	iOS側のライブラリ例
RxJava(Ractive	Programming),	Dagger2(Dependency	Injection),	OkHttp	+	Retrofit(Networking),	ExoPlayer(Movie),

Picasso(Image	Cache),	Groupie(RecyclerView),	BubbleLayout(Tooltip),	Mockito(Mocking),	…
2.	Android側のライブラリ例
Apollo(GraphQL),	lottie(Animation),	Firebase(Platform),	Realm(Data	Storage),	JWTDecode(JWT),	…
3.	iOS/Android両方ある例
iOS開発/Android開発を行ったり来たりしなければいけない場合にはこの恩恵を感じる場面は多いはず。
(3)	Android開発における基本事項を押さえる
実務でAndroid開発を進めていく上で最低限必要そうな部分を整理する
iOS/Androidのデザインガイドラインを理解する
デザインの統一感を意識していく際にもMaterialDesignの事を知る
iOS側もデザインをMaterialDesignに寄せていく決断をした際もガイドラインと合わせて不自然にならないように注意。
iOS:	Human	Interface	Guideline Android:	Material	Design
一見すると同じ様な見た目にも見えるかもしれないが、細かな点を注意深く見ていくと実装で配慮すべき点が見えてくる。
ActivityやFragmentのライフサイクルを理解する
画面に関する実装をする場合には押さえておきたい重要な部分
Activity Fragment
できるだけ見通しをよくす
るためにシンプルにする。
Activity:
Fragment:
画面レイアウトに関する処
理はできるだけこちらへ。
どんな感じの構成になっているかの一例:
Intentによる画面遷移処理など画面クラス全体に関わるもの
Activity:
Fragment:
RecyclerViewの処理やメニュー部分など画面表示全般
※	ActivityとFragmentが1対1対応が基本型
サーバー側とのAPI通信処理に関する概要
メールアドレスとパスワードで認証処理を実行する部分に関する例
val	okHttpClient	=	OkHttpClient.Builder()

				.addInterceptor(loggerInterceptor)

				.addInterceptor(OnlyBasicAuthorizationInterceptor())

				…	途中省略	…

				.build()

return	Retrofit.Builder()

				.baseUrl(BuildConfig.SESSION_API_URL)

				.client(okHttpClient)

				.addConverterFactory(GsonConverterFactory.create())

				.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

				.build()

				.create(SessionsApiClient::class.java)
interface	SessionsApiClient	{

				@POST("v1/sessions")

				fun	login(

								@Body	body:	HashMap<String,	String>

				):	Single<SessionTokenEntityJson>

}
sessionsApiClient.login(hashMapOf(

				EMAIL	to	email.value,	PASSWORD	to	password.value

))
OKHttpとRetrofitを併用したAPI通信処理:
①	APIリクエスト実行用Factoryクラス抜粋 ②	APIエンドポイント定義
③	必要があればModule化しておく
@Module

internal	class	XXXModule	{

@Provides

fun	provideSessionsApiClient():	
SessionsApiClient	=

				SessionsApiClientFactory().create()
実際の処理をする責務ではこんな感じで利用
当該エンドポイントとの通信実行
Log出力やBasic認証に関する処理
よく利用するRecyclerViewでの実装方法(1)
RecyclerViewを利用する際に押さえておきたい部分を簡単にまとめてみる
RecyclerView:
ListViewの進化版でListViewよりも高機能(Header/Footerはない,	区切り線は自前で準備)
Adapter:
1行分のデータを1行分のViewにして生成するもの
ViewHolder:
1行分のViewの参照を保持するもの(ライブラリ:	Groupieを利用)
ViewHolder Adapter RecyclerView
LayoutManager:
DataSizeを考慮してResponsiveにLayoutを管理する
①	Layout読み込み	&	Inflate
②	表示数分ViewHolder生成
DataSource ③	1行分データ取得④	1行分取得して設定
1行できたら格納
よく利用するRecyclerViewでの実装方法(2)
画面を構成するFragmentやViewHolder1個分の要素と関係を簡単にまとめてみる
Fragment
Fragment●●Binding
fragment_xxx.xml

-	ConstraintLayout

		-	Toolbar

		-	RecyclerView
fragment_xxx.xml内に配置
した要素をIDで取得可能
配置したRecyclerViewに適用するAdapter初期化時に下記も一緒に渡す

①	ViewHolderタップ時のEventListener	/	②	BindingModel
XML内では	android:text=“@{bindingModel.name}”の様にできる
Adapter
ViewHolder
※View要素内ではbinding.bindingModelで取得
・BindingModel内のデータを元にViewHolderを生成処理を実施

・ViewHolderタップ時のEventListenerとのBindもここで行う
※ライブラリ「Groupie」を利用
view_xxx.xml

ViewHolder1個分のLayout
BindingModel View要素に表示対象のデータ
View●●Binding
※Fragment同様XMLとBinding
例)	binding.recyclerView
(4)	UI実装をAndroidで実現しようとする場合の考え方
iOSのUI実装との相違点をヒントにして処理を調べていく様なアプローチ
Androidでは標準で準備されている表現例(1)
DrawerMenuはAndroidだと標準で用意されているがiOSは別途作成が必要
AndroidではDrawerMenuが標準で実装されている
公式ドキュメントでも実装方針や方法が示されている。

https://developer.android.com/guide/navigation/navigation-ui
一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
-	ContainerViewとGestureRecognizerを利用して実現する
iOSアプリ内でDrawerMenuに近しい挙動を実現する例:

https://qiita.com/fumiyasac@github/items/eb5b17ab90f5aa27b793
ライブラリを利用して進める方針:
例)	SideMenu:

https://github.com/jonkykong/SideMenu
-	よく利用されるものなので著名なライブラリも存在する
Androidでは標準で準備されている表現例(2)
Tab付SwipeViewもAndroidでは実装方法が紹介されているがiOSは別途作成が必要
Tab	No.1 Tab	No.2 Tab Tab	No.1 Tab	No.2 Tab
AndroidではTab付SwipeViewの事例がすでにある
公式のドキュメントでも実装方針や方法が示されている。

https://developer.android.com/guide/navigation/navigation-
swipe-view

一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
-	タブ表示部分:	UIScrollView	or	UICollectionView
例)	Parchment:

https://github.com/rechsteiner/Parchment
-	コンテンツ表示部分:	UIPageViewController
ライブラリを利用して進める方針:
-	よく利用されるものなので著名なライブラリも存在する
Swipable	Page	Contents
iOSとAndroidでのUI表現の方針の違いを知る(1)
縦方向だけではなく横方向へのスクロールも考慮する様な形の画面
Androidにおける実装方針例
RecyclerViewの入れ子構造	&	適用するLayoutManagerをSection毎に変更
Section:	0	(Category)
Section:	1	(Article)
Section:	2	(Featured)
Horizontal	Scroll
Horizontal	Scroll
Grid	Layout	Pattern
val	gridlayoutManager	=	GridLayoutManager(recyclerView.context,	4)

gridlayoutManager.spanSizeLookup	=	object	:	GridLayoutManager.SpanSizeLookup()	{

				override	fun	getSpanSize(position:	Int):	Int	{

								if	(categoriesCount	<	position)	{

												return	4

								}	else	{

												return	1

								}

				}

}

recyclerView.layoutManager	=	gridlayoutManager
val	linearLayoutManager	=

				LinearLayoutManager(recyclerView.context,	LinearLayoutManager.HORIZONTAL,	false)

recyclerView.layoutManager	=	linearLayoutManager
※iOSではUICollectionViewを利用する
-	格子状に並べる表現におけるLayoutManager設定例
-	水平方向へのスクロール表現におけるLayoutManager設定例
iOSとAndroidでのUI表現の方針の違いを知る(2)
Pinterestの様に配置するサムネイル画像のアスペクト比に合わせる
Androidにおける実装方針例
適用するLayoutManagerをStaggeredGridLayoutManagerに変更
Waterfall	Grid
val	staggeredGridLayoutManager

	=	StaggeredGridLayoutManager(2,	StaggeredGridLayoutManager.VERTICAL)

recyclerView.layoutManager	=	gridlayoutManager
※iOSではUICollectionViewを利用する
-	一見すると難しそうなレイアウトに見えるが実はこれだけ
写真アスペクト比
を考慮する形のレ
イアウト表現
参考:	StaggeredGridLayoutManager

https://developer.android.com/reference/androidx/
recyclerview/widget/StaggeredGridLayoutManager
一方でiOSでは自前で実装するのはなかなか大変な実装
参考:	UICollectionViewCompositionalLayoutを利用した例

https://qiita.com/fromkk/items/475eb761fa3352829f52
従来通りのUICollectionViewの実装だとレイアウト属性を調整する形になる
iOSとAndroidでのUI表現の方針の違いを知る(3)
配置したヘッダー画像がスクロールに合わせて伸縮する様なレイアウト
AndroidではCoodinatorLayoutを活用して実装する
①	実際の実装事例紹介

https://guides.codepath.com/android/handling-scrolls-with-
coordinatorlayout
一方でiOSでは自前で実装するかライブラリを活用する
ライブラリを利用しないで独自実装を進める方針:
基本はUIScrollView等を利用してスクロールの変化量をキャッチ
してヘッダー画像に付与しているAutoLayout制約を変更する形

(UINavigationBarの変化も考慮すると結構大変な処理)
例)	ParallaxHeader:

https://github.com/romansorochak/ParallaxHeader
Streachy	Header
②	CoodinatorLayoutに関する解説

https://techblog.yahoo.co.jp/android/androidcoordinatorlayout/
iOSとAndroidでのUI表現の方針の違いを知る(4)
iOSのUITabBarControllerの様な下タブで選択画面を切り替える形の表現
≡	タイトル
Bottom	Navigation
ViewPager
Toolbar	Title
スクリーン
Androidにおける実装方針例 ※iOSではUITabBarControllerを利用する
下タブを切り替え
るとタイトル表示
が変更される
下タブを切り替え
るとスクリーン表
示が変更される
ViewPager	&	BottomNavigation
BottomNavigationの使いどころを整理する

https://qiita.com/konifar/items/d64ada9c8ce069e6d138
BottomNavigationViewとNavigationを一緒に使う

https://qiita.com/superman9387/items/d373c8bddfe2243a49a7
ViewPagerとPagerAdapterでスワイプビューを作ってみる

https://qiita.com/shira-jun/items/1c40b087b38a370c6d18
BottomNavigation(下タブ)	+	Navigationを試してみる

https://qiita.com/orimomo/items/313ce4e273fa741dddf2
Navigation	+	BottomNavigationViewでFragmentの状態を残す

https://bit.ly/3mOV5Rh
まとめ
iOS/Android開発を並行しながら進めることで感じる共通点と相違点に向き合う
1.	予習と実践の2段構成を基本にして進めていくことで見えたものがある:
UIの作り方における作法や開発で利用するプログラミング言語、それにデザインに対する考え方はもちろん違いはある部分では
あるが内部実装における設計パターン等の部分については類似点があったりもするのでそこを手がかりとする。
2.	機能や実装を実現するにあたって必要そうになる部分をしつこく調査する:
実務でのコードを読む他にもUdemyの教材等も活用して本当に基本的な部分の理解から少しずつスタートしていった。

僕の場合は「アプリにおける頻出のUI表現」と「利用ライブラリとその効用」という観点からも調査をする形にした。
iOSアプリ開発は相変わらず楽しい、そして今新しいページが追加されている感覚が自分の中にある。
3.	iOSアプリではこうするけれどもAndroidアプリではどうする?という視点で紐解く:
iOSでのUI実装の方針をヒントにしながら、Androidアプリではいかに実現するかという視点を自分は持つ様に心がけた。

特に現在携わっている業務内ではDDDでアーキテクチャが合わせてあったのでその恩恵にうまくあやかることができた。
参考資料
この他にも沢山の情報に助けられてきましたがその一部をご紹介できれば!
iOSエンジニアだし、Androidアプリも作れるでしょ?

https://speakerdeck.com/akatsuki174/iosensiniatasi-androidahurimozuo-rerutesiyo
Modernize	the	development	of	LINE	Messenger	for	Android

https://speakerdeck.com/line_devday2019/modernize-the-development-of-
line-messenger-for-android
雰囲気で理解しないAndroid	MVVM

https://allyourbase.hatenablog.com/entry/dive-into-android-mvvm
これからはじめるAndroid開発

https://speakerdeck.com/star_zero/devfest-2020
来年に備えるためにAndroidの知識を網羅する

https://speakerdeck.com/wasabeef/looking-back-on-this-android-year-in-preparation-for-next-year
ロードマップの一例
1.	Kotlin文法やAndroid開発環境
2.	Layout構築やLifecycle理解
3.	API通信やデータ永続化処理
4.	頻出Architectureへの理解
5.	頻出UI処理と伴うロジック処理
6.	UnitTest/DI/MultiModule
Thank	you	for	listening	!

少しずつキャッチアップしていくAndroidアプリ開発