$30 off During Our Annual Pro Sale. View Details »

What's new in Jetpack 2021

What's new in Jetpack 2021

Sungyong An

June 30, 2021
Tweet

More Decks by Sungyong An

Other Decks in Programming

Transcript

  1. Android
    1
    What’s New

    in Jetpack
    Sungyong An

    Android Developer, NAVER WEBTOON

    View Slide

  2. What’s new in Jetpack | Session Jetpack | Q&A
    발표내용은 위에 명시된 2021년도
    Google I/O 영상을 기반으로 준비했습니다.
    2

    View Slide

  3. 3
    02 Stable
    01 Jetpack & Versioning
    04 Additional Talks
    03 Alpha & Beta

    View Slide

  4. android

    jetpack
    Jetpack은 모든 Android 버전과 기기에서 일관된 코드
    를 작성하여, 개발자가 보다 중요한 코드에 집중할 수 있
    도록 도와주는 라이브러리 모음입니다.
    4

    View Slide

  5. Timeline
    2011
    Android

    Support

    Library
    2016
    Constraint

    Layout
    2015
    Data

    Binding
    2017
    Architecture

    Components
    Lifecycle
    ViewModel
    LiveData
    Room
    Kotlin
    2019
    Kotlin first!
    Security
    ViewPager2
    CameraX
    Benchmark
    2018
    Android

    Jetpack
    KTX
    Navigation
    WorkManager
    SavedState
    Paging
    2020
    ViewBinding
    Compose
    Startup
    DataStore
    Window
    Hilt
    2021
    Macrobenchmark
    AppSearch
    Wear Tile
    Emoji2
    5

    View Slide

  6. TOP 1,000 জ ઺

    non-core Jetpack ۄ੉࠳۞ܻܳ 2ѐ ੉࢚ ࢎਊೞח ࠺ਯ
    47%
    2020
    79%
    2021
    6

    View Slide

  7. alpha, beta
    ୹द ੹੄ ઱ӝ৬

    ѐߊ੗ীѱ যڃ ੄޷ੋ૑ ঌইࠇפ׮
    Versioning
    7

    View Slide

  8. 8
    ѐߊ ૓೯ ઺ੋ ۄ੉࠳۞ܻ۽

    APIо ୶о, ߸҃غѢա ࢏ઁؼ ࣻ ੓णפ׮.

    ߡӒо ੓ਸ ࣻب ੓૑݅

    ӝࠄ੸ਵ۽ח Ѩૐغযࢲ ੜ ز੘೤פ׮.
    Alpha
    ӝמ੉ উ੿ചػ ۄ੉࠳۞ܻੑפ׮.

    ੉੹ীח Beta ױ҅ীࢲ

    APIо ߸҃غ૑ ঋח Ѫ੉ ਗ஗੉঻૑݅,

    ੉ઁח बпೠ ޙઁо ߊࢤೞѢա

    ഑਷ ழޭפ౭ ೖ٘ߔী ٮۄࢲ

    APIо ߸҃ؼ ࣻ ੓׮Ҋ ೤פ׮.
    Beta

    View Slide

  9. Q RC৬ Betaח যڃ ର੉о ੓աਃ?
    ৘੹ী Support Libraryীࢲח RC ױ҅о হ঻णפ׮.

    ੉ ҃਋, ߡӒܳ ࣻ੿ೞݶ ߈٘द ಁ஖ ܾܻૉܳ ೧ঠೞҊ,

    ୭न ߡ੹੉ ҅ࣘ ৢۄт ࣻ ੓णפ׮.

    RC ױ҅ীࢲח ߡӒо ࣻ੿غݶ RC ߡ੹݅ ৢܻҊ,

    ୭न ߡ੹ীח ৔ೱ੉ হणפ׮.
    A
    ( * ੄৉੉ ੓ਸ ࣻ ੓णפ׮ )
    9

    View Slide

  10. androidx.annotation:annotation-experimental
    STABLE
    بҳ ߂ ׮ܲ ѐߊ੗о ௏٘ܳ ੉೧ೞחؘ

    ب਑ਸ ઱ח ݫఋؘ੉ఠ
    Experimental Annotations
    10

    View Slide

  11. builder.setAutoCloseTimeout(1000, SECONDS)
    실험적인 기능에는 RequiresOptIn 주석이 사용되어,
    API가 알파 단계인 것을 개발자가 알 수 있습니다.
    Error: This declaration is opt-in and

    its usage should be marked with

    @ExperimentalRoomApi


    or

    @OptIn(ExperimentalRoomApi::class)


    [UnsafeOptInUsageError]
    11

    View Slide

  12. @OptIn(ExperimentalRoomApi::class)


    builder.setAutoCloseTimeout(1000, SECONDS)
    알파 단계인 것을 이해하고 사용을 원하는 경우,
    OptIn을 선언하면 됩니다.
    12

    View Slide

  13. @Target({ElementType.METHOD})


    @RequiresOptIn()


    public @interface ExperimentalRoomApi {}


    @NonNull


    @ExperimentalRoomApi


    public Builder setAutoCloseTimeout(...) {


    ...


    }
    실제로 사용할 때는
    Experimental Annotation을 생성한 후,
    Experimental API 선언하면 됩니다.
    13

    View Slide

  14. 14
    02 Stable
    01 Jetpack & Versioning
    03 Alpha & Beta
    04 Additional Talks

    View Slide

  15. androidx.fragment:fragment
    STABLE
    ࢎਊ੗ ੋఠಕ੉झܳ ੤ࢎਊ оמೠ

    ҳࢿ ਃࣗ۽ ࠙ೡ೧઱ח ୶࢚ച
    Fragment
    15

    View Slide

  16. উ੿ࢿਸ ֫੉Ҋ ޙࢲചغ૑ ঋ਷ ز੘ਸ ઴੉ӝ ਤ೧ ղࠗܳ ѐࢶ೮णפ׮.

    • fragment 1.3.0ਵ۽ সؘ੉౟ೞӝ ੹ী ԙ ܾܻૉ ֢౟ܳ ੍যࠁࣁਃ.

    ActivityResultب ా೤غ঻णפ׮.
    Fragment
    16
    Link: h
    tt
    ps://developer.android.com/jetpack/androidx/releases/fragment#1.3.0

    View Slide

  17. // Obtain the fragment manager. May be a childFragmentManager,


    // if in a fragment, to observe child attachment.


    val fm = supportFragmentManager


    val listener = FragmentOnAttachListener {


    fragmentManager, fragment ->


    // Respond to the fragment being attached.


    }


    fm.addFragmentOnAttachListener(listener)
    onAttachFragment()는 사용 중단되었습니다.
    17

    View Slide

  18. androidx.constraintlayout:constraintlayout
    STABLE
    UI ਤ஖ܳ ૑੿ೞѢա গפݫ੉࣌ਸ ਤೠ

    ਬোೞҊ ૒ҙ੸ੋ ٣੗ੋ दझమੑפ׮
    ConstraintLayout
    18

    View Slide

  19. MotionLayout Editor
    Motion Editor는 애니메이션 디자인을 위한
    인터랙티브 시각 도구를 제공합니다.
    19

    View Slide

  20. MotionLayout
    20
    What's New in
    Design Tools

    View Slide

  21. androidx.camera:camera
    STABLE
    ׮নೠ Android OS ߡ੹ ߂ ੢஖ীࢲ

    ஠ݫۄܳ ઁযೞҊ ಴दೡ ࣻ ੓ח ా೤ػ API
    CameraX
    21

    View Slide

  22. ҕా ӝמ ਃ୒ ߂ ߡӒ ೧Ѿ

    • ֢୹ ࠁ੿

    • ஠ݫۄ ࢚క, ӝמ ੿ࠁী ੽Ӕоמ

    • Camera2 ࢸ੿җ ഐജ
    CameraX
    ୭न ӝӝ ߂ OS ӝמ ૑ਗ

    • HDR Preview*

    • Zoom ratio control

    • Do-Not-Disturb
    ؊ ա਷ ҃೷ਸ ઁҕೞח ࢿמ ѐࢶ

    • ࢎ૓ ୫৔੉ ୭؀ 15% ؊ ࡈۄ૗**

    • ؊ ࡅܲ ୡӝച

    (য়ېػ ੢஖ীࢲ ୭؀ 25 %)
    ** rc01৬ ࠺Үೞৈ, Samsung J4+ ӝӝীࢲ ஏ੿ػ ಣӐчੑפ׮
    * Pixel 4a, 5ীࢲ ૑ਗغݴ, ؊ ݆਷ ӝӝীࢲ ઁҕؼ ৘੿פ׮
    22

    View Slide

  23. // Set up the CameraController


    val cameraController = LifecycleCameraController(context)


    cameraController.bindToLifecycle(lifecycleOwner)


    // Attach the CameraController to PreviewView


    val previewView = findViewById(R.id.preview_view)


    previewView.setController(cameraController)


    // Use the CameraController


    cameraController.takePicture(...)
    CameraController와 PreviewView를 이용하여

    미리보기를 설정하고 사진을 촬영하는 코드입니다.
    23

    View Slide

  24. androidx.hilt:hilt
    STABLE
    Jetpack ਊਵ۽ ҳ୷ػ,

    Dagger ӝ߈੄ ױࣽചػ DI ࣛܖ࣌
    Hilt

    View Slide

  25. class MyViewModel @ViewModelInject constructor(


    @Assisted val handle: SavedStateHandle,


    val repository: Repository


    ) : ViewModel {


    // ...


    }


    implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_version"
    2020
    25

    View Slide

  26. @HiltViewModel


    class MyViewModel @Inject constructor(


    val handle: SavedStateHandle,


    val repository: Repository


    ) : ViewModel {


    // ...


    }


    @AndroidEntryPoint


    class MyFragment : Fragment() {


    val viewModel: MyViewModel by viewModels()


    val navigationGraphScoped: MyViewModel by


    hiltNavGraphViewModels(R.id.nav_graph)


    }
    2021
    Hilt가 Stable 단계로 전환하면서
    Core API에서 ViewModel을 지원합니다.
    SavedStateHandle도 기본으로 주입됩니다.
    26

    View Slide

  27. class MyWorker @WorkerInject constructor(


    @Assisted context: Context,


    @Assisted params: WorkerParameters,


    repo: Repository


    ) : Worker {


    //...


    }


    2020
    27

    View Slide

  28. @HiltWorker


    class MyWorker @AssistedInject constructor(


    @Assisted context: Context,


    @Assisted params: WorkerParameters,


    repo: Repository


    ) : Worker {


    //...


    }


    2021
    AssistedInject를 사용해
    WorkManager 통합도 개선했습니다.
    28

    View Slide



  29. android:name="androidx.work.impl.WorkManagerInitializer"


    android:authorities="${applicationId}.workmanager-init"


    android:exported="false"


    tools:node="remove" />


    WorkManager 2.5.0
    29

    View Slide

  30. Hilt와 WorkManager 2.6를 사용하면
    Manifest에서 ContentProvider 대신
    Startup node를 제거해야 합니다.


    android:name="androidx.startup.InitializationProvider"


    android:authorities="${applicationId}.androidx-startup"


    android:exported="false"


    tools:node="merge">




    android:name="androidx.work.WorkManagerInitializer"


    android:value="androidx.startup"


    tools:node="remove" />



    WorkManager 2.6.0
    30

    View Slide

  31. @HiltAndroidTest


    @UninstallModules(RepositoryModule::class)


    @RunWith(AndroidJUnit4::class)


    class Test {


    @Module


    @InstallIn(ApplicationComponent::class)


    object FakeRepositoryModule {


    @Provides


    fun provideRepo() = FakeRepository()


    }


    }
    2020
    31

    View Slide

  32. @Module


    @TestInstallIn(


    components = SingletonComponent::class,


    replaces = RepositoryModule::class


    )


    object FakeRepositoryModule {


    @Provides


    fun provideRepo() = FakeRepository()


    }
    새로운 TestInstallIn 주석을 사용하여
    테스트 모듈을 삭제,교체할 수 있습니다.
    2021
    32

    View Slide

  33. androidx.work:work
    STABLE
    উ੿੸ਵ۽ प೯೧ঠ ೞח

    ૑ো оמೠ ࠺زӝ ੘সਸ ৘ড೤פ׮
    WorkManager

    View Slide

  34. 2.5+ ߡ੹ࠗఠ ݣ౭ ೐۽ࣁझ জਸ ૑ਗ೤פ׮. (:work:work-multiprocess)

    ߡ੹ 2.7ীࢲח Android S ನӒۄ਍٘ ઁೠਸ ୶о ૑ਗ೤פ׮.

    ▪︎ ੗ࣁೠ ղਊ਷ Effective Background Tasks on Android ࣁ࣌ਸ द୒೧ࠁࣁਃ.

    ੉ઁ WorkManager Inspectorܳ Android Studio Arctic Foxࠗఠ ࢎਊೡ ࣻ ੓णפ׮.
    WorkManager
    34

    View Slide

  35. WorkManager inspector
    35

    View Slide

  36. WorkManager inspector
    36

    View Slide

  37. androidx.room:room
    STABLE
    ࢎਊࢿ, উ੹ࢿ ߂ పझ౟ оמࢿਸ ਤ೧ ࢸ҅ػ

    ؘ੉ఠ߬੉झ ૑ࣘࢿ ۨ੉য
    Room
    37

    View Slide

  38. Kotlin Symbol Processingী ؀ೠ प೷੸ ૑ਗ

    enums ӝࠄ ૑ਗ

    RxJava3 ૑ਗ

    ݺ۸ प೯ ۽Ӧҗ э਷ ੘সਸ ಞೞѱ ೧઱ח QueryCallback بੑ
    Room
    38

    View Slide

  39. @ProvidedTypeConverter


    class TimeStampConverter(timeformat: String) {


    @TypeConverter


    fun fromTimestamp(value: Long) {


    // ...


    }


    }


    Room.inMemoryDatabaseBuilder(context, CacheDatabase::class)


    .addTypeConverter(TimeStampConverter(getPreferredTimeFormat()))


    .build()
    런타임에 TypeConverter 를 설정할 수도 있습니다.
    39

    View Slide

  40. androidx.paging:paging
    STABLE
    ੘਷ ױਤ۽ ؘ੉ఠܳ ࠛ۞য়Ҋ ಴दೞৈ

    ֎౟ਕ௼৬ दझమ ܻࣗझ ࣗ࠺ܳ ѐࢶ೤פ׮
    Paging
    40

    View Slide

  41. Kotlin coroutines৬ Flowܳ ୭਋ࢶਵ۽ ૑ਗ೤פ׮.

    RxJava ژח Guavaܳ ੉ਊೠ ࠺زӝ ۽٬ਸ ૑ਗ೤פ׮.

    repository৬ presentation ҅க੉ ѐࢶؾפ׮.

    ݠܻӖ, ߄ׯӖ, ҳ࠙੗ ߂ ۽٬ ࢚కܳ ૑ਗ೤פ׮.
    Paging 3
    Link: h
    tt
    ps://developer.android.com/topic/libraries/architecture/paging/v3-migration 41

    View Slide

  42. androidx.security:security-crypto
    STABLE
    ౵ੌҗ SharedPreferencesܳ

    উ੹ೞҊ औѱ ঐഐചೞࣁਃ
    Security Crypto
    42

    View Slide

  43. val prefs: SharedPreferences = EncryptedSharedPreferences.create(


    context,


    "prefs_file_name",


    mainKey,


    prefKeyEncryptionScheme = AES256_SIV,


    prefValueEncryptionScheme = AES256_GCM


    )


    // Use the resulting SharedPreferences object as usual.


    prefs.edit()


    .putBoolean("show_completed", true)


    .apply()
    SharedPreferences를 암호화하려면,
    적절한 키와 스키마로 암호화된
    SharedPreference 객체를 생성하면 됩니다.
    43

    View Slide

  44. val passphrase = SQLiteDatabase.getBytes(userEnteredPassphrase)


    val factory = SupportFactory(passphrase)


    val room = Room.databaseBuilder(activity, SomeDatabase.class, DB_NAME)


    .openHelperFactory(factory)


    .build()
    Link: h
    tt
    ps://github.com/sqlcipher/android-database-sqlcipher
    Q
    ୶റী Security-Crypto ۄ੉࠳۞ܻо

    Room੉ա DataStoreܳ ૑ਗೡ ҅ദ੉ ੓աਃ?
    ೱറ ߡ੹ীࢲ DataStore৬ח ా೤ؼ ৘੿ੑפ׮.

    Room਷ ҳ୓੸ੋ ҅ദ੉ হणפ׮.

    ׮݅ SQLCipherܳ ࢎਊೞݶ ૑Әب ঐഐചೡ ࣻ ੓णפ׮.
    A
    44

    View Slide

  45. 45
    02 Stable
    03 Alpha & Beta
    01 Jetpack & Versioning
    04 Additional Talks

    View Slide

  46. androidx.datastore:datastore
    BETA
    SharedPreferencesী ؀ೠ

    рױೞҊ ъ۱ೠ ؀উਸ ઁҕೞח ؘ੉ఠ ੷੢ ࣛܖ࣌
    DataStore
    46

    View Slide

  47. DataStore
    SharedPreferencesܳ ؀୓

    Kotlin coroutines / Flow۽ ৮੹ೠ ࠺زӝ

    RxJava 2 & 3 ૑ਗ
    ৈ۞ ҳഅ୓ ૑ਗ

    Proto DataStore (stronly typed)

    Preference DataStore (ః-ч ह)

    ૒੽ ҳഅب оמ (ex. Kotlin Serialization)
    Link: h
    tt
    ps://developer.android.com/topic/libraries/architecture/datastore 47

    View Slide

  48. ࠺زӝ API
    Shared Preferences DataStore
    ✅ (coroutines, RxJava)
    ✅ (change listener݅ ઁҕ)
    ✅ (runBlocking)





    ✅ (ProtoBuf)







    زӝ API
    UI ॳۨ٘ীࢲ ഐ୹ীب উ੹ೠо?
    য়ܨܳ ಴दೡ ࣻ ੓חо?
    ۠ఋ੐ য়ܨ۽ࠗఠ উ੹ೠо?
    ъೠ ੌҙࢿਸ ࠁ੢ೞח ౟ے੥࣌ API
    ؘ੉ఠ ݃੉Ӓۨ੉࣌ ୊ܻ
    ഋध উ੹ࢿ
    48

    View Slide

  49. val Context.prefStore: DataStore by preferencesDataStore(


    name = USER_PREFERENCES_NAME,


    produceMigrations = { context ->


    // Since we're migrating from SharedPreferences, add


    // a migration based on the SharedPreferences name.


    listOf(SharedPreferencesMigration(context, USER_PREFERENCES_NAME))


    }


    }
    SharedPreferencesMigration를 이용하여
    SharedPreferences에서 DataStore로
    손쉽게 마이그레이션할 수 있습니다.
    Link: h
    tt
    ps://github.com/googlecodelabs/android-datastore 49

    View Slide

  50. androidx.navigation:navigation
    ALPHA
    জ ղ ఐ࢝ਸਤೠ ೐ۨ੐ਕ௼ੑפ׮

    ੉ઁ ׮઺ ߔझఖਸ ૑ਗ೤פ׮
    Navigation
    50

    View Slide

  51. Navigation 2.4.0ী ׮઺ ߔ झఖ ӝמ੉ ನೣغ঻णפ׮.

    • navigation-fragmentח Fragment 1.4.0ী ୶оػ APIܳ ੉ਊ೤פ׮.

    (saveBackStack(), restoreBackStack())

    NavigationUIܳ ࢎਊೞݶ, ӝࠄਵ۽ ഝࢿചؾפ׮.
    Navigation
    51
    Link: h
    tt
    ps://developer.android.com/jetpack/androidx/releases/navigation#2.4.0-alpha01

    View Slide

  52. 52
    Link: h
    tt
    ps://medium.com/androiddevelopers/multiple-back-stacks-b714d974f134
    Fragment: Multiple back stacks
    fragmentManager.commit {


    setReorderingAllowed(true)


    replace(R.id.fragment_container)


    }


    fragmentManager.commit {


    setReorderingAllowed(true)


    replace(R.id.fragment_container)


    addToBackStack("profile")


    }


    fragmentManager.commit {


    setReorderingAllowed(true)


    replace(R.id.fragment_container)


    addToBackStack("edit_profile")


    }

    View Slide

  53. 53
    Link: h
    tt
    ps://medium.com/androiddevelopers/multiple-back-stacks-b714d974f134
    Fragment: Multiple back stacks
    fragmentManager.saveBackStack("profile")


    fragmentManager.commit {


    setReorderingAllowed(true)


    replace(R.id.fragment_container)


    addToBackStack("notifications")


    }

    View Slide

  54. 54
    Link: h
    tt
    ps://medium.com/androiddevelopers/multiple-back-stacks-b714d974f134
    Fragment: Multiple back stacks
    fragmentManager.saveBackStack("notifications")


    fragmentManager.restoreBackStack("profile")

    View Slide



  55. android:id="@+id/swap_stack"


    app:destination="@id/second_stack"


    app:restoreState="true"


    app:popUpTo="@id/first_stack_start_destination"


    app:popUpToSaveState="true" />


    // or


    val navOptions = NavOptions.Builder()


    .setLaunchSingleTop(true)


    .setRestoreState(true)


    .setPopUpTo(


    navController.graph.findStartDestination().id,


    inclusive = false,


    saveState = true


    )


    .build()


    navController.navigate(selectedBottomNavId, null, navOptions)
    직접 API를 호출하는 방법도 있습니다.
    55

    View Slide

  56. androidx.appsearch:appsearch
    ALPHA
    জ ۽ஸ ߂ ӝӝ ੹୓ ৔৉ীࢲ

    Ҋࢿמ ੹୓ ఫझ౟ Ѩ࢝੉ оמ೤פ׮
    AppSearch
    56

    View Slide

  57. AppSearch
    SQLҗ ࠺Ү೧ ݽٚ ӝמ ઁҕ

    Prefix indexing

    Relevance ranking

    Usage scoring
    Ҋә ੹୓ ఫझ౟ Ѩ࢝ ૑ਗ

    Fuzzy matching

    Query expansion

    Language support
    57
    Link: h
    tt
    ps://developer.android.com/guide/topics/search/appsearch
    Local

    Storage
    Person

    Builder
    Message

    Builder
    Platform

    Storage
    Android S+ ࠗఠ ӝӝ ੹୓ Ѩ࢝җ ా೤غח

    ઺ঔ ૘઺ध झషܻ૑о ੓׮Ҋ ೤פ׮. (ই૒ ޷૑ਗ)

    View Slide

  58. ղࠗ੸ਵ۽ Icing Search ۄ੉࠳۞ܻܳ ࢎਊ೤פ׮.
    58
    h
    tt
    ps://android.googlesource.com/pla
    tf
    orm/external/icing/

    View Slide

  59. androidx.benchmark.macro:macro
    ALPHA
    ۽ஸ ژח CI ীࢲ জ द੘दрҗ झ௼܀ ࢿמਸ

    ੿ഛೞѱ ஏ੿೧ࠁࣁਃ
    Macrobenchmark
    * Android Studio Arctic Foxࠗఠ ૑ਗ೤פ׮
    59

    View Slide

  60. ࢿמ ஏ੿਷ য۵׮
    प ࢎਊ੗ ૑಴ח

    ૘҅ؼ ٸө૑ য়ېѦܽ׮.

    ۽ஸীࢲ ѐࢶೞҊ

    ஏ੿ೡ ࣻ ੓যঠ ೠ׮.
    Benchmark ۄ੉࠳۞ܻח

    ࢎਊ୊о ઁೠ੸੉׮.

    Startup੉ա Jankܳ

    ஏ੿ೡ ࣻ হ׮.
    উ੿੸ਵ۽ ஏ੿ೞӝ য۵׮.

    Ӓېࢲ Macrobenchmark

    ۄ੉࠳۞ܻܳ ࢜۽ ࣗѐ೤פ׮.
    60

    View Slide

  61. @get:Rule


    val benchmarkRule = MacrobenchmarkRule()


    @Test


    fun startup() = benchmarkRule.measureRepeated(


    packageName = "mypackage.myapp",


    metrics = listOf(StartupTimingMetric()), // FrameTimingMetric()


    compilationMode = CompilationMode.SpeedProfile(), // None, Speed


    startupMode = StartupMode.COLD, // WARM, HOT


    iterations = 5


    ) {


    pressHome()


    startActivityAndWait(Intent().apply {


    action = "mypackage.myapp.myaction"


    })


    }
    Link: h
    tt
    ps://github.com/android/pe
    rf
    ormance-samples/MacrobenchmarkSample 61

    View Slide

  62. Macrobenchmark प೯ Ѿҗ੄

    ୭ࣗ, ୭؀, ಣӐਸ ഛੋೡ ࣻ ੓णפ׮.

    ݂௼ܳ ௿ܼೞݶ,

    Studio Profiler۽ ੉زೞৈ

    systrace ੿ࠁܳ ࠅ ࣻ ੓णפ׮.
    62

    View Slide

  63. Android Studioীࢲ ۽ஸ۽ ࢿמ ೐۽೙ Ѿҗܳ ࠁѢա,

    ࢎਊ੗ীѱ ৔ೱਸ ઱ӝ ੹ী CIীࢲ ഥӈܳ ഛੋೡ ࣻ ੓णפ׮.
    Macrobenchmark
    63
    Measuring Jank
    and Startup with
    Macrobenchmark

    View Slide

  64. androidx.core:core-google-shortcuts
    ALPHA
    Google যदझఢ౟ ߂ ׮ܲ Google ઁಿ੄

    ز੸ ߄۽оӝܳ ୶о೤פ׮
    Google Shortcuts
    64

    View Slide

  65. ShortcutInfoCompat siCompat =


    ShortcutInfoCompat.Builder(ctx, "id_cappuccino")


    .setShortLabel("Cappuccino")


    .setIntent(Intent(ctx, OrderCappuccino::class.java))


    .addCapabilityBinding(


    "actions.intent.ORDER_MENU_ITEM",


    "menuItem.name",


    asList("cappuccino")


    )


    .build()


    ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat)
    Link: h
    tt
    ps://developer.android.com/guide/topics/ui/sho
    rt
    cuts/creating-sho
    rt
    cuts#gsi-library
    pushDynamicShortcut()를 호출하여
    동적 바로가기를 게시 또는 업데이트할 수 있습니다.
    65

    View Slide

  66. * AppCompat 1.4.0 ੉࢚ ߡ੹ী ӝࠄਵ۽ ನೣؾפ׮
    androidx.emoji2:emoji2-views*
    ALPHA
    All the emoji, everywhere 🤩 🎉
    EmojiCompat
    66

    View Slide


















  67. android:text="\ud83e\udd29 \ud83c\udf89" />




    android:text="\ud83e\udd29 \ud83c\udf89" />




    android:text="\ud83e\udd29 \ud83c\udf89"/>
    Link: h
    tt
    ps://developer.android.com/jetpack/androidx/releases/emoji2#1.0.0-alpha01
    AppCompat을 사용하면 기본으로 활성화됩니다.
    AppCompat을 사용하지 않는 앱의 경우에는
    별도로 제공하는 Widget을 사용해야 합니다.
    67

    View Slide

  68. androidx.startup:startup-runtime
    BETA
    জ द੘द ҳࢿ ਃࣗܳ ୡӝചೞח

    рױೞҊ ബҗ੸ੋ ߑߨ
    Startup

    View Slide

  69. ContentProvider۽ ୡӝചೞ؍ Jetpack ۄ੉࠳۞ܻٜ੉

    ղࠗ੸ਵ۽ Startupਸ ࢎਊೞח ഋక۽ ߸҃غҊ ੓णפ׮.

    • Emoji2 1.0.0+

    • Lifecycle 2.4.0+ (ProcessLifecycleOwner)

    • ProfileInstaller 1.0.0+

    • WorkManager 2.6.0+
    Startup
    Link: h
    tt
    ps://developer.android.com/topic/libraries/app-sta
    rt
    up 69

    View Slide

  70. class MultiProcessInitializationProvider : InitializationProvider()




    android:name=".MultiProcessInitializationProvider"


    android:authorities="${applicationId}:multiprocess.androidx-startup"


    android:exported="false"


    android:process=":multiprocess">




    android:name="myapp.MultiProcessInitializer"


    android:value="androidx.startup" />



    Link: h
    tt
    ps://developer.android.com/jetpack/androidx/releases/sta
    rt
    up#1.1.0-beta01
    멀티 프로세스에서 Startup 라이브러리로
    자동 초기화가 가능합니다.
    70

    View Slide

  71. 71
    02 Stable
    04 Additional Talks
    01 Jetpack & Versioning
    03 Alpha & Beta

    View Slide

  72. Compose

    integrations
    72

    View Slide

  73. What’s new in Jetpack Compose Using Jetpack libraries in Compose
    73
    • Activity

    • ViewModel

    • ConstraintLayout
    • Hilt

    • Paging

    • Navigation
    Compose integrations

    View Slide

  74. 74
    Jetpack Composeܳ ࠁ৮ೞח Ѫਸ

    ݾ಴۽ ೞח ۄ੉࠳۞ܻ ޘ਺ੑפ׮.

    ѐߊ੗о ੌ߈੸ਵ۽ ೙ਃ۽ ೞ૑݅

    ই૒਷ ࢎਊೡ ࣻ হח ӝמਸ ઁҕ೤פ׮.

    • Image loading (Glide, Coil)

    • Insets, System UI Controller

    • AppCompat Theme Adapter

    • Pager & Flow layout

    • Swipe to Refresh, Placeholder

    • Permissions
    Accompanist

    View Slide

  75. 75
    Android XML۽ ੿੄ػ

    Material Components ప݃ܳ

    Jetpack Compose ప݃۽

    ੤ࢎਊೡ ࣻ ੓ח ۄ੉࠳۞ܻੑפ׮.
    MDC-Compose
    Theme Adapter

    View Slide

  76. Form

    factors
    76

    View Slide

  77. What's New in Foldables, Tablets, and Large Screens

    • androidx.window goo.gle/jetpack-window


    • androidx.slidingpanelayout goo.gle/two-pane

    Now is the Time: What's New With Wear

    • androidx.wear d.android.com/wear
    Form factors
    77

    View Slide

  78. And so

    much more…
    78

    View Slide

  79. ݃૑݄ਵ۽,
    79

    View Slide

  80. Q ੉ઁ LiveDataח Deprecated ؼөਃ?
    ইתפ׮. Java ࢎਊ੗ܳ ਤ೧ ਬ૑೤פ׮.

    ࢜۽਍ Jetpack ۄ੉࠳۞ܻח ௏ܖ౯ ӝ߈ਵ۽ ੘ࢿغ঻णפ׮.

    ೞ૑݅ ੉Ѫ੉ LiveDataܳ Deprecatedೠ׮ח ੄޷ח ইתפ׮.

    ਋ܻח ೦࢚ ੉੹ ߡ੹җ੄ ഐജࢿਸ Ҋ۰ೞҊ ੓णפ׮.

    ӒܻҊ RxJavaח ૒ҙ੸੉૑ ঋইࢲ Java݅ ࢎਊೞח ҃਋,

    LiveDataо о੢ рױೞҊ ഴܯೠ ؀উੑפ׮.

    ٮۄࢲ LiveDataח ҅ࣘ೧ࢲ ૑ਗؼ ৘੿ੑפ׮.

    ׮݅ ୭Ӕী LiveData৬ Flowܳ ࠺ҮೞҊ, ل рী ੹ജೞח

    ߑߨਸ ׸਷ ࢜۽਍ ࠶۽Ӓ ನझ౟ܳ ѱद೮णפ׮.

    ೠߣ ੍যࠁदח Ѫਸ ӂ೧٘݀פ׮.
    A
    80
    Link: h
    tt
    ps://medium.com/androiddevelopers/migrating-from-livedata-to-kotlins-
    fl
    ow-379292f419
    f
    ( * ੄৉੉ ੓ਸ ࣻ ੓णפ׮ )

    View Slide

  81. Q Flowח ঱ઁ Stable੉ ؼөਃ?
    ؀ࠗ࠙੄ APIח ੉޷ Stableੑפ׮.

    ୭Ӕ ௏ౣܽ 1.5੉ ҕѐغ঻Ҋ, ૑Ә ߄۽ ࢎਊೞप ࣻ ੓णפ׮.

    ӒܻҊ উ٘۽੉٘ীࢲ Flowܳ ࢎਊೞח ߑߨҗ ৘ઁ৬ э਷

    ޙࢲب ҍ ઁҕೞ۰ ೤פ׮. ૑Ә ࢎਊ೧ࠁࣁਃ!
    A
    81
    Link: h
    tt
    ps://developer.android.com/kotlin/
    fl
    ow
    ( * ੄৉੉ ੓ਸ ࣻ ੓णפ׮ )

    View Slide

  82. Q
    KMM੉ ҙबਸ ߉Ҋ ੓חؘ, = Kotlin Multiplatform Mobile

    Jetpack ۄ੉࠳۞ܻب ૑ਗೡ ҅ദ੉ ੓աਃ?
    ই૒ ҳ୓੸ੋ ҅ദ਷ হणפ׮.

    Jetpack ۄ੉࠳۞ܻח ೦࢚ উ٘۽੉٘ܳ ਋ࢶਵ۽ Ҋ۰೤פ׮.

    ӒܻҊ ࣻߔ݅ݺ੄ ѐߊ੗о ࢎਊೞח Jetpack ۄ੉࠳۞ܻܳ

    ௏ౣܽ ݣ౭೒ۖಬਵ۽ ੘ࢿೞח Ѫ਷ Ӓܻ औ૑ ঋणפ׮.

    ޛۿ Ӓۧ׮Ҋ ׮ܲ ೒ۖಬਸ ૑ਗೡ ࣻ হ׮ח ੄޷ח ইפҊ,

    ݣ౭೒ۖಬਸ ૑ਗೞ۰ݶ ݢ੷ ௏ౣܽਵ۽ ੹ജ೧ঠ ೞחؘ,

    पઁ۽ Jetpack ۄ੉࠳۞ܻо ௏ౣܽਵ۽ ੹ജغӝө૑ח

    5֙੉ۄח ҭ੢൤ য়ےदр੉ Ѧ۷णפ׮.

    ژ Javaܳ Ҋࣻೞח ౵౟ցо ੓׮ח ੼ب ੓णפ׮.

    ٮۄࢲ ই૒਷ ݺഛೠ ఋ੐ۄੋ੉ হणפ׮.
    A
    82
    Link: h
    tt
    ps://kotlinlang.org/docs/mobile/home.html
    ( * ੄৉੉ ੓ਸ ࣻ ੓णפ׮ )

    View Slide

  83. Q
    KSP۽ ݃੉Ӓۨ੉࣌ ೡ ҅ദ੉ ੓աਃ?

    = Kotlin Symbol Processing
    ֎, ૓೯઺ੑפ׮.

    KSPח Java੄ annotation processor৬ ਬࢎ೤פ׮.

    Jetpack ۄ੉࠳۞ܻীח Room੉ա DataBinding୊ۢ

    ݆਷ annotation processorо ੓חؘਃ.

    ૑Ә਷ Roomী݅ प೷੸ਵ۽ ઁҕೞҊ ੓णפ׮.

    KSPо উ੿ചغݶ ׮ܲ ۄ੉࠳۞ܻ੄ annotation processorب

    ݽف KSP۽ ߸ജೡ ৘੿ੑפ׮. Dagger৬ Hiltب ನೣؾפ׮.

    Roomਵ۽ పझ౟೮ਸ ٸח ࠽٘ ࣘبо ௼ѱ ѐࢶغ঻णפ׮.

    খਵ۽ KSPо ঴݃ա ѐࢶೡ ࣻ ੓ਸ૑ ӝ؀ؾפ׮.
    A
    83
    Link: h
    tt
    ps://github.com/google/ksp
    ( * ੄৉੉ ੓ਸ ࣻ ੓णפ׮ )

    View Slide

  84. ؊ ա਷ Jetpack੉ غب۾, ੉गח ١۾೧઱ࣁਃ.
    👆
    84

    View Slide

  85. Sungyong An

    Android Developer, NAVER WEBTOON

    @fornewid
    Thank you!
    deveopers.android.com/jetpack

    androidx.dev

    speakerdeck.com/fornewid/
    whats-new-in-jetpack-2021
    Resources
    85

    View Slide