인스턴트 앱(Instant App)

참고링크 :

https://codelabs.developers.google.com/codelabs/android-instant-apps/index.html

https://developer.android.com/topic/google-play-instant/getting-started/create-base-feature-module

https://developer.android.com/topic/google-play-instant/getting-started/convert-to-instant-app

https://developer.android.com/topic/google-play-instant/guides/config-splits

인스턴트 앱이란?

https://developer.android.com/topic/instant-apps/overview?hl=ko

구글 I/O 2017에서 공개된 것으로 설치없이 앱의 일부 기능을 사용해보는 것.

Play Store, Google 검색, SNS 및 링크를 공유하는 모든 곳에서 인스턴트 앱을 사용할 수 있다 함.

Android 6.0 (API 23) 이상에서만 실행됨.

자주 묻는 질문(FAQ)

필요한 것들

앱을 인스턴트 앱에 맞춰 feature 모듈과 APK용 / Instant App용 모듈로 구성해야 함.

인스턴트 앱은 링크 기반으로 진입점을 작업하며, 인증을 위한 웹 도메인이 필요함.

(간단히 로컬 테스트는 실제 도메인 없어도 가능하나, 구글 플레이 배포시는 필요함.)

인스턴트 앱 구조 맞추기

기존 앱을 인스턴트 앱 구조에 맞춰 변경해보자.

기존 프로젝트의 기본 모듈을 base feature로 수정 후 이를 참조하여 APK, Instant App용 모듈을 추가한다.

기존 앱 base feature module로 변경

  1. 기존 app 모듈명을 base feature명으로 수정 (ex. base_module)

  2. base_module의 gradle 파일을 열어 아래와 같이 수정

    // apply plugin: 'com.android.application'
    apply plugin: 'com.android.feature'
    ...
    android {
        ...
        baseFeature true
        ...
    }

APK Module 만들기

  1. Module 추가 (File > New > New Module)

  2. Phone & Table Module 선택

  3. 모듈명 기입.(ex. apk_module)

    앱 이름 및 최소 SDK 버전 등을 확인해야 함.

  4. Add No Activity 선택.

Base Module과 APK Module 연결

  1. base_module의 gradle 파일을 열어 아래와 같이 수정 (applicationIdSuffix 가 있다면 주석 처리)

    android {
        ...
        defaultConfig {
            ...
            //applicationId "com.mycompany.example"
            ...
        }
    }
    ...
    dependencies {    
        ...
        application project(":apk_module")
        ...
    }
  2. apk_module의 gradle 파일을 열어 아래와 같이 수정

    android {
        ...
        defaultConfig {
            // applicationId "com.mycompany.example.apk_module"
            applicationId "com.mycompany.example"
            ...
        }
        ...
        dependencies {
            implementation project(':base_module')
        }
    }
  3. base_module의 AndroidManifest.xml 파일을 열어 아래와 같이 수정

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              package="com.mycompany.example">
    ...
    </manifest>
  4. apk_module의 AndroidManifest.xml 파일을 열어 아래와 같이 수정

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.mycompany.example.app">
    </manifest>

Instant App Module 만들기

  1. Module 추가 (File > New > New Module)

  2. Instant App 선택

  3. 모듈명 기입. (ex. instantapp)

  4. instantapp 모듈의 build.gradle에 아래와 같이 추가

    dependencies {
        implementation project(':base_module')
    }
  5. Instant App에서 사용 가능한 권한 확인

    • ACCESS_COARSE_LOCATION
    • ACCESS_FINE_LOCATION
    • ACCESS_NETWORK_STATE
    • BILLING
    • CAMERA
    • INSTANT_APP_FOREGROUND_SERVICE (API level 26 or higher)
    • INTERNET
    • READ_PHONE_NUMBERS (API level 26 or higher)
    • RECORD_AUDIO
    • VIBRATE

Google Play에서 "Try Now" 을 위한 처리 추가

  1. base_module의 기본 액티비티 사용

  2. base_module의 기본 URL 생성

    <activity android:name="com.example.base_module.MainActivity" ... >
        <meta-data android:name="default-url"
                   android:value="https://example.com/welcome" />
    </activity>

