SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
Android / Flutter 앱 개발의 

큰 5가지
남반석2019.12.8
차이점
가장 큰 5가지
1. 같은 코드로 iOS 릴리즈 가능하다.
2. Hot Reload 지원 => 개발 시간을 획기적으로 단축.
3. Dart 언어를 사용 (Javascript, Java를 섞어버린)
4. 안드로이드 스튜디오 외에 VS Code로 개발 가능하다. (가볍고 쾌적하
다.)
5. Android는 OS가 그리는 반면, Flutter는 Skia엔진이 그린다.
차이점
여러분의 현재 반응
오늘 주제는 가장 큰 차이점
오늘 주제는 개발의 큰 차이점
1. 첫번째차이점
크래시가 나지 않는다.
•단 Native쪽과 연동 과정에서는 크래시가 발생하기도 한다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
1.
크래시가 나지 않는다면 어떤 일이 벌어질까요?
1. 크래시가 나지 않는다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
•Widget 안에

빨갛고 노란

stacktrace 로그가 보인다.
1. 크래시가 나지 않는다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
•Rotating Error Pizza



From - Facebook Group

“Let's Flutter with Dart”
1. 크래시가 나지 않는다.
•발생한 Exception은 IDE 로그로 확인 가능하다.
1. 크래시가 나지 않는다.
•다양한 플러그인을 사용할때 

Android 채널, iOS 채널을 통해 코드가 실행되면 

Native 코드로 (Java, Kotlin, Swift) 실행이 되고, 크래시 발생 가능.



간혹 Low Level에서 크래시가 발생하기도 한다.
1. 크래시가 나지 않는다.
•Fatal signal 11 (C, .so파일 관련 에러)가 발생하면

분석, 해결이 굉장히 어렵다.
•푸시 플러그인 버그: 

https://github.com/FirebaseExtended/flutterfire/issues/125
1. 크래시가 나지 않는다.
실제 Product에서도 

크래시가 안나나요?
1. 크래시가 나지 않는다.
- Android 1건 (화웨이 기기)

DAU 250

MAU 1.5K
최근 30일 크래시
- IOS 0건

DAU 2.1K

MAU 12K

(11월에 Flutter 전환,

0.04%는 원인불명;;)
1. 크래시가 나지 않는다.
그러면 코드 오류는 

잡을 수 없나요?
1. 크래시가 나지 않는다.
Firebase에서 Crashes 필터 -> Non-Fatal로 바꾸면, 

위젯이나, 로직 등에서 발생한 에러의 File & Line을 볼 수 있다.
1. 크래시가 나지 않는다.
•장점: 사용자가 앱 사용하다가, 특정 Screen(Page)에 문제가 있어도

백버튼을 누르고, 계속 이용이 가능하다.
•“크래시가 나지 않을때”의 장단점.
•단점: 

- 금융앱 처럼 보안 절차를 철저히 해야하는 앱에서 Assert를 미리

설계하지 않으면, 크래시가 나지 않은채로 의도하지 않은 동작 가능하다.



- 앱화면에 빨간 에러코드는, 유저들에게 불안이나 잘못되었다는 느낌을

줄 수 있고, 앱을 지울 우려가 있다. => 빠르게 파악 => Hotfix가 필요하다



2. 획기적인 화면 사이의 정보 통신
2. 획기적인 화면 사이의 정보 통신
- Android에서는…
Activity - OnActivityForResult
- ListenerDialog
- ViewModel, ListenerFragment
- EventBusEtc
2. 획기적인 화면 사이의 정보 통신
Activity - OnActivityForResult
- ListenerDialog
- ViewModel, ListenerFragment
단점: 화면을 시작하고, 받는 위치가 다르다. (헤맬 수 있다.)
단점: ViewModel은 본래 View를 위한 모델 관리 용도인데,

이벤트 전달을 위해 사용/비대해질 우려.

Listener와 참조가 끊겼을때 전달되지 않음 (onRestoreInstanceState)
단점: Listener 호출 후 dismiss를 매번 수동으로 해줘야한다. (따로 호출)
2. 획기적인 화면 사이의 정보 통신
그렇다면 Flutter에서는 어떻게 하나요?
2. 획기적인 화면 사이의 정보 통신
함수
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B
Open data param
Returning data
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B Screen A
Open data 

param
Returning

data
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B Screen A
2. 획기적인 화면 사이의 정보 통신
await에서 화면이 열리고, 해당 Screen이 닫힐때까지 코드가 Block된다.

