Google for Mobile I/O RECAP 2018 (07)

07. Developer. Kotlin으로 코딩 시작하기

  • 발표자 : Hadi Hariri (VP of Developer Advocacy, Jetbrains)
  • 세션설명 : 한 번도 사용해보지 않은 개발자는 있어도, 한 번만 사용해 본 개발자는 없다! 사용해본 개발자의 95%가 높은 만족도를 보였다는 Kotlin! 작년 안드로이드 공식 언어로 채택된 이후 매년 빠르게 성장하고 있는 Kotlin을 시작해보세요. Google I/O에서 Kotlin을 발표했던 Jetbrain의 Hadi Hariri가 한국 개발자를 위해 직접 소개합니다.

코틀린 지식이 없는 상태에서 단편적인 키워드들로 정리한 세션이라 샘플코드 등 임의로 넣은 부분이 많습니다.

Kotlin 시작시 Android Studio의 Java to Kotlin 메뉴에 의존하지 말 것.

Property & Field

Kotlin은 필드는 없고 프로퍼티만 사용함.

참고 : https://kotlinlang.org/docs/reference/properties.html#backing-fields

Fields cannot be declared directly in Kotlin classes.

  • field: A data member of a class. Unless specified otherwise, a field is not static. - 클래스의 데이터 멤버. 특별히 언급되지 않았다면 field는 정적이지 않다.
  • property: Characteristics of an object that users can set, such as the color of a window - 윈도우의 색과 같이, 사용자가 설정할 수 있는 객체의 특성

Delegated Properties

참고 : https://kotlinlang.org/docs/reference/delegated-properties.html

  • lazy properties : 첫 번째 액세스시에만 값이 계산되어 저장됨.

    val lazyValue: String by lazy {
        println("computed!")
        "Hello"
    }
    
    fun main(args: Array<String>) {
        println(lazyValue)
        println(lazyValue)
    }
    This example prints:
    
    computed!
    Hello
    Hello
  • observable properties : 리스너는 속성 변경에 대해 알림을 받음.

    import kotlin.properties.Delegates
    
    class User {
        var name: String by Delegates.observable("<no name>") {
            prop, old, new ->
            println("$old -> $new")
        }
    }
    
    fun main(args: Array<String>) {
        val user = User()
        user.name = "first"
        user.name = "second"
    }
    This example prints:
    
    <no name> -> first
    first -> second
  • 맵에 여러 필드를 대신해 프로퍼티를 저장함.

    class User(val map: Map<String, Any?>) {
        val name: String by map
        val age: Int     by map
    }
    ...
    val user = User(mapOf(
        "name" to "John Doe",
        "age"  to 25
    ))
    ...
    println(user.name) // Prints "John Doe"
    println(user.age)  // Prints 25

Standard Library (Built-in)

lazy, vetoable 등 제공함.

funtion expression

참고 : https://kotlinlang.org/docs/reference/basic-syntax.html#defining-functions

// basic
fun sum(a: Int, b: Int): Int {
    return a + b
}

// expression
fun sum(a: Int, b: Int) = a + b

when expression

참고 : https://kotlinlang.org/docs/reference/basic-syntax.html#using-when-expression

https://kotlinlang.org/docs/reference/control-flow.html#when-expression

fun describe(obj: Any): String =
when (obj) {
    1          -> "One"
    "Hello"    -> "Greeting"
    is Long    -> "Long"
    !is String -> "Not a string"
    else       -> "Unknown"
}

exception expression

참고 : https://kotlinlang.org/docs/reference/exceptions.html

// basic
try {
    // some code
}
catch (e: SomeException) {
    // handler
}
finally {
    // optional finally block
}

// expression
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }

Elvis operator

참고 : https://kotlinlang.org/docs/reference/null-safety.html

// basic
val l: Int = if (b != null) b.length else -1

// Elvis operator
val l = b?.length ?: -1

// Elvis operator (Exception)
val name = node.getName() ?: throw IllegalArgumentException("name expected")

Collections

sortWith

참고 : https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sort-with.html?q=sortwithc&p=0

data class Product(val name: String, val price: Double /*USD*/)
...
fun main(args : Array<String>){
	val products = arrayOf(Product("iPhone 8 Plus 64G", 850.00),
							Product("iPhone 8 Plus 256G", 1100.00),
							Product("Apple iPod touch 16GB", 246.00),
							Product("Apple iPod Nano 16GB", 234.75),
							Product("iPad Pro 9.7-inch 32 GB", 474.98),
							Product("iPad Pro 9.7-inch 128G", 574.99),
							Product("Apple 42mm Smart Watch", 284.93))
		
	products.sortWith(object: Comparator<Product>{
								override fun compare(p1: Product, p2: Product): Int = when {
													p1.price > p2.price -> 1
													p1.price == p2.price -> 0
													else -> -1
												}
					  })
}

map

참고 : https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map.html

var strCustList = customerList.map { it -> if(it!=null) "${it.name} lives at street ${it.address.street}" else null }
strCustList.forEach{println(it)}

mapNotNull

참고 : https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map-not-null.html

publicp  inline fun <T, R : Any> Iterable<T>.mapNotNull(transform: (T) -> R?): List<R>

Null declare (?) 하지 말 것.

참고 : https://kotlinlang.org/docs/reference/basic-syntax.html#using-nullable-values-and-checking-for-null

Java를 위해서 만들어진 것.

In Kotlin, the type system distinguishes between references that can hold null (nullable references) and those that can not (non-null references). For example, a regular variable of type String can not hold null:

https://kotlinlang.org/docs/reference/null-safety.html

To perform a certain operation only for non-null values, you can use the safe call operator together with let:

If you have a collection of elements of a nullable type and want to filter non-null elements, you can do so by using filterNotNull:

Semicolons

참고 : http://kotlinlang.org/docs/reference/grammar.html#semicolons

Kotlin provides "semicolon inference": syntactically, subsentences (e.g., statements, declarations etc) are separated by the pseudo-token SEMI, which stands for "semicolon or newline". In most cases, there's no need for semicolons in Kotlin code.

Inline Functions

참고 : https://kotlinlang.org/docs/reference/inline-functions.html

https://blog.uzuki.live/advanced-kotlin-inline-functions-1-basic/

https://blog.uzuki.live/inline-functions-2-local-return/

고차 함수(higher-order functions) 사용시 특정 런타임에서 패널티가 부과되며, 메모리 할당과 가상 호출은 런타임 오버헤드를 초래한다고 함.

이런 종류의 오버헤드는 람다 식을 inlining 함으로써 제거될 수 있음.

람다 사용시에만 inline 사용이 가능하며 퍼포먼스 개선이 가능하다.

Local Return 문에도 사용됨.

Functional Programming

return 타입을 명시해야 함.

fun Division(a: Int, b: Int): Int {
    return DivisionVaild(result)
    //return DivisionInvaild(result)
}

fun DivisionVaild(val result: Int)
fun DivisionInvaild(val result: String)

Sealed Classes

참고 : https://kotlinlang.org/docs/reference/sealed-classes.html

Sealed Class와 서브클래스는 같은 파일에 선언되어야 함.

Sealed Class는 abstract Class임. 직접 인스턴스화 할수 없고 abstract 멤버는 가질수 있음.

non-private constructors를 가지면 안됨.

주로 when 표현식에서 유용함.