인스턴트 앱 접근을 위한 URL 제공

  1. base_module의 AndroidManifest.xml 파일에서 액티비티에 URL 매핑 적용

    HTTP와 HTTPS 모두 지원해야 함

    <activity android:name="com.example.base_module.MainActivity" ... >
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:scheme="http"
                android:host="example.com"
                android:pathPrefix="/welcome" />
            <data android:scheme="https" />
        </intent-filter>
    </activity>
  2. 인스턴트 앱 실행시 진입할 액티비티의 해당 URL에 autoVerify 옵션 추가

    <activity android:name="com.example.base_module.MainActivity" ... >
         <intent-filter android:autoVerify="true">
             ...
         </intent-filter>
    </activity>

인스턴트 앱 테스트

  1. Android Studio 의 "Run" -> "Edit Configurations"
  2. instantapp 모듈 선택
  3. "General" 탭의 "Launch Options"에서 "Launch" 값을 "URL" 선택
  4. "General" 탭의 "Launch Options"에서 "URL" 값을 실행할 액티비티의 매핑 URL로 입력
  5. 멀티태스킹 화면 등에서 아이콘에 번개표시로 인스턴트 앱 확인 

인스턴트 앱 링크 연결

Android 앱 링크를 설정하여 앱에서 직접 링크의 특정 콘텐츠로 이동하는 용도로 Deep Link와 App Link가 사용됨.

Deep Link

앱의 특정 콘텐츠로 바로 연결하는 URL. 인텐트 필터를 추가하여 인텐트에서 데이터를 추출하여 처리함.

App Link

Android 6.0 (API 23) 이상에서 앱이 주어진 유형의 링크의 기본 처리기로 지정되도록 허용함.

  • 앱 링크는 소유하고 웹 사이트 도메인에 연결되는 HTTP URL을 사용하므로 다른 앱이 링크 사용 불가 (Google 웹 사이트 연결 방법 중 하나를 통해 도메인 소유권 확인 필요)
  • 웹 사이트와 앱의 동일한 콘텐츠에 대해 하나의 HTTP URL을 사용. 앱이 없을 경우 웹 사이트로 이동됨.
  • 인스턴트 앱 지원을 하기 위해 앱 링크 설정
  • 모바일 브라우저, Google 검색 앱, Android 화면 검색, Google Assistant를 통해 Google 에서 URL을 클릭하여 열 수 있음.

Android App Link 추가하기

  1. 특정 컨텐츠에 대한 딥링크를 앱에 생성. (위 내용 중 "인스턴트 앱 접근을 위한 URL 제공" 참조)
  2. 딥링크 확인 추가. 인스턴트 앱에서 사용할 URL의 실제 웹 링크 소유자 확인. (Google Search Console에서 소유자 확인한 사이트에 Digital Asset Links JSON 파일이 있어야 함.) (Developers 문서에는 위와 같지만, Google Search Console에 대한 부분은 안해도 인스턴트 앱이 되긴 했음.) 참조 : https://developer.android.com/training/app-links/


크리스피 크림 도넛에서 내일까지 이벤트하네요.
초코 글레이즈드 무료 쿠폰인데요.
카카오톡에서 친구추가하면 받을수 있네요.

무더운 날씨가 계속되면서 다시 캠핑 시즌이 온 것같네요.

남의 캠핑 보면서 부러운 것 중 하나였던 구이바다!!

쩐이 아직 넉넉치 않아 대체할 것을 찾다보니 신일에서 가스 바베큐라는 것이 있더군요.

이번에 시험삼아 구매하여 캠핑때 사용해보려 합니다.

일단 불안하게 배송된 박스 해체 사진만이라도 올려봅니다;;



'쇼핑' 카테고리의 다른 글

[쇼핑] LG 통돌이 세탁기 알아보기.. 큰 걸로다가..  (0) 2018.01.08
앱 APK에 포함된 버전 코드가 특정 권한(android.permission.CAMERA, android.permission.FLASHLIGHT)을 필요로 합니다. APK에서 이 권한을 사용하는 앱에는 개인정보처리방침 세트가 필요합니다.
 
android.permission.CAMERA
android.permission.FLASHLIGHT

 