화면이 끝나고 정보를 받게되면 아래에 if (result != null) 코드가 수행된다.
2. 획기적인 화면 사이의 정보 통신
Screen B에서 데이터를 돌려줄때
Push 함수의 Return type
🍀 Android의 Intent, Bundle에 싣기위해 Serializable, Parcelable 구현

Flutter에서는 필요없음. 그냥 객체 그대로 싣고 보낸다. 메모리 주소도 동일



2. 획기적인 화면 사이의 정보 통신
•Provider 사용
•Listener를 사용 가능함 (비추천)
그 외의 방법
3. Thread 스트레스에서 해방
3. Thread 스트레스에서 해방
Android에서는…
Bitmap처리, Network처리 등을 위해
•AsyncTask (Deprecated)
•Thread, Excutors
•Rx (Schedulers.xx() series)
•Coroutine - suspend function
3. Thread 스트레스에서 해방
suspend function은 

coroutine scope 안에서 또는

suspend function 안에서 호출 가능
•Coroutine
3. Thread 스트레스에서 해방
•Flutter Future
sync, async 함수는

서로 원하는 형태로

제약없이 호출 가능.
3. Thread 스트레스에서 해방
•Event Loop이 흐름을 콘트롤, Javascript의 방식
3. Thread 스트레스에서 해방
•Async, Await 방식은 단일스레드 방식으로 동작한다는 의미.

(그러나 통신이나 이미지뷰 처리가 UI를 느리게 하지 않음)

•Parallel 하게 여러 작업을 동시에 수행하려면 

Isolate를 사용하면 된다.



https://medium.com/flutter-community/flutter-dart-async-concurrency-
demystify-1cc739aaae57

http://jpryan.me/dartbyexample/examples/isolates/
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Android 에서는…
1. Java, Kotlin으로 커스텀뷰 코드 작성
2. attrs.xml 안에 속성 추가
3. Java, Kotlin에서 코드로 attrs 파라미터 추출
4. 코드로 뷰 동적 생성할때를 위해 생성자, 또는 setter생성
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Write attrs.xml



Extract from attrs
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
왜 이렇게 해야하죠?
=> 레이아웃을 xml로 그리기 때문
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
왜 xml로 해야하죠?
=> 화면 레이아웃 작성할때마다

빌드를 하면 개발이 늦다. (미리보기가 필요)
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
본래 View는 Java 객체
XML로 인해서 불필요한 과정이 생겼다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
=> Android Compose 개발중

https://developer.android.com/jetpack/compose/tutorial
그럼 Flutter에서는?
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
필요한
필드 & 생성자
정의
각 필드에 원하는 변수들을 배치. (Primitive, Enum, Object, Function, Widget)

MVVM 처럼 data가 binding되고, 

setState 함수를 통해 값이 바뀌면 알아서 갱신(Build)이 된다.



개별 변수 Observing은 아니지만, 오히려 심플하다.

각 Observable을 관측하는 Observer만 갱신하는 것은 성능상 이점이 있지만,

개발자, 코더 입장에서는 개별적인 변화와/ Observing 여부에 신경쓰고 setValue가 제대로 

호출되었는지 확인하는 불편함이 있는데, 

Flutter에서는 그런 불편함이 사라진다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Hot Reload
Value

Logic 

Layout
Animation
모든 변경을
1초만에
확인 가능하다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
5. 쉽고 직관적인 Animation 처리
Android 에서는…
5. 쉽고 직관적인 Animation 처리
=> 단일 뷰 Animation은 쉽지만, 주변 레이아웃이 같이 변한다면

좀 골치가 아파진다.
1. Animation을 수행할 View를 찾는다.
2. View의 transitionX, alpha, scale의 타겟값을 세팅
3. Duration 세팅
4. Interpolation 세팅
5. start() 함수 수행
그래서 Android 에서는…
1. Constraint Set 변경 - AutoTransition







2. Android Studio 4.0 Motion Editor 개발중
=> 똑같은 Xml을 여러벌을 준비하거나,

코드로 Constraint를 동적으로 변환한다.
5. 쉽고 직관적인 Animation 처리
Flutter에서는?
5. 쉽고 직관적인 Animation 처리
Animation WidgetsImplicit
5. 쉽고 직관적인 Animation 처리
Implicit ?
Implicit Intent: 목적 Targeting만 하면 알아서 동작
5. 쉽고 직관적인 Animation 처리
5. 쉽고 직관적인 Animation 처리
visibleFraction이 60%일때 chartSize = 150이 set