sealed class Expr {
    data class Const(val number: Double) : Expr()
    data class Sum(val e1: Expr, val e2: Expr) : Expr()
	object NotANumber : Expr()
}
fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}

Q&A

시간 관계상 생략

Google for Mobile I/O RECAP 2018 (06)

06. Developer. 빠르고 세련된 Android 개발 - Android Jetpack & Android Studio

  • 발표자 : 김태호 (Mobile Apps Technical Specialist, Online Partnership Group, Google)

  • 세션설명 : 견고하고 현대적인 안드로이드 애플리케이션을 만드려면 어떻게 해야할까요? 세련되고 빠른 Android 앱을 만들기 위한 컴포넌트, 도구 및 지침들을 담고 있는 Android Jetpack과 Android Studio를 소개합니다.

Android Studio

Layout Inspector

참고 : https://developer.android.com/studio/debug/layout-inspector?hl=ko

Profile

참고 :

​ CPU : https://developer.android.com/studio/profile/cpu-profiler?hl=ko

​ Memory : https://developer.android.com/studio/profile/memory-profiler?hl=ko

​ Network : https://developer.android.com/studio/profile/network-profiler?hl=ko

Runtime

  • Dalvik : 앱 Size가 중요하고, Heap Fragment 등의 이슈가 있음.
  • ART : Performance 에 최적화

Language

Java, Kotlin 사용하며, 부분적인 Kotlin 개발이 가능함. Kotlin Lint 체크 지원.

Library & API

  • AbsoluteLayout : 사용하지 말 것. 강조. 또 강조. 또 또 강조.
  • LinearLayout : 간단한 경우 사용.
  • FameLayout : 역시 간단히 사용.
  • GridLayout : 권장하지 않음.
  • RelativeLayout : 사용에 대한 비용이 비쌈.
  • ConstraintLayout : 권장하며 2.0 버전 나올 예정.

AdapterView

기존 ListView, GridView는 뷰홀더 패턴 직접 작성 등 처리 복잡하고 어려움.

RecyclerView가 다양한 레이아웃을 제공하며 사용하기 좋음.

Fragment

참고 : https://developer.android.com/reference/android/app/Fragment

This class was deprecated in API level 28. Use the Support Library Fragment for consistent behavior across all devices and access to Lifecycle.

Support Library에 있는 Fragment 사용 권장

  • android.app.Fragment
  • android.support.v4.app.Fragment (권장)

Activities

가능하다면 싱글 액티비티 권장

Architecture

참고 : https://developer.android.com/topic/libraries/architecture/

기존에는 권장하는 부분이 없었음. 현재는 AAC(Android Architecture Components) 로 가이드 제공함.(필수는 아님)

Life Cycle

참고 : https://developer.android.com/topic/libraries/architecture/lifecycle

Callback 처리 등으로 액티비티나 프래그먼트가 heavy 해짐. AAC 에서 액티비티와 독립적으로 Life Cycle을 제공함.

Views and Data

참고 : https://developer.android.com/topic/libraries/architecture/viewmodel

ViewModel이 처리하며, 인스턴스만 Activity에서 관리

Data

참고 : https://developer.android.com/topic/libraries/architecture/room

Room 등에서 지원함.

Android Jetpack

참고 :

https://developer.android.com/jetpack/

https://android-developers.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html

Guidance

Android X

참고 :

https://developer.android.com/topic/libraries/support-library/refactor

https://android-developers.googleblog.com/2018/05/hello-world-androidx.html

기존 Support Library (android.support.*)와 AAC(android.arch.*)를 AndroidX(androidx.*)로 패키지명 교체.

버전은 1.0.0으로 리셋되며 -v4, -v7 같은 네이밍 제거됨.

OldNew
android.support.**androidx.@
android.databinding.**androidx.databinding.@
android.design.**com.google.android.material.@
android.support.test.**(in a future release) androidx.test.@
android.arch.**androidx.@
android.arch.persistence.room.**androidx.room.@
android.arch.persistence.**androidx.sqlite.@

Migration to Android X

Android Studio Canary 14 버전으로 Refactor 메뉴의 Refactor to AndroidX... 메뉴로 실행

그 외

Q&A

시간 관계상 생략

Google for Mobile I/O RECAP 2018 (05)

05. Developer. 새로운 모듈 Android App Bundle로 앱 개발하기

  • 발표자 :

    Phil Adams (Senior UX Researcher) Tom Dobek (Software Engineer, Google)

  • 세션설명 : Android App Bundle은 크기가 작은 앱으로도 우수한 사용 환경을 간편하게 제공할 수 있도록 도와주는 새로운 앱 모델입니다. 앱 크기를 대폭 줄이고 Dynamic Delivery를 통해 유저들이 앱을 더 빠르게 다운로드할 수 있도록 하는 방법을 소개합니다.

참고 : https://developer.android.com/guide/app-bundle/

https://medium.com/mindorks/android-app-bundle-aab-98de6dad8ba8

https://medium.com/mindorks/android-app-bundle-part-2-bundletool-6705b50bea4c

App Bundle이 가능하게 하는 2가지 기능

  • Dynamic delivery system
  • Modular App development

.aab 내부

  • AndroidManifest.xml가 apk에서는 바이너리 형식이지만 aab에서는 프로토콜 버퍼 형식.

  • aab는 내부에 dex 폴더가 따로 있음.

  • aab의 resources.pb는 apk의 resources.arac에 해당하는 파일로 역시 프로토콜 버퍼 형식.

  • resources table, assets table은 앱의 File Targeting을 설명함.

    예) assets/<name>#<key>_#<value>/...

Dynamic Delivery 의 기본 구성요소는 Split APK 매커니즘. (Android 5.0 Lollipop 이상)

Split APK는 일반 APK와 유사하지만 Android 플랫폼은 설치된 여러 개의 분리된 APK를 하나의 앱으로 취급할 수 있음.

App Bundle을 위한 Split 기능은 아래와 같이 사용 가능함.

Split APK의 종류

Base APK

모든 APK가 액세스할 수 있는 코드와 리소스 포함하여 앱의 기본기능 제공. 앱 다운로드시 설치되는 첫 번째 APK

Configuration APKs

각 APK에는 특정 화면 밀도, CPU 아키텍처, 언어에 대한 기본 라이브러리 및 리소스를 포함. 기기가 Base APK 또는 Dynamic feature APK 다운로드시 필요한 라이브러리와 리소스만 다운로드 됨.

Dynamic feature APKs

각 APK에는 앱 설치시 필요하지 않지만 나중에 다운로드하여 설치할 수 있는 코드와 리소스가 포함되어 있음.

Average Savings

App Bundle을 통해서 평균 20% 이상의 앱 용량을 절감함.

Publishing App Bundle

App Bundle을 만든 후 signing 하여 Google Play에 업로드.

App Bundle은 기기에 APK를 배포할 수 없는 대신 하나의 빌드 아티팩트에 모든 앱의 컴파일된 코드와 리소스를 포함하는 새로운 업로드 형태임.

signing된 App Bundle을 업로드하면 Google Play는 앱의 APK를 만들고 서명한 후 Dynamic Delivery를 통해 사용자에게 제공하는 데 필요한 모든 것을 제공함.

Publishing API에서도 App Bundle 지원함.

Internal Test Track을 사용하여 테스트.

bundletool

참고 : https://github.com/google/bundletool