NB 플래쉬 앱 (무근본) 에서는 기기의 Flash Light 제어 외에는 사용되지 않습니다.

NB 플래쉬 앱 (무근본) 에서는 인증을 위한 서버 접속 이외에 해당 프로그램은 개인정보를 서버로 전송하지 않습니다. 

NB 플래쉬 앱 (무근본) 에서는 서버에 개인정보를 저장하지 않습니다.

 

궁금하신 점은 이메일 nobasedev@gmail.com 을 통해 문의해주세요.

'Android개발' 카테고리의 다른 글

[Android][InstantApp] 인스턴트 앱 2  (0) 2018.07.24
[Android][InstantApp] 인스턴트 앱 1  (0) 2018.07.24
[Android] DataBinding Library 3  (0) 2018.06.12
[Android] DataBinding Library 2  (0) 2018.06.12
[Android] DataBinding Library 1  (2) 2018.06.12

Google for Mobile I/O RECAP 2018 (10)

10. AI & Cloud. 모바일 개발자를 위한 ML Kit: Machine Learning SDK 소개

  • 발표자 : 신정규 (Founder & CEO, Lablup Inc.)
  • 세션설명 : 모바일 개발자를 위해 더 쉬워진 머신 러닝! Firebase에서 사용 가능한 머신 러닝 SDK, ML Kit가 발표되었습니다. ML Kit을 사용하면 Android와 iOS 모든 플랫폼에서 강력한 머신 러닝 기능을 앱에 적용할 수 있습니다. 초보자도 쉽게 시작할 수 있는 ML Kit을 국내 머신 러닝 전문가, Google GDE인 Lablup Inc.의 신정규 대표가 소개합니다.

TensorFlow

TensorFlow <--> TensorFlow Lite <--> TensorFlow.js

TensorFlow 모델을 가져다 쓰는 애플리케이션 영역이 필요한 시점임.

ML Kit

참고 : https://developers.google.com/ml-kit/

양질의 데이터 부족, 모바일 기기에 맞는 모델이 필요함.

위 이유로 ML, Deep Learning 도입이 어려움.

그래서 ML Kit이 등장하게 됨.

기본 API

  • 이미지 라벨링 : 개체, 위치, 활동, 동물 종, 제품 등을 식별
  • 텍스트 인식 (OCR) : 이미지에서 텍스트 인식 및 추출
  • 얼굴 인식 : 얼굴 및 얼굴 표식 감지
  • 바코드 스캐닝 : 바코드 스캔 및 처리
  • 랜드마크 인식 : 이미지에서 인기있는 랜드 마크 식별
  • 스마트 답장 (coming soon) : 문맥에 맞는 문구 제안

이미지 라벨링, 텍스트 인식, 얼굴인식, 바코드 스캔은 디바이스에서도 직접 사용 가능함.

Custom Model & Cloud Deploy

맞춤형 모델을 지원하고 Cloud 사용하여 배포 가능

디바이스/Cloud API 사용은 거의 동일함.

이미지 라벨의 경우 디바이스 API는 무료, Cloud API는 사용 제한이 있고 정확도는 더 높음.

Q&A

Q : 기본 API 사용은 그냥 가능한가?

A : 요금제 Blaze 이상이면 일부 무료사용이 가능함. (월 1000건까지 무료)

참고 : https://firebase.google.com/pricing/?hl=ko

https://cloud.google.com/vision/?hl=ko#cloud-vision-api-pricing

Google for Mobile I/O RECAP 2018 (09)

09. AI & Cloud. 모바일 개발자를 위한 TensorFlow Lite 소개

  • 발표자 : Kaz Sato (Staff Developer Advocate, Cloud Platform, Google)
  • 세션설명 : TensorFlow Lite는 모바일과 임베디드 디바이스에 최적화된 머신러닝 프레임워크로, 낮은 지연시간과 작은 바이너리 크기로 디바이스 상에서의 머신러닝 추론이 가능하며 안드로이드 신경망 API를 사용한 하드웨어 가속화도 지원합니다. TensorFlow Lite를 통해 최신 AI 기술을 모바일에 적용하는 법을 알아보세요.

TensorFlow

참고 : https://www.tensorflow.org/get_started/