자동적으로 차트막대가 커지는 애니메이션이 시작된다.
Implicit animated widgets - 다양한 기본 위젯들 탑재
https://www.youtube.com/watch?v=IVTjpW3W33s
5. 쉽고 직관적인 Animation 처리
물론 Explicit animation도 지원한다. (Animation Controller)
Let’s subscribe

Youtube Flutter Channel
그러나 웬만하면 Implicit Animations로 구현 가능하다.
5. 쉽고 직관적인 Animation 처리
UI 개발 Framework 끝판왕
Android / Flutter 앱 개발의 큰 차이점 5가지를 통한 

Flutter 총평:
감사합니다.



더 궁금한것이 있다면

=> bs.nam@lawfully.com
자료 및 이미지 출처:
•https://github.com/flutter/flutter/issues/17112
•https://www.jagranjosh.com/articles/relations-and-functions-iit-
jee-important-questions-and-preparation-tips-1455106528-1

•https://medium.com/flutter-community/flutter-threading-
5c3a7b0c065f

•https://www.youtube.com/watch?v=IVTjpW3W33s
•https://medium.com/flutter-community/flutter-dart-async-concurrency-
demystify-1cc739aaae57

•http://jpryan.me/dartbyexample/examples/isolates/

Contenu connexe

Tendances

Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화QooJuice
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyunjaeyunjeong1
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipelinechangehee lee
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)Sukwoo Lee
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxTonyCms
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnGuerrilla
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
Build web applications using google flutter
Build web applications using google flutterBuild web applications using google flutter
Build web applications using google flutterAhmed Abu Eldahab
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해중선 곽
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 
Customize renderpipeline
Customize renderpipelineCustomize renderpipeline
Customize renderpipelineAkilarLiao
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
Everything about flutter web development
Everything about flutter web developmentEverything about flutter web development
Everything about flutter web developmentKaty Slemon
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage CollectionQooJuice
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 MinGeun Park
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?내훈 정
 

Tendances (20)

Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyun
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipeline
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
Build web applications using google flutter
Build web applications using google flutterBuild web applications using google flutter
Build web applications using google flutter
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 
Customize renderpipeline
Customize renderpipelineCustomize renderpipeline
Customize renderpipeline
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Everything about flutter web development
Everything about flutter web developmentEverything about flutter web development
Everything about flutter web development
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 

Similaire à Android와 Flutter 앱 개발의 큰 차이점 5가지

안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법YoungSu Son
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기Miyu Park
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기NAVER D2
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Androidtaeinkim6
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteSeok-yong Kim
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기NAVER D2
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
WeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdfWeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdfjaneSim13
 
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기NAVER D2
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)SangIn Choung
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 YoungSu Son
 

Similaire à Android와 Flutter 앱 개발의 큰 차이점 5가지 (20)

안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Android
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's Note
 
Electron
ElectronElectron
Electron
 
Modern android
Modern androidModern android
Modern android
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
WeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdfWeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdf
 
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
 
deview2014
deview2014deview2014
deview2014
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 