App Bundle 을 로컬에서 테스트할 때 사용.

  • Android App Bundle 빌드
  • APK archive 생성
  • APK 추출
  • APK 설치
  • 장치 사양 추출

SplitInstallManager

참고 : https://developer.android.com/guide/app-bundle/playcore

Q&A

Q : 사용자가 설치 후 언어 변경시 앱을 재설치해야 하나?

A : Split App만 설치하면 됨.

Q : assets 타켓팅시 불필요한 파일 포함되는데 개선 여부는?

A : 타켓팅을 상세히 해서 하면 됨.

Q : 앱 수정시 앱 번들 모두 업데이트해야 하나?

A : 그렇다.

Q : 베이스 외 모듈 배포 가능하나?

A : On Demand 버전은 따로 배포가 안됨.

Q : 앱번들을 위한 최소 버전은?

A : Pre L도 지원함으로 따로 최소 버전은 없음.

Q : 모듈화에 대해 자세한 설명이나 사례는?

A : 게임에서 레벨에 따라 별도 다운로드 제공.

Q : 앱 번들 기기 지원 관련 이슈는?

A : 현재는 없음.



Google for Mobile I/O RECAP 2018 (04)

04. Developer. Android P 최신 기능 소개

  • 발표자 : 양찬석 (Developer Advocate, Google)
  • 세션설명 : 빠르고 간결하면서도 보안성이 강화된 Android P의 새롭고 중요한 기능과 개발자가 주의해야 하는 점을 소개합니다.

구글에서는 많은 서비스에 AI 접목하는 것을 고려 중임.

  • Adaptive Battery
  • Adaptive Action
  • Slices

Adaptive Battery

참고링크 : https://developer.android.com/preview/features/power

  • 기존 : Doze, Battery Saver 등
  • P : Background Restrictions, App Standby Buckets 등

App Standby Buckets

총 4가지로 분류

  • Active : App이 현재 사용 중.
  • Working set : 앱이 정기적으로 사용 중.
  • Frequent : 앱이 자주 사용하지만 매일은 아님.
  • Rare : 앱이 자주 사용되지 않음.

Rare 의 경우 제약이 생기며, FCM 같은 기능도 등급 조정이 가능함.

예를 들어 High Priority FCM 메시지도 하향 조정이 가능함.

Background Restrictions

유저가 Background Restrictions 기능 켤 경우 Android Vitals에서 Bad behavior로 판단된 앱은 백그라운드에서 처리 가능한 기능이 거의 없음.

심지어 foreground 서비스도 안됨.

Android Vitals가 중요하며, wake lock으로 자주 디바이스를 깨우는 경우 Bad behavior로 판단될 가능성 커짐.

참고 : https://developer.android.com/topic/performance/vitals/wakelock

App Actions

디바이스 내 딥링크로 생각하면 됨. 사용자 행동 학습 후 여러 서비스에서 제공함.

Google 검색 앱, Play Store, Google 어시스턴트, 런처 등의 구글 앱이나 시간대 별 폰 wake시 등.

구글은 사용자 니즈를 알 수가 있지만 그걸 할 수 있는 앱은 알 수가 없음.

그래서 앱에서 Built-in Intents를 사용해야 함. 이는 actions.xml에 정의해야 함.

(Built-in Intents는 향후 더 늘어날 예정)

참고 : https://developers.google.com/actions/reference/built-in-intents/

NameAction IDDescription
Get fortuneactions.intent.GET_FORTUNEGet your fortune from a fortune teller
Get horoscopeactions.intent.GET_HOROSCOPEGet a horoscope by date of birth or sign
Get jokeactions.intent.GET_JOKEGet a joke about a topic or from a creative work
Get a quotationactions.intent.GET_QUOTATIONGet a quotation from a particular author or creative work
Get credit scoreactions.intent.GET_CREDIT_SCOREGet credit score from a credit agency
Get cryptocurrency pricesactions.intent.GET_CRYPTOCURRENCY_PRICEGet prices for a particular cryptocurrency
Play gameactions.intent.PLAY_GAMEPlay a game.
Check watersports conditionsactions.intent.CHECK_WATERSPORTS_CONDITIONSCheck watersports conditions at a given location
Check air qualityactions.intent.CHECK_AIR_QUALITYCheck air quality at a place
Check water conditionsactions.intent.CHECK_WATER_CONDITIONSCheck water conditions at a time or place
Start calming activityactions.intent.START_CALMING_ACTIVITYHelp user engage in a calming, meditative activity

Slices

참고 : https://developer.android.com/guide/slices/getting-started

앱 일부를 앱 외에 다른 앱 등에서 사용.

위젯이 비슷하나 위젯은 자유도가 너무 높고 범용성이 떨어졌었음.

Slices는 템플릿을 제공함. (Notification 처럼 Builder 로 구현)

action와, toggle, slider 등 제공

support 라이브러리 형태로 지원함으로 하위지원 및 최신 패치 적용 가능함.

SliceProvider 생성해야 함.

App Actions와 연결성 있게 서비스 가능할 것으로 보임.

Notification

참고 : https://developer.android.com/preview/features?hl=ko#notifications

  • Messaging Style.

  • Image 지원함.

  • SmartReply 기능 지원.

  • Notification Blocking : 사용자가 빈번히 Notification을 dismiss할 경우 시스템에서 Blocking을 제안하게 됨. 이 경우 Notification Channel 단위로 처리되므로, 앱에서 Channel 관리가 필요할 것으로 보임.

Display Cutout

참고 : https://developer.android.com/preview/features?hl=ko#cutout

시장에 지원하는 디바이스가 늘어남으로 플랫폼 차원에서 지원하게 됨.

Status Bar 높이를 하드코딩한 경우 문제가 됨. (기존은 24dp로 알려져 있지만 Cutout의 경우 약 57dp? 정도임)

기존 AppBar는 자동으로 높이 조절하므로 상관이 없으나, 풀스크린 앱이 문제가 됨.

View.OnApplyWindowInsetsListener의 WindowInsets 로 Cutout 사이즈 확인이 가능함.

Private API

참고 : https://developer.android.com/preview/restrictions-non-sdk-interfaces

비 SDK 인터페이스를 참조하거나 리플렉션 또는 JNI를 사용하려할 경우 제한 사항 적용.

ETC - Google Play Target SDK Rules

참고 : https://developer.android.com/distribute/best-practices/develop/target-sdk

ETC - Android Emulator

참고 : https://androidstudio.googleblog.com/2018/04/emulator-2727-canary.html

속도개선됨.

ETC - Chrome OS용 Android Studio

참고 : https://developer.android.com/topic/arc/studio

Q&A

Q : App Actions의 앱 우선순위는 어떻게 결정되나? (사실 질문이 기억안남)

A : 앱 순위는 AI를 통해 사용자가 가장 사용할만한 앱을 제안하게 됨.

Google for Mobile I/O RECAP 2018 (03)

03. Keynote. 모바일 개발자를 위한 I/O 2018: Android의 새로운 기능 소개

  • 발표자 :

    Sean McQuillan (Developer Advocate Android, Google) Hadi Hariri (VP of Developer Advocacy, Jetbrains) Benjamin Frenkel (Product Manager, Google)

  • 발표자료 :

    Andrioid에서 개발자들은 무엇을 더 할 수 있을까요? 개발자에게 더욱 많은 것들을 가능하게 하는 Android 플랫폼의 새롭고 흥미진진한 최신 기능을 총정리해드립니다.