AI, ML, Neural Networks

최근의 AI 서비스는 모바일에서 1차 가공된 데이터를 추출해 서버에 보내 처리함.

모바일에서 이미지 처리시 클라이언트에서 이미지 라벨을 서버로 보내 처리함. 모션 캡쳐의 경우도.

TensorFlow는 Open Source S/W임.

모바일에서도 모델 학습이 가능하나 느려서 GPU가 필요함.

TensorFlow 모델을 모바일에서 사용 가능함.

모바일에서 Machine Learning 의 문제 : Memory, CPU Power, Battery 등

모바일에서 TensorFlow 사용시 처리

  • Freeze Graph : 변수를 상수화
  • Quantization : 32bit float -> 8bit int
  • Compression the Binary with Selective Registration : 12MB -> 1.5MB (for Inception v3)

TensorFlow Lite

참고 : https://www.tensorflow.org/mobile/tflite/

TensorFlow Lite의 빠르고 작은 설계

TensorFlow Lite의 core interpreter는 75KB 크기임. (TensorFlow의 경우 1.1MB)

TensorFlow Lite & ML Kit

참고 : https://developers.google.com/ml-kit/

ML Kit의 Base API 사용이 편함.

use case에 따라 custom models 사용함. (TensorFlow Lite)

TensorFlow Lite Development Flow

참고 : https://www.tensorflow.org/versions/master/mobile/tflite/devguide

Get a model -> Convert -> write ops -> write app

한계점으로는 추론 연산에만 집중되는 문제와 현재 inference 제한있음. (최대 50개의 operators 제공)

적용 사례

참고 :

https://developers-kr.googleblog.com/2017/12/on-device-conversational-modeling-with-tensorflow-lite.htmlhttps://developers-kr.googleblog.com/2017/10/how-machine-learning-with-tensorflow-enabled-mobile-proof-of-purchase-at-coca-cola.html?refer=gaerae.com

Google Assistant, Android Wear의 Smart Reply 기능에 적용. 코카콜라 앱 병뚜껑 번호 인식에도 적용됨.

TensorFlow Lite는 이미 Production App에 적용되고 있음.

Q&A

Q : TensorFlow Lite가 PC에서도 되나?

A : 리눅스라면 됨. Android IOT나 라즈베리파이도 됨.

Google for Mobile I/O RECAP 2018 (08)

08. AI & Cloud. Dialogflow와 ML API를 활용한 챗봇 개발

  • 발표자 : 정명훈 (Customer Engineer, Google Cloud)
  • 세션설명 : 빠르고 효율적으로 구축이 가능하면서도 똑똑한 챗봇을 개발하고 싶다면 꼭 주목해야 할 기술, Dialogflow를 소개합니다! Dialogflow의 강력하고 손쉬운 기능과 머신러닝 API를 사용하여 매력적인 챗봇을 개발하는 방법을 알아보세요.

메신저 사용률이 SNS를 추월함.

참고 : http://www.kinews.net/news/articleView.html?idxno=71223

스마트 디바이스 증가와 대기업들의 참여도 증가로 챗봇 급성장.

참고 : http://gobooki.net/archives/1324

주요 사용 사례 :

  • Customer support
  • Transactions
  • Getting things done

영단어 암기 프로그램

구성 : Chatbot + ML API + Google Assistant

Dialogflow

참고 : https://dialogflow.com/docs/getting-started

Dialogflow에 Topic에 대한 샘플 문장들 입력

규칙기반은 규칙에 대한 모든 정보 입력 필요. (사실상 불가능)

머신러닝 신경망에서 시맨틱 구문 분석으로 학습할 경우 규칙기반 대비 40% 정도 정확도 높음.

Google ML API

참고 : https://cloud.google.com/products/machine-learning/

ML on Google Cloud

  • Translate API : 데이터가 많아 성능이 높음.
  • Natural Language API : 자연어 처리
  • Speech API : 음성인식, 구문힌트나 인식모드로 정확도 향상
  • Vision API : 사진분석, 텍스트 인식
  • Video Intelligence API : 비디오 분석 기술

Q&A

시간 관계상 생략

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 : 현재는 없음.



+ Recent posts