Android와 Flutter 앱 개발의 큰 차이점 5가지

  • 1. Android / Flutter 앱 개발의 
 큰 5가지 남반석2019.12.8 차이점
  • 2. 가장 큰 5가지 1. 같은 코드로 iOS 릴리즈 가능하다. 2. Hot Reload 지원 => 개발 시간을 획기적으로 단축. 3. Dart 언어를 사용 (Javascript, Java를 섞어버린) 4. 안드로이드 스튜디오 외에 VS Code로 개발 가능하다. (가볍고 쾌적하 다.) 5. Android는 OS가 그리는 반면, Flutter는 Skia엔진이 그린다. 차이점
  • 4. 오늘 주제는 가장 큰 차이점
  • 7. 크래시가 나지 않는다. •단 Native쪽과 연동 과정에서는 크래시가 발생하기도 한다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 1. 크래시가 나지 않는다면 어떤 일이 벌어질까요?
  • 8. 1. 크래시가 나지 않는다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 •Widget 안에
 빨갛고 노란
 stacktrace 로그가 보인다.
  • 9. 1. 크래시가 나지 않는다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 •Rotating Error Pizza
 
 From - Facebook Group
 “Let's Flutter with Dart”
  • 10. 1. 크래시가 나지 않는다. •발생한 Exception은 IDE 로그로 확인 가능하다.
  • 11. 1. 크래시가 나지 않는다. •다양한 플러그인을 사용할때 
 Android 채널, iOS 채널을 통해 코드가 실행되면 
 Native 코드로 (Java, Kotlin, Swift) 실행이 되고, 크래시 발생 가능.
 
 간혹 Low Level에서 크래시가 발생하기도 한다.
  • 12. 1. 크래시가 나지 않는다. •Fatal signal 11 (C, .so파일 관련 에러)가 발생하면
 분석, 해결이 굉장히 어렵다. •푸시 플러그인 버그: 
 https://github.com/FirebaseExtended/flutterfire/issues/125
  • 13. 1. 크래시가 나지 않는다. 실제 Product에서도 
 크래시가 안나나요?
  • 14. 1. 크래시가 나지 않는다. - Android 1건 (화웨이 기기)
 DAU 250
 MAU 1.5K 최근 30일 크래시 - IOS 0건
 DAU 2.1K
 MAU 12K
 (11월에 Flutter 전환,
 0.04%는 원인불명;;)
  • 15. 1. 크래시가 나지 않는다. 그러면 코드 오류는 
 잡을 수 없나요?
  • 16. 1. 크래시가 나지 않는다. Firebase에서 Crashes 필터 -> Non-Fatal로 바꾸면, 
 위젯이나, 로직 등에서 발생한 에러의 File & Line을 볼 수 있다.
  • 17. 1. 크래시가 나지 않는다. •장점: 사용자가 앱 사용하다가, 특정 Screen(Page)에 문제가 있어도
 백버튼을 누르고, 계속 이용이 가능하다. •“크래시가 나지 않을때”의 장단점. •단점: 
 - 금융앱 처럼 보안 절차를 철저히 해야하는 앱에서 Assert를 미리
 설계하지 않으면, 크래시가 나지 않은채로 의도하지 않은 동작 가능하다.
 
 - 앱화면에 빨간 에러코드는, 유저들에게 불안이나 잘못되었다는 느낌을
 줄 수 있고, 앱을 지울 우려가 있다. => 빠르게 파악 => Hotfix가 필요하다
 

  • 18. 2. 획기적인 화면 사이의 정보 통신
  • 19. 2. 획기적인 화면 사이의 정보 통신 - Android에서는… Activity - OnActivityForResult - ListenerDialog - ViewModel, ListenerFragment - EventBusEtc
  • 20. 2. 획기적인 화면 사이의 정보 통신 Activity - OnActivityForResult - ListenerDialog - ViewModel, ListenerFragment 단점: 화면을 시작하고, 받는 위치가 다르다. (헤맬 수 있다.) 단점: ViewModel은 본래 View를 위한 모델 관리 용도인데,
 이벤트 전달을 위해 사용/비대해질 우려.
 Listener와 참조가 끊겼을때 전달되지 않음 (onRestoreInstanceState) 단점: Listener 호출 후 dismiss를 매번 수동으로 해줘야한다. (따로 호출)
  • 21. 2. 획기적인 화면 사이의 정보 통신 그렇다면 Flutter에서는 어떻게 하나요?
  • 22. 2. 획기적인 화면 사이의 정보 통신 함수
  • 23. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Open data param Returning data
  • 24. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Screen A Open data 
 param Returning
 data
  • 25. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Screen A
  • 26. 2. 획기적인 화면 사이의 정보 통신 await에서 화면이 열리고, 해당 Screen이 닫힐때까지 코드가 Block된다.
 화면이 끝나고 정보를 받게되면 아래에 if (result != null) 코드가 수행된다.
  • 27. 2. 획기적인 화면 사이의 정보 통신 Screen B에서 데이터를 돌려줄때 Push 함수의 Return type 🍀 Android의 Intent, Bundle에 싣기위해 Serializable, Parcelable 구현
 Flutter에서는 필요없음. 그냥 객체 그대로 싣고 보낸다. 메모리 주소도 동일
 

  • 28. 2. 획기적인 화면 사이의 정보 통신 •Provider 사용 •Listener를 사용 가능함 (비추천) 그 외의 방법
  • 30. 3. Thread 스트레스에서 해방 Android에서는… Bitmap처리, Network처리 등을 위해 •AsyncTask (Deprecated) •Thread, Excutors •Rx (Schedulers.xx() series) •Coroutine - suspend function
  • 31. 3. Thread 스트레스에서 해방 suspend function은 
 coroutine scope 안에서 또는
 suspend function 안에서 호출 가능 •Coroutine
  • 32. 3. Thread 스트레스에서 해방 •Flutter Future sync, async 함수는
 서로 원하는 형태로
 제약없이 호출 가능.
  • 33. 3. Thread 스트레스에서 해방 •Event Loop이 흐름을 콘트롤, Javascript의 방식
  • 34. 3. Thread 스트레스에서 해방 •Async, Await 방식은 단일스레드 방식으로 동작한다는 의미.
 (그러나 통신이나 이미지뷰 처리가 UI를 느리게 하지 않음)
 •Parallel 하게 여러 작업을 동시에 수행하려면 
 Isolate를 사용하면 된다.
 
 https://medium.com/flutter-community/flutter-dart-async-concurrency- demystify-1cc739aaae57
 http://jpryan.me/dartbyexample/examples/isolates/
  • 35. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 36. Android 에서는… 1. Java, Kotlin으로 커스텀뷰 코드 작성 2. attrs.xml 안에 속성 추가 3. Java, Kotlin에서 코드로 attrs 파라미터 추출 4. 코드로 뷰 동적 생성할때를 위해 생성자, 또는 setter생성 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 37. Write attrs.xml
 
 Extract from attrs 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 38. 왜 이렇게 해야하죠? => 레이아웃을 xml로 그리기 때문 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 39. 왜 xml로 해야하죠? => 화면 레이아웃 작성할때마다
 빌드를 하면 개발이 늦다. (미리보기가 필요) 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 40. 본래 View는 Java 객체 XML로 인해서 불필요한 과정이 생겼다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget) => Android Compose 개발중
 https://developer.android.com/jetpack/compose/tutorial
  • 41. 그럼 Flutter에서는? 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 42. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget) 필요한 필드 & 생성자 정의
  • 43. 각 필드에 원하는 변수들을 배치. (Primitive, Enum, Object, Function, Widget)
 MVVM 처럼 data가 binding되고, 
 setState 함수를 통해 값이 바뀌면 알아서 갱신(Build)이 된다.
 
 개별 변수 Observing은 아니지만, 오히려 심플하다.
 각 Observable을 관측하는 Observer만 갱신하는 것은 성능상 이점이 있지만,
 개발자, 코더 입장에서는 개별적인 변화와/ Observing 여부에 신경쓰고 setValue가 제대로 
 호출되었는지 확인하는 불편함이 있는데, 
 Flutter에서는 그런 불편함이 사라진다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 44. Hot Reload Value
 Logic 
 Layout Animation 모든 변경을 1초만에 확인 가능하다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 45. 5. 쉽고 직관적인 Animation 처리
  • 46. Android 에서는… 5. 쉽고 직관적인 Animation 처리 => 단일 뷰 Animation은 쉽지만, 주변 레이아웃이 같이 변한다면
 좀 골치가 아파진다. 1. Animation을 수행할 View를 찾는다. 2. View의 transitionX, alpha, scale의 타겟값을 세팅 3. Duration 세팅 4. Interpolation 세팅 5. start() 함수 수행
  • 47. 그래서 Android 에서는… 1. Constraint Set 변경 - AutoTransition
 
 
 
 2. Android Studio 4.0 Motion Editor 개발중 => 똑같은 Xml을 여러벌을 준비하거나,
 코드로 Constraint를 동적으로 변환한다. 5. 쉽고 직관적인 Animation 처리
  • 49. Animation WidgetsImplicit 5. 쉽고 직관적인 Animation 처리
  • 50. Implicit ? Implicit Intent: 목적 Targeting만 하면 알아서 동작 5. 쉽고 직관적인 Animation 처리
  • 51. 5. 쉽고 직관적인 Animation 처리 visibleFraction이 60%일때 chartSize = 150이 set
 자동적으로 차트막대가 커지는 애니메이션이 시작된다.
  • 52. Implicit animated widgets - 다양한 기본 위젯들 탑재 https://www.youtube.com/watch?v=IVTjpW3W33s 5. 쉽고 직관적인 Animation 처리
  • 53. 물론 Explicit animation도 지원한다. (Animation Controller) Let’s subscribe
 Youtube Flutter Channel 그러나 웬만하면 Implicit Animations로 구현 가능하다. 5. 쉽고 직관적인 Animation 처리
  • 54. UI 개발 Framework 끝판왕 Android / Flutter 앱 개발의 큰 차이점 5가지를 통한 
 Flutter 총평:
  • 56. 자료 및 이미지 출처: •https://github.com/flutter/flutter/issues/17112 •https://www.jagranjosh.com/articles/relations-and-functions-iit- jee-important-questions-and-preparation-tips-1455106528-1
 •https://medium.com/flutter-community/flutter-threading- 5c3a7b0c065f
 •https://www.youtube.com/watch?v=IVTjpW3W33s •https://medium.com/flutter-community/flutter-dart-async-concurrency- demystify-1cc739aaae57
 •http://jpryan.me/dartbyexample/examples/isolates/