Android App Bundle

App Size를 줄이는 것은 중요함. (100 MB 이상의 앱의 설치율은 30% 정도 떨어짐)

Android App Bundle을 사용하여 동적 기능 모듈(dynamic feature modules)을 앱에 추가함.

Android Studio에서 개발자가 임의의 기기에 대해 앱에 필요한 모든 것, 즉 모든 언어, 모든 기기 화면 크기, 모든 하드웨어 아키텍처가 들어 있는 App Bundle 빌드

사용자가 해당 앱을 다운로드하는 시점에 Dynamic Delivery로 사용자의 기기와 일치하는 코드와 리소스만 전달

Kotlin

Most importantly, 95% of developers tell us they are very happy with using Kotlin for their Android development. And, the more developers use it, the more that number rises. The number of Play Store apps using Kotlin grew 6x in the last year. 35% of pro developers use it, and that number is growing each month.

https://android-developers.googleblog.com/2018/05/google-io-2018-whats-new-in-android.html

Kotlin 사용자 95%가 매우 만족한다는 응답을 했으며, 프로 개발자의 35%가 Kotlin을 사용 중이라고 함.

추가로 미국, 중국, 인도 순으로 Kotlin을 많이 사용 중임.

Kotlin 사용자 절반은 다른 언어에서 넘어왔으며, 중기업 이상 20% 이상은 Kotlin으로 전환하였다고 함.

Kotlin은 Mobile, Web Backend, PC 등 다양하게 사용되고 있음.

속도 개선, 지원 툴, 언어(coroutine), 멀티플랫폼(Kotlin JVM/JS/Native) 등으로 진행 중.

Innovative distribution

App Bundle

최근의 앱들은 글로벌 서비스 지원을 위한 언어팩이나 다양한 기능 지원으로 앱 사이즈가 커지고 있음.

하지만 앱 사이즈가 커질수록 앱 설치율은 떨어짐.

이에 App Bundle로 Dynamic Delivery 지원할 예정.

Google Play Instant

게임도 모두 지원하며, 게임의 경우 비교 분석에 적합함.

게임의 경우 미니게임, 튜토리얼보다 난이도 있는 체험, 경험 못한 레벨 체험 등을 지원할 수도 있음.

Google Play, SNS, 배너 등에서도 체험 가능함.

적용 사례로는 캔디크러시와 배틀로얄 등.

지원
  • 4MB 제한 -> 10MB 제한
  • 다운로드 프로그레시브 지원
  • 유니티 라이브러리 지원 (10MB 제한과 별도로)
  • 코코스 지원 예정
  • Record -> Refactor 메뉴로 지원

Develop Faster

Android Architecture Components

Android Jetpack (하위호환 가능, 95% 기기 지원)
  • Backwards compatibility
  • Less Boilerplate
  • 등등

Android Studio 3.2 Canary

Emulator 스냅샷 지원으로 구동속도 개선 등등

Increasing Engagement

Android Slices

앱의 일부 인터페이스만 안드로이드 인터페이스 어디에든 나타나게 함.

App Actions

Google 검색 앱, Play Store, Google 어시스턴트, 런처와 같은 여러 Google 및 Android 화면에서 사용 현황과 관련성을 기준으로 App Actions가 사용자에게 표시

actions.xml에 내용 추가하면 됨.

Q&A

Q : RPG 게임에도 Instant App이 도움이 될까?

A : Yes. 사전등록, 미니게임 또는 친구추가, 길드초대 등 유저 경험을 제공할 수 있음.

Q: 인디 게임도 Instant App이 도움이 될까?

A : Yes. 인디게임에 더 필요할 듯. 무료나 프리미엄 등 모든 게임 지원함.

Q : Kotlin 사용으로 얻을 수 있는 이득은?

A : boiler pate 코드가 안 생김. 약 40% 코드 줄어듬. 효율적이고 스마트하게 행복하게 일할 수 있음. 진짜임.

Q : 안드로이드 제트팩이 코틀린과 100% 호환 가능한가?

A : 완벽히 지원함.

Q : HTML 5 에도 Instant App 지원이 가능한가?

A : Instant App의 원래 취지는 네이티브 요소를 웹의 편리함으로 가져오자는 취지였음. 취지에는 안맞을 듯.



Google for Mobile I/O RECAP 2018 (02)

02. Keynote. Google I/O 2018 최신 기술 총정리

  • 발표자 : Tian Lim (VP of UX & Product for Play, Google)

  • 세션설명 :

    매년 5월, Google I/O에서는 세상을 깜짝 놀라게 하는 기술들이 발표됩니다. 한층 더 진화한 인공지능 Duplex부터 Google Lens까지, 올해 발표된 Google의 따끈따끈한 최신 기술을 한국의 개발자분을 위해 소개합니다.

AI for everyone

Digital Well-Being

AI

Useful more

구글 포토 등의 서비스에 다양한 AI 서비스 제공.

Adaptive Battery 기술 등에서도 AI가 사용됨.

Help innovation

ML Kit 등으로 서비스에 AI 기술 적용하도록 지원.

TPU 3.0 등 개발 진행으로 AI Cloud 서비스를 위한 부분도 진행 중.

Solution

AI로 의료정보 등을 제공하여 기존 의사들을 돕거나 사람보다 정확한 진단을 할 수도 있음.

Digital Well-being

Dash board

앱 사용 성향 등을 분석하여

App Timer

앱 사용 시간 등을 설정 후

Wind Down

시간이 다 되면 흑백화면 등으로 전환하여 사용자에게 알려줌

Standout well-being App

Google Play Award에 카테고리 추가



Google for Mobile I/O RECAP 2018 (01)

현장


전리품

기본 : 출입태그, 티셔츠, 텀블러 (얼리버드 이벤트로 못받음 ㅠㅠ), #IMakeApps 스티커

그리고 도시락


01. Keynote. 환영사

  • 발표자 : 민경환 (Head of Korea Android Apps and Games Business Development, Google)
  • 세션설명 :

환영함.

Google I/O Extended Seoul 2018

링크 : https://io-extended-seoul-18.firebaseapp.com/

일시 : 2018.06.10 11:00 ~ 17:25

장소 : 세종대학교 광개토관 컨벤션홀 (B2)

간단하게 들었던 섹션 정리입니다.

01. KeyNote

  • 발표자 : David MacLaunghim(Google/Global Programs Lead)
  • 발표자료 :

GDG 현황 및 활성화를 위한 노력?

번역 자막이나 동시 통역 없이 영어로 진행되서 내용은 잘 모름.

걍 들리거나 눈에 보이는 대로 정리하자면은...

구글에서도 Open Source의 중요성이 높아지고 Third-Party Storage 도 마찬가지

그리고 개발자 커뮤니티의 활성화를 장려한다는 듯

기존 GDG의 경우 Local / Tech / Special 로 주제를 가지고 진행한다고 함.

그리고 GDE(Google Developer Experts)도 있고 Women Techmakers도 있음.

GDG Korea 조은 님 추가

GDG Korea에서는 주로 Meet up을 이용하며, slack.gdg.kr로 GDG Korea의 정보를 얻을 수 있음.

  • Track A : Android / Design
  • Track B : Machine Learning
  • Track C : Flutter, Web

02. Track A. What's new in Android P

  • 발표자 : 전병권 (Riot Games)
  • 발표자료 :

Android P 이야기. Compiler 관련 D8/R8 변화. App Bundle 추가. Jetpack은 중요하므로 직접 봐야할 것.

Android P 릴리즈 일정

  • 현재 DP3 (API 28) 까지 나왔으며, API 추가는 이제 없음.

주요 기능

  • Battery

    App Stanby Buckets (사용빈도 대비 전력사용 고려하여 관리)

  • Background Limit

    Voice Recoding, Camera Capture, Sensor 등 제한됨.

  • Location : 구글 맵 실내측위 지원, Wi-Fi RTT 이용.

  • Accessibility : View 속성 추가

    • android:accessibilityPaneTitle
    • android:accessibilityHeading
    • android:screenReaderFocusable
  • Security : 시스템이 앱을 대신해 지문 인증 대화상자 제공 등

  • Display cut (notch) : 개발자 옵션 - Drawing 섹션 -> Simulate a display with a cutout 메뉴로 확인 가능.

  • Actions : deep links

  • Notifications

    • 이미지 지원
    • 단순화된 대화 참가자 지원 (Notification.Person 클래스)
    • 회신을 초안으로 저장
    • 그룹대화 여부 식별
    • 인텐트의 문맥적 액션 설정
    • SmartReply (제안 회신 지원)
    • 채널 그룹 차단
    • 알림 채널과 채널 그룹의 차단 상태 변경시 브로드캐스트 인텐트 보냄.
    • 새로운 알림 일시중지 우선순위 범주 추가
  • Deprecation Policy (targetApiVersion 등)

별첨

  • FLAG_ACTIVITY_NEW_TASK : 비 액티비티 컨텍스트에서 액티비티 시작시 인텐트 플래그에 전달해야 함.

Android P Runtime

  • Kotlin 지원 향상
  • Dex 구조 변경(dex 내 data 공유 형식으로)
  • Profile Guided Optimizations
    • Cloud Profiles 형식으로 개인 정보 제외하여 Play Store에 전달됨. 보통 15명 정보면 최적화됨.
  • 기존 1 : Start -> Javac/Kotlinc -> Proguard -> dex -> APK
  • 기존 2 : Start -> Javac/Kotlinc -> Proguard -> class별 dex -> dex merge -> APK
  • D8 : Start -> Javac/Kotlinc -> Proguard -> D8(gradle 3.2부터 지원) -> APK
  • R8(개발 중) : Start -> Javac/Kotlinc -> R8 -> APK

Android App Bundle

기존 Multiple APK에 대한 지원으로 하나의 APK로 생성됨

Android Studio 의 Build Bundles/APK 메뉴에서 사용 가능 (결과물은 aab 확장자 형식)

앱 모듈 부분 설치 등 가능(Instant App 같이 처리 가능)

Jetpack (직접 확인 필요)


03. Track A. 새로운 안드로이드 개발 툴

  • 발표자 : 정승욱 (Grab)
  • 발표자료 :

Android Studio 3.2 Canary 이야기 + Jetpack 이야기. Navigation, Work Manager 사용 이야기.

Android Studio 3.2 Canary

  • Navigation (단일 액티비티, 다중 프래그먼트 지원)
  • Android X Refactoring 지원
    • Android Support Library 를 Android extension library (AndroidX) 네임스페이스로 리펙터링
    • Refactor -> Refactor to AndroidX 메뉴 추가
  • Sample Data : 레이아웃 편집기의 샘플 데이터로 미리 뷰를 채워볼 수 있음.
  • Slice : Android OS System의 UI에 앱 콘텐츠의 일부를 삽입하는 방법.
  • App Bundle : Google Play에서 특정기기에 필요한 APK 만 제공하는 동적 전송 플랫폼용.
  • D8 (기존 컴파일러 대체)
  • R8 (컴파일러 + Proguard)
    • gradle에서 android.enableR8 속성으로 사용 가능하나, R8은 아직 테스트 단계임.
  • CMakeList : C/C++ 코드를 위해 CMake Build Scripts 지원
  • Profiler
    • 에너지 프로파일
    • 시스템 트레이스 (기존 DDMS 대체)
    • 프로파일 세션
    • 코드 레벨 CPU 동작 기록
    • JNI 참조 추적

Jetpack

Android 앱을 빠르고 쉽게 만들 수 있도록 도와주는 라이브러리, 도구, 아키텍처 지침 모음.

공통 인프라 코드를 제공함.

  • AppCompack
  • Android KTX
  • Paging
  • Room
  • ViewModel

Navigation

1개 액티비티에 다중 프래그먼트 사용하기 위함.

  • Up and Back 지원
  • Bundle 참조 지원
  • Navigation 리소스에서 프래그먼트 액션 정의.
  • Activity 리소스에서 NavHostFragment 사용
  • AppCompactActivity의 onSupportNavigationUp() 사용
  • Navigation Controller 에서 네비게이션 리소스 파싱 및 관리
  • 모든 동작은 Runtime에 동작하므로 빌드 걱정 X

Work Manager

Android 백그라운드 작업을 관리.

  • intentService, JobScheduler, JobDispatcher, AlarmManager 대체
  • 디바이스 상태나 충전 상태 등에 대한 옵션 처리 가능
  • Status는 LiveData 형식이며 Room 사용
  • WorkService, WorkManager 클래스 사용
  • Background(스케쥴러) -> Worker -> Success -> sqlite

04. Track B. Something about TPU

  • 발표자 : 이진원 (삼성전자)
  • 발표 자료 :

Tensor Processing Unit 이야기

S/W 이야기 X

Micro-processor 방향성도 Domain 기반으로 변화해감.

y = f(wx + b)

보통 머신 러닝에 쓰이는 공식을 보면 결국 곱하기와 더하기 연산이 중요함.

  • Matrix Multiply Unit
  • Accumulators

TPU 처리속도 진화

TPU v1 (92 tera ops) -> Cloud TPU -> TPU Pod -> TPU v2 Pod -> TPU v3 (100 peta flops) Pod

모바일 용은 보통 1 tera ops 정도 필요

TPU 구성을 보면 Control 로직 비중은 2%

Systolic Array 연산이 중요함.

TPU의 원래 목표는 GPU의 10배의 성능이었으나 실제 대부분 지표에서 10배 이상의 성능이 나오고 있음.

Google Cloud TPU 서비스 베타 상태임.

아래 것들 사용 가능한 듯 (Tensor Board)... 아닐수도 있음;;

  • Image Recognition & Object Detection
  • Transformer
  • Speech Recognition

05. Track B. ML Kit 모바일 개발자를 위한 머신러닝

  • 발표자 : 남상균 (NBT)
  • 발표 자료 :

Firebase ML Kit 이야기. 결국은 GCP Vision API 사용. 결론은 유료.

Google I/O Keynote 에서도 AI에 대한 중요성 강조함.

  • 2017년 : Mobile first to AI first
  • 2018년 : Solving problems with AI for everyone
    • Mobile에는 ML Kit, TF Lite for Mobile

캐시슬라이드의 경우 광고 타켓에 대해서 visioning 사용 (구글 API 사용)

기존에는 client에서 data를 server에 전달 후 연산하는 구조가 주로 쓰임.

on-device ML 도 가능해짐

  • 장점

    • 오프라인 가능
    • 데이터 디바이스 보관
  • 단점

    • 메모리 사용
    • 배터리 소모
    • 낮은 컴퓨팅 파워

Tensor Flow Lite는 아직 실사용에는 어려운 점이 많음. 그래서 ML Kit이 나온 듯.

Google의 ML Kit & AR Core 와

Apple의 Core ML & ARKit 의

네이밍이 가져다 주는 개발자의 작명센스란..

ML Kit은 파이어베이스에서 지원함. Google Cloud Platform API로 지원됨.

  • 기본 API : 주로 이미지 관련
    • 이미지 라벨
    • 텍스트
    • 얼굴 감지
    • 바코드 스캔
    • 랜드마크 인식
    • 스마트 회신(자동완성) 제공 예정
  • 커스텀 모델
    • 동적 모델 다운로드
    • 파이어베이스 원격설정을 통한 A/B 테스트 지원
    • 모델 변환과 압축 제공 예정

Google Codelabs에서 관련 튜토리얼 확인 가능 : https://codelabs.developers.google.com/

Firebase ML Kit

  • Cloud/on-device(기기별) 지원
  • Firebase는 브릿지 역할이라 GCP API를 실제 사용하게 됨.(유료임)
  • on-device일 경우 앱 설치 후 모델 다운로드를 권장함
  • Text Detector 등의 경우 Cloud/on-device에 따라 처리 갯수 차이가 남
  • 커스텀 모델은 model interpreter 사용
  • Firebase 모델 매니저에서 Local/Cloud 모델 소스 관리

visioning API 사용시 주의점 : 이미지 Rotation 값을 잘 설정해야 함.

ML Kit 사용시 고려할만한 서비스들

  • Firebase A/B Testing
  • Cloud Firestore
  • Firebase Performance
  • Google Analytics

Google Cloud Vision API 가격


06. Track A. New Google News & Material Design

  • 발표자 : 안태완 (Google)
  • 발표 자료 :

앱 프로덕트 디자인에 대한 내용 + Material Design Theming 이야기

개발 이야기 X

Google AI 모토는 Human Intelligence 를 support 하는 것

Fake New가 많아 Trust에 대한 부분 필요.

AI 를 통해 paragraph를 뽑아 리스트 배치도 함.

Google Material Theme

Open source 기반 높은 수준의 디지털 경험을 제공하는 것이 목적

Material Theming

기존 Material 은 Product 차별점이 없음.

좀 더 flexible하게 확장된 개념.

주요 개념

  • Centerable
  • more white space
  • product (brand) color
  • 컨텐츠 중심

적용 사례

  • Gmail
  • Google News
  • Google Play
  • Google Home

전리품

기본 : 출입태그, 구글백(신발주머니 같은..), 티셔츠, 선글라스

GDG : 스피너

레진코믹스, 오픈서베이 : 스티커?

참고자료

https://io-extended-seoul-18.firebaseapp.com

Droid Knights 2018

링크 : https://droidknights.github.io/2018/

일시 : 2018.04.22 09:00 ~ 18:00

장소 : 코엑스 컨퍼런스홀

간단하게 들었던 섹션 정리 및 자료 링크 취합입니다.

01. Track 1. No More Fragment, No More Activity

  • 발표자 : 정승욱 (GrabTaxi 안드로이드 개발자)
  • 발표자료 :

동남아 서비스로 국내보다 단말 저사양 및 파편화 현상이 심함.

해상도 대응이나 안드로이드 버전별 대응 등의 어려움이 있음.

각 국가별 개발팀이 분산되어 있으며, 30여명의 개발자로 팀 구성됨.

Activity나 Fragment 등의 사용없이 단일 Activity로 앱 구성.

서비스 모듈 별 관리를 위해 Router, Node 형태 도입.

Back키 처리나 스킴 처리 등의 대응 필요.

02. Track 1. Next Step Architecture

  • 발표자 : 남상균, 정현지 (NBT/캐시슬라이드 Chief Architect & 안드로이드 개발자)
  • 발표자료 :

오래된 앱을 유지하면서 시스템을 개선하기 위한 노력.

도메인 베이스의 의사결정이 개발 환경 등에도 영향을 미침.

안드로이드 API 최소버전도 최근에 들어서 상향 조정함.

Kotlin 전환 등의 노력들을 함.

03. Track 2. Best Practice on Android Instant Apps

  • 발표자 : 김종식 (원티드 안드로이드 개발자)
  • 발표자료 :

설치 없이 네이티브 앱 사용경험을 제공하는 인스턴트 앱 개발과정

Android Instant App FAQ (https://developer.android.com/topic/instant-apps/faqs.html?hl=ko)

  • 호환되는 기기 : Android 4.1(API 16) 이상 & Google Play서비스가 설치된 기기

  • 두 가지 다른 앱을 빌드해야 하나?

    하나의 프로젝트만 유지하면 가능. 두 가지 빌드 아티팩트인 설치 가능 APK와 인스턴트 버전을 생성하도록 프로젝트 구성하면 됨.

  • 어떤 Android API와 기능을 사용할 수 있나?

    Android Instant Apps 기능이 기존 Android 앱을 보완하기는 하나, 대체하지는 않음.

    동일한 Android API, 동일한 프로젝트, 동일한 소스코드를 사용하나 설치되지 않은 앱에 대한 사용자의 기대 사항에 맞지 않을 수 있는 일부 기능은 제한함. 예를 들어 백그라운드 서비스 사용이나 백그라운드 알림, 고유 기기 식별자에 액세스하지 못할 수 있음.

  • 사용자가 앱을 영구적으로 설치하도록 선택할 수 있나?

    Google Play 스토어에서 앱 다운로드하도록 허용 가능함. 다운로드 후에는 사용자가 그 환경을 떠난 후에도 앱이 휴대폰에 남아있음.

  • Permission은 어떤식으로 작동?

    Android 6.0 (API 23)에 새로 추가된 런타임 권한 모델을 사용함.

  • Instant Apps 게시는?

    기존의 Android 앱과 유사하게 Google Play Developer Console을 통해 게시 가능

참조 링크 : https://tech.wanted.co.kr/android/2018/01/30/android-instant-app.html

gradle 이나 AndroidManifest 설정은 위 링크를 참조하면 됨.

인스턴트 앱을 위해 InstantApps 라는 클래스가 추가되었으며, isInstantApp(Context context) 메서드로 현재 프로세스를 확인할 수 있음.

배포시 Holdback 설정을 통해 0과 1 사이의 값을 설정하여 인스턴트 앱 출시 비중을 정함.(0일 경우 전체를 인스턴트 앱으로 출시)

프로덕션 출시가 아니라면 10MB 까지 업로드가 가능했으나, 프로덕션 출시시에는 4MB를 넘기면 안됨.

기본 support 라이브러리들도 용량을 먹기 때문에 실제 사용 가능한 용량은 적을 수 있음.

04. Track 2. Kotlin 코루틴은 어떻게 동작하는가?

일반 subroutine

  • 단일 지점에서 시작 -> 특정 지점에서 종료

Coroutine

  • 단일 지점에서 시작 -> 임의 지점에서 멈춤 -> 해당 지점에서 재개 -> 특정 지점에서 종료

Sequencial code를 통해 non-blocking 코드를 작성하기 위한 수단으로 Coroutine 제공

suspend는 중단/재개 지점을 위한 continuation을 매핑하기 위한 키워드

호출한 대상/어디까지 실행했는지/어떤 값들을 가지고 있는지 등에 대한 상태를 Continuation Passing Style로 처리됨.

각 코드 라인은 Labeling되어 switch문을 통해 처리되며, Statemachine, Continuation, 상태 저장/복원 등으로 동작함.

UI 쓰레드에서 실행됨.

05. Track 2. Google Mobile Vision과 OpenCV로 card.io를 확장한 범용 카드번호인식 개발

LINE에서 사용 중인 신용카드 인식 오픈소스인 card.io가 양각되어 있는 신용카드만 인식하는 문제 해결 과정.

LINE 캐릭터 카드 같은 경우들을 인식을 못함.

Google Mobile Vision과 OpenCV를 활용하여 일반 프린팅된 카드 번호 및 멤버쉽 카드 그리고 바코드를 인식하는 라이브러리를 개발함.

card.io 관련 여러가지 이슈들

  • 작은 해상도(바코드 인식에 맞는 사이즈가 안나옴)
  • 양각 문자만 인식(Google Mobile Vision을 활용해보았으나, 너무 많은 문자열이 인지됨.)
  • 카드 스캔시 영역 설정시 퍼포먼스 이슈
  • 문자열 인지 후 카드번호 얻는 방식(여러 문자열이 나열되는 경우들. 예를들어 자동차 번호판 인식같이)
  • Java와 NDK 간 속도차이는 최소 5배 이상은 차이났음.

##06. Track 2. Travis-ci를 이용한 CI/CD와 도커를 이용한 Jenkins for Android 구성하기

CI(Continuous Integration) : Build, Test를 실시하는 프로세스를 상시로 실시해줌. 지속적 통합.

CD(Continuous Delivery or Continuous Deploy) : 소프트웨어를 빠르고 주기적으로 빌드하고 테스트하고 출시하는 것이 목표. 지속적 배포.

이를 수동으로 하는 것은 자동차 스틱을 운전하는 것이나 돌로 탑쌓기와 유사함.

CI툴들을 사용해 피드백을 받고 스크립트로 자동화까지 처리한다면 자율주행같이 사용할 수 있음.

Travis CI를 이용한 CI/CD

Travis-CI : Github에서 진행되는 오픈소스 프로젝트. Private repository는 유료.

  • 장점
    • 손쉬운 프로젝트 설정 및 서비스 연동(Github와 seamless한 통합)
    • 오픈소스 프로젝트시 무료
    • 전용 CI/CD 서버 필요하지 않음.
    • 모든 Job이 독립적 동작
    • 빌드 메트릭스 제공
  • 단점
    • 제한된 옵션 제공 (Site GUI 제한적)
    • 느린 속도
    • Private Repository는 유료

Jenkins for Android using Docker

Jenkins : 다양한 시스템에서 사용 가능. 다양한 플러그인. 다양한 작업 모드 및 조건의 빌드 가능

  • 장점
    • 무료
    • 사용자 정의 옵션
    • 방대한 양의 플러그인
    • 다양한 적용사례 및 풍부한 레퍼런스
    • Remote access API 제공
  • 단점
    • 별도 서버 필요
    • 시스템 구성 및 사용자 정의 시간이 오래 걸릴 수 있음

07. Track 1. Android Test

  • 발표자 : 정경호 (에그번 안드로이드/서버 개발)
  • 발표자료 :

개발자들은 테스트를 피할 수 없음.

유닛 테스트도 작성이 어려운 경우가 많음.

서비스 테스트부터라도 작성을 해야 함.

UI 테스트도 할 수 있음.

패턴도 적용해야 함.

아무튼 해야 함!!!!

08. Track 1. 내가 안드로이드 개발자가 되었을 때 아무도 알려주지 않은 것들

안드로이드 개발자가 걷는 길

초보 모바일 개발자일 때 어려움들

  • Device/version fragmentation
  • 비동기
  • Life Cycle
  • 구글의 신기능

안드로이드 개발자가 되었을때 아무도 알려주지 않았던 것들

  • Clean Architecture
    • 하라는 건 많지만 제대로 쓰는 사람은 별로 안보임.
  • MVVM
    • 쓰면 좋다는데 복잡하고 예제들이 제 각각임.
  • MVP
    • MVVM 보다는 쉬운 것 같지만 진행하다보니 또 다른 컨트롤러를 만드는 기분임.
  • RxJava
    • 어렵고 헷갈리고, 자매품 LiveData는 좀 쉽지만 애매함.
  • Dependency Injection
    • 처음엔 쉬운 것 같은데 끝없는 decision making의 연속. 특정 인스턴스에 대한 injection을 어떻게 해야 효과적인지 헷갈림.
  • TDD (Test-Driven Development)
    • 유닛 테스트 튜토리얼들 중 실제 상용 프로젝트 수준의 유닛 테스트를 만드는 법을 알려주는 건 없음.

위의 것들을 통해 나타나는 전형적 증상

  • 비관주의 : 이 또한 지나가리
  • 팔랑귀 증후군 : 당장 해보자
  • 툴 만능주의 : 툴과 라이브러리 사용능력이 실력이다?
  • Low-hanging fruit : 쉬운 문제에만 집착

중요한 스킬

  • Solution Provider

    • 알고리즘에 대한 깊은 이해
    • 개발 언어의 semantics의 깊은 원리와 언어 설계 철학에 대한 이해
    • Dalvik의 동작 원리 이해
    • Activity/Fragment 중요 동작을 플랫폼 코드 레벨에서의 이해
    • 안드로이드가 화면을 렌더링 하는 매커니즘의 이해
    • 등등등
  • Architect

    • 내 프로젝트를 간단한 README.md 파일 외에 다른 개발자에게 인수인계할 수 있음.

    • 코드를 1년 뒤에 봤을때 바로 이해 가능

    • 큰 규모의 구조 수정도 1~2일 내에 해낼 수 있을 정도로 유연한 구조

    • Jr 엔지니어에게 후속 코딩을 안심하고 몽땅 떠넘겨도 될 수준으로 기본 구조가 견고하게 작성.

      (잘못된 방식으로 구현하기가 매우 어렵도록 구조를 만듬)

중급 개발자를 위한 안내

  • 시작이 반
  • 공유의 힘 (주관이 들어가면 스스로에게도 독자에게도 도움이 됨)
  • 일본의 경우
    • 블로그를 통한 공유가 일상화
    • 주로 지역 단위의 세미나인 공부회
    • Moku-moku meeting(묵묵한 미팅?) : 그냥 각자 코딩 모임. 국내 모각코 같은...
    • Network Party : 자기가 구현한 아키텍처, 테스트 등 구체적인 부분에 대한 지식 교환.

패턴 사용에 따른 경험들

MVP & MVVM

  • MVC is not evil

    • 모바일 환경의 문제 : 비동기 처리, 라이프 사이클 처리
    • 안드로이드의 View-Controller 분리가 애매
    • 그로 인한 총체적 난국 : 최악의 가독성, 각 클래스들의 너무 많은 역할들.
  • MVP

    • 안드로이드 초기부터 구전으로 전해져 왔던 아키텍처
    • 장점
      • Fat activity/fragment 방지
      • 역할 분리로 인해 소스 가독성 및 품질 상승
      • 플랫폼 의존적인 UI 처리는 View쪽으로 분리하여 Presenter는 쉽게 테스트 작성 가능
      • Clean Architecture와 1:1 mapping 가능. CA 그대로 채용하면 설계 관련 노력도 최소화.
  • What is not MVVM?

    • MVVM의 특징이 Life Cycle은 아님.

    • Data Binding : 필수가 아님. 다만 사용하면 생산성에 확실한 도움이 됨.

    • RxMVVM : 역시 필수는 아니지만 없이는 매우 불편함.

    • ViewModel 용어에서 오는 혼란

      • Model과 같이 작은 단위로 쪼개져있지 않음. 통신에다 별게 다 들어간 형태임.
      • View를 위한 Model (Entity) 라는 개념 & 단방향 Presenter라는 두개의 개념임.
      • Presenter와 매우 유사하나 ViewModel은 View를 제어하지 않음.
      • View는 ViewModel을 호출하되, 결과는 Callback/Observable 형태로 받음.

MVVM vs MVP

둘 다 훌륭한 구조이며, 압도적 우위는 없음. 프로젝트 성격에 따라 다르게 받아들여질 수 있음.

MVP의 비교우위

  • 시작이 쉬우며, Legacy Code의 분량이 많거나 구조 개선에 주어진 시간이 짧은 경우 MVP가 유리
  • RxJava를 안 써도 훌륭한 구조를 만들 수 있음.

MVVM

  • 초기 진입장벽은 있음.
  • View 상태 관리가 복잡한 경우 ViewModel에서의 처리가 자연스러움
  • AAC (Android Architecture Component 후광 효과)
  • Cross Platform 구현에 좀 더 유리 (Kotlin을 Swift로 옮기는 것만으로도 View 이외의 소스의 70% 이상을 재사용 가능)

MVVM - MVP 공통의 장점

  • 개발 속도가 몇 배는 빨라짐 (단 개인차가 있으며, 초기 2~3주간 개발 속도는 몇 배는 느려질 수 있음)
  • 코드 변경에 대한 두려움이 거의 없어짐
  • 기획의 급격한 사양 변경에도 대응 가능
  • 1년 뒤에 코드를 다시 봐도 즉시 어디를 고쳐야할지 알 수 있음.
  • 다른 엔지니어에게 코드를 보여줘도 쪽팔리지 않음!!!

MVP/MVVM at Scale

프로젝트 사이즈가 점점 커지면서 위의 기대와는 달리 지저분해짐.

  • Fat Presenter
  • 테스트 케이스 만들기가 어려워짐
  • 코드가 지저분함. Activity Manager 같은 게 하나 늘어나기만 한 느낌
  • 주된 원인 중 하나는 Presenter를 View와 명확히 분리하지 않은 것

해결책

  • View와 Presenter를 잘못 구현하기 어렵도록 하는 장치 필요.
  • View는 이벤트를 발생시키고, UI를 그려주는 역할만 담당, 비즈니스 로직이나 모델이 끼어들 여지를 차단.
  • Presenter가 View의 세부 사항을 알 수 없도록 P는 View를 추상화 시킨 형태로만 참조하도록 만듦

MVP: Contract Pattern

  • View Interface를 통한 분리
  • 필요한 경우 Presenter까지 Interface화 시킴

MVVM Best Practice: Passive View

  • View는 (플랫폼 의존적인) 그리기 이외에는 아무것도 알 수 없도록 함
  • Lighter View, Fatter ViewModel이 되나 더 나은 구조로 가기 위한 중요한 가교

MVVM is not an architecture.

비즈니스 로직의 비대화

  • Presenter나 ViewModel의 도메인 로직이 감당할 수 없는 크기가 되는 상황

  • Single Responsibility Principle 적용

    • 모범 답안 : Clean Architecture!
    • Presenter에서 도메인 로직을 분리 가능
    • Data 계층의 세분화를 통해 더욱 추상화된 형태의 구조 가능

Clean Architecture

기승전CA?

장점

  • Presenter/Domain/Data 계층의 분리로 인해 전체 로직의 흐름이 일목요연해짐. 가독성 급상승.
  • 특정 클래스가 비대해지는 것을 방지
  • 각 Layer 간 구분이 명확하므로, 영향 범위도 명확
  • 단 클래스 량이 급격히 증가 -> 한번에 구현하려 하면 개발속도 저하와 버그 양산 야기
    • CA가 익숙하지 않거나 경험이 없는 경우 모든 걸 따라할 필요는 없음
    • 프리젠테이션 로직의 합리화부터 시작
      • View - ViewModel/Presenter - Repository - Model (Entity)
    • 도메인/데이터 로직은 필요에 의해 점진적으로 하는 것이 합리적
  • 자동 생성 플러그인 : https://github.com/kiuchikeisuke/Android-Studio-CleanArchitecture-template-forKotlin
    • RxJava, Dagger, Retrofit, AAC, Presenter/ViewModel 코드까지 몽땅 만들어 줌
    • Swagger 지원으로 REST API call 인터페이스도 자동으로 만들어 줌

몇 가지 난제들...

구조의 철학적 문제 : Presenter의 비즈니스 로직과 Use Case의 비즈니스 로직의 차이점?

  • 도메인 로직이 Use Case에 들어감
  • 사업부 사람들도 알고 있어야 하는 로직이라면 도메인 로직

RecyclerView in MVP

Presenter로 RecyclerView - Adapter 대하는 것은 까다로운 문제임

  • Activity/Fragment가 (Presenter의 명령을 받아) Adapter를 제어 - 단순한 패턴의 리스트에는 효과적
  • Adapter와 매핑되는 Presenter를 구현
  • 개별 item과 각각 1:1 매핑되는 작은 Presenter를 구현

RecyclerView in MVVM

Presenter에 비해선 단순한 문제. Data binding으로 그대로 ViewModel 연결 가능

  • 복잡한 경우가 아니라면 Adapter에 ViewModel 연결

  • 복잡하다면 각 Item과 매핑되는 작은 ViewModel 구현

    • 이 경우 ViewModel은 View를 위해 가공된 Model이기 때문에 어떤 의미에서 진정한 ViewModel
    • AAC를 이용해 small ViewModel을 생성시 provider에 파라미터를 별도 지정해야 함. 차라리 상위 ViewModel이 생성하는 게 더 좋을 수 있음.

경험

서비스 중인 앱을 단기간 내에 리뉴얼 개발하면서 얻은 결과

  • 비즈니스 관점에선 앱 구조 개선은 큰 가치가 없음. 새로운 기능들을 얼마나 빠른 속도로 넣느냐..
급한 일급하지 않은 일
중요한 일신 기능 구현
버그 수정 + 앱 안정화
Java -> Kotlin 변환
ViewModel or Presenter 전환
오래된 라이브러리 갈아타기
중요하지 않은 일각종 회의 참석이상한 변수명, 메소드명 변경
들여쓰기 변경
기타 스타일 수정

전리품

기본 : 출입태그, 티셔츠, 밀스 그레인, 그래놀라바, 에코백, 뱃지, 물, 스티커

네이버 : 노트 or 펜

쿠팡 : 수첩 커버 및 수첩 세트

하이퍼커넥트 : 티셔츠, 스티커

리멤버 : 샤오미 보조 배터리

참고자료

https://yands11.github.io/droid-knights/

https://blog.naver.com/PostView.nhn?blogId=cenodim&logNo=221258932085&redirect=Dlog&widgetTypeCall=true&directAccess=false

+ Recent posts