อัพเดตประจำปี Android Bangkok Conference 2024 มีอะไรน่าสนใจบ้าง?

Event Dec 23, 2024

กว่าจะได้นั่งสรุปก็นานเลย เพราะติดปั่นสไลด์งาน National Coding Day: Workshop Day อยู่ ไหน ๆ ก็จดมา ถ่ายรูปมา เก็บสไลด์มา เอามาลงหน่อยก็แล้วกัน

ปีนี้จัดวันที่ 17 พฤศจิกายน 2567 ที่ SCB NEXT TECH ที่เดียวที่เดิม และมี 8 session เรียกได้ว่า มี speaker ชายหญิงในอัตราเท่ากันมากเลยนะเอาจริง ๆ 😆

บรรยากาศหน้างาน

ขอแลกชาเขียวเย็นเติมพลังแปปปปปปป

พิธีเปิด ใกล้ขึ้นเวทีแล้วสินะ


Create Android Widget First Time by Jetpack Glance | Monthira Chayabonjonglerd – Senior Engineer, TrueMoney

session ของเราเอง ถ้าไม่เคยสร้าง widget มาก่อน และอยากลองสร้างบน Jetpack Compose เราสามารถใช้ Jetpack Glance ได้นะ แล้วมันใช้ยังไง มีส่วนเหมือนหรือต่างยังไงกับการสร้าง widget ปกติ และ Jetpack Compose ปกติบ้าง

ทั้งหมดอ่านเพิ่มได้ที่นี่เลย

ทดลองทำ widget gas tracker ฉบับ Jetpack Compose กันเถอะ
เห็นชาวคริปโตติดตั้ง widget widgETH เป็น Ethereum gas price tracker app บน iOS แต่บน Android ไม่มีแบบเขาเลยต้องมาทำเองล่ะสิ!!

ส่วนอันนี้ Github

GitHub - mikkipastel/GasTrackerWidget: Android widget application for Ethereum Gas Tracker.
Android widget application for Ethereum Gas Tracker. - mikkipastel/GasTrackerWidget
https://github.com/mikkipastel/GasTrackerWidget

State of JUnit 5 in Android Aung | Kyaw Poing – GDE Android

เกี่ยวกับการเอา JUnit ไปใช้ test นั่นแหละ ซึ่งเล่าความเป็นมาของ JUnit 4 แล้ว JUnit 5 มีอะไรบ้าง ซึ่งตัว Android เองก็ไม่ได้ support โดยตรงนะ

JUnit 4 จะเป็น one class - one runner

JUnit 5

  • cleaner reporting อ่านง่ายว่า test case ไหนผ่าย
  • Kotlin friendly
  • Multiple Assertions: ใส่ assertAll() ครอบข้างนอก
  • Asserting Exceptions: check case พวกนี้ได้ พวก exception ต่าง ๆ
  • Assumption: พวก abort ใด ๆ
  • Inner Test: ใช้สำหรับบาง scenario เช่น login หรือพวก js
  • Tagging: บอกประเภทของ test เช่น fast, slow
  • Condition Test: test หลาย ๆ รอบ แต่ละรอบอยากได้ผ่านเท่าไหร่ fail เท่าไหร่
  • Parameterized Test: ใส่ค่าต่าง ๆ ในการ test
  • Dynamic Test เช่น เปิดไฟล์เรียก API

Backward JUnit 4

  • Similar Structures: เขียนคล้าย ๆ กัน
  • rule -> extensions

ตอนนี้ Android ไม่ได้ support JUnit 5 แบบ official เลยใช้ 3rd-party plugin

support android test ที่เป็น instrumental, compose

ส่วน Robeletric Android JUnit 4 ตอนี้ no official support แล้วก็ Firebase Test Lab จะมี instrumental test ให้เราเทสกันเนอะ

test level ไหน ควรใช้อะไร ดูในนี้ได้เลย

อันนี้สไลด์เขา

The Future of LINE Retail Chatbot using Gemini Al and Vertex Al | Punsiri Boonyakiat – Senior Data Engineer, CJ Express

ใครไม่ได้ไปงาน LINE Thailand Developer Conference 2024 ก็มาฟังเป็น version พูดช้าลงในงาน ส่วนทางนี้ ใช่ค่ะ ฟังเป็นรอบที่ 2 แหะ ๆ

สามารถไปอ่านในนี้ได้เลย

อัพเดตเทคบ้านเขียวประจำปี กับงาน LINE Thailand Developer Conference 2024
เดี๋ยวนี้มางานไลน์แล้วเหมือนอัพเดตทั้งปีของไลน์จากงานนี้เลยทีเดียว ห่างหายจากการทำ chatbot บ้านนี้มานานเลย แถมได้ความรู้ใหม่ ๆ นอกสายงานเราด้วย ไม่ว่าจะเป็น AI ที่มีหลาย session แล้วก็ฝั่ง web dev อ่ะเนอะ

Seamless Navigation with Shared Element Transitions | Fedor Erofeev – Senior Android Developer Seven Peaks

การทำ navigation แบบมี animation บน Jetpack Compose ว่าถ้าไปหน้าถัดไป จะแสดงแบบนี้จะ handle ยังไง

Compose 1.7.0 เพิ่มสิ่งนี้เข้ามา คือ Shared Elements และ Bounds ใส่ใน Modifier ตัวอย่างที่เขาทำให้ดูเป็นแอพคล้าย ๆ ดูหนัง

ส่วนรายละเอียดลึก ๆ เขาแนะนำให้ดูคลิปนี้

https://www.youtube.com/watch?v=PR6rz1QUkAM

sharedElements() จะ match with visual ใช้กับพวก text same size, icon, และอื่น ๆ

sharedBounds() ใช้สำหรับ set animation กับ resize mode จะมี column & row, async image, test with difference size เช่น ย้าย text item ไปด้านบน

state ของ animation อย่างคร่าว ๆ

ตัวอย่างการใช้ Shared Elements คือย้ายตำแหน่งปุ่ม search จากขวา ไปซ้าย ตัว Navigation และ Shared Elements มีการทำ wrap provider ไว้ใน share layout และทำ scope

handing nullability มีการใส่ throw ใด ๆ ที่ scope หรือ provide หรือ wrapper

manage key จะมี key อ้างอิงในการ animate มีการใช้ data class ที่ชื่อว่า ShareElementKey ในการ change position และแบ่ง type จาก ShareElementType

renderIsSharedTransitionScopeOverlays() ใช้กับ view ที่มีความ overlay อย่าง FlatingButton อยู่มุมขวาล่างตลอด/ draw over

missing thing: no interoperability, image composable, shape clipping ShareBound()

Coli & AsyncImage มีการใช้ cache เพื่อ smooth มากขึ้น และมีเรื่อง image blinking

อันนี้ Github ที่เขา demo

GitHub - logomount/the-movie: Example project for Android Bangkok 2024 GDG event.
Example project for Android Bangkok 2024 GDG event. - logomount/the-movie
https://github.com/logomount/the-movie

The Power of Jetpack Compose API: Effortless Scalability Across Large Screens and Mobile Platforms | Su Myat Tun – GDE Android

มาอัพเดตของใหม่ Jetpack Compose กันก่อนเลย ตอนนี้มี pull-to-refresh กับ HTML formating แล้ว รวมถึงพวก carousel ด้วยนะ ต่อมาพูดถึง large-screen ว่าทำไมเราต้องใส่ใจ และเราจะ handle ได้อย่างไร ปิดด้วย Compose Multiplatform ที่เอาไปทำ UI แล้วเราจะเริ่มสร้างโปรเจกต์เหล่านี้ได้อย่างไร เอาจริง ๆ session นี้เราได้รู้อะไรหลายอย่างเหมือนกันนะ

การมี Jetpack Compose ทำให้ทำ native android app ได้สวยขึ้น

และ top 1k app ใช้ compose แล้ว 42%

อะไรมาใหม่บ้างใน Jetpack Compose

  • lazy list animation - LazyColumn
  • shared element - AnimatedContent
  • pull-to-refresh
  • ContextualFlowRow และ ContextualFlowColumn เช่น +3
  • html formating
  • segmented button

  • carousel

what & why large screen

  • 300m large screen และ 100m foldable phone ในปี 2027 + 20% ที่จะซื้อ tablet/foldable phone
  • expend, combine content
  • NavigationSuiteScaffold เป็น layoutType ใส่ logic ต่าง ๆ เพื่อรองรับการแสดงผลจอที่กว้างขึ้น
  • ListDetailPanScaffold
  • SupportingPaneScaffold เช่น ดูวิดีโอ

Compose in Multiplatform - single codebase

  • kotlin multiplatform ก็ same business logic เหมือนกัน
  • ส่วนใน session นี้เป็น Jetpack Compose + Kotlin Multiplatform

แล้วเราจะ migrate iOS ยังไง? ตัวอย่างเป็นแอพเทรดคริปโตแหละ ให้ check dependency, expect/actual, list อันที่อยู่เฉพาะบน native

app's dependency ที่ใช้

Kotlin Multiplatform Wizard เป็น tool ที่ใช้ setup project

Kotlin Multiplatform Wizard | JetBrains
Create your first multiplatform project using the Kotlin Multiplatform wizard for Android, iOS, and Desktop, or use one of the pre-made templates.
https://kmp.jetbrains.com/

จากนั้นก็ walk through ตัวโปรเจกค์ ดู dependency แล้วก็ folder ต่าง ๆ common, ios, android ประมาณนี้

Maximize productivity | Steve Jung Technical – Lead Android Engineer, Grab

เกี่ยวกับการเขียนโค้ดบางส่วนที่ซํ้า ๆ ให้มี productivity มากขึ้นในทีมได้อย่างไร

อันนี้อาจจะไม่ได้จดเยอะมากนะ

Firebase-android-ktx: kotlin + coroutine

  • usecase in repo
  • และถ้าเราเรียกบ่อย ๆ ซํ้า ๆ extreme case จะเกิดอะไรขึ้น

Retrofot-ish, firebase-database

compose Lifecycle-awareness in ViewModel

แล้วเราจะ init data ที่ Compose ยังไง มี 2 วิธี

  • ViewModel.init()
  • launchedEffect() + Lifecycle-awareness

Building Intelligent Android Apps with Leveraging On-Device Machine Learning | Veronica Putri Anggraini – GDE Android

ช่วงนี้กระแส AI มาแรง เราจะเอา machine learning มาใช้ในแอพได้อย่างไร และเราเริ่มต้นอย่างไรได้บ้าง

ช่วงแรกไปเข้าห้องนํ้า ไปเห็นรูปในงานมีกล่าวถึงน้องหมูเด้งด้วย 😆

traditional application ใช้ if-else ในยุคนี้เป็นยุค AI มีการนำ machine learning เข้ามาใช้ รู้ได้เลยว่ามันคืออะไร

machine learning ในแอพจะแบ่งเป็น 2 แบบใหญ่ ๆ คือ on device กับ on cloud

no framework: train model จากข้างนอกแล้วใส่ในแอพ

framework: เราสามารถ plug เข้าแอพได้เลย เช่น ML Kit, LiteRT, Gemini

ถ้าเป็น machine learning เกี่ยวกับรูปก็จะมี Image Classification, Object Detection, Image Segmentation ซึ่งสไลด์นี้อธิบายเห็นภาพชัดดีว่าอันไหนเป็นยังไง

มาลองทำกัน เขาวาง system plan ของตัว demo ไว้ประมาณนี้

  • เตรียม model หาจาก kaggle ได้
  • test model ที่ MediaPipe Studio เพื่อ make sure
  • import model ที่ project
  • Setup ImageClassifier – ใช้ ML ในแอพ
  • convert to TensorImage & perform interface
  • output ที่ได้
  • ใช้ CameraX ในการ preview & capture
  • ImageAnalysis ที่ CameraX ด้วย
  • convert ImageProxy to TensorImage
  • perform inference

อันนี้ demo ตามหาขิง เอ้ยยย ขมิ้น บางคนอาจจะมองไม่ค่อยออกอะไรงี้

แบบ YouTube short

อันนี้สไลด์เขา

[Surabaya] - Building the Next Generation of Android Apps with AI
Building the Next Generation of Android Apps with AI Hello, everyone. Good to see you all. I’m Veronica currently working as Android Engineer at LINE Bank, and since 2 years ago be apart of Google Developer Expert Family. So my expertise is Android. Today I wanna share to all of you about buildin...
https://docs.google.com/presentation/d/1PgPEPisEsBkcTPXwOrS8X51WS0JNKxAR1C1SoPG-AkA/mobilepresent

Why App Signing Matters for Your Android Apps | Somkiat Khitwongwattana – GDE Android

หลาย ๆ คนคงจะรู้จัก process การ build application ส่ง Google Play กันมาแล้ว session นี้จะมาลงลึกถึง process เหล่านี้ เกี่ยวกับ key และ APK Signature Scheme ฟังแล้วบอกเลยต้องไป check กับที่ทำอยู่แน่นอน และทำไม minSDK ต้อง Android 7 (API level 24) ขึ้นไปด้วย

การบิ้วแอพส่งขึ้น store เป็น process ที่สำคัญ ในการ deliver feature ให้ user ซึ่งไฟล์ aab ของเราสร้างจาก Android Studio เราอัพขึ้น Google Play จะ convert aab ของเราเป็น apk ที่เหมาะสมของ device นั้น ๆ เพราะแต่ละเครื่องมี spec ต่างกัน ก่อนแอพจะอยู่ที่ device จริง และมีอะไรบางอย่างที่เราไม่เคยรู้มาก่อน

Benefit จากการทำ signing

  • Integrity: confirm package ว่ามาจากเราจริง ๆ นะ
  • Security: ป้องกันคนเอาไฟล์แอพของเราไปแอบอ้างเป็นเจ้าของ sign ทับ เพราะ signature file พังแล้ว

ปกติเราจะบิ้วแอพผ่าน Android Studio หรือบางที่ก็จะมี CI/CD ทั้งสองแบบผ่าน signing key ออกมาเป็นแอพที่เป็น apk หรือ aab

APK Signature Scheme

script การยืนยันตัวตน และ code ข้างในยังเป็นเหมือนเดิม แบ่งจากการทำ signing

  • v1 Scheme: มาจาก Java รองรับ code Java เท่านั้น และถ้าเปลี่ยน resource แต่ตัว signature ยังเหมือนเดิม → APK Signature Scheme v1
  • v2+ Scheme: ครอบคลุมทุกไฟล์ เป็นการแทรก APK Signing block เข้าไป → APK Signature Scheme v2, v3, v3.1, v4

Signature Algorithm: มีหลายอันมาก ๆ หลัก ๆ เป็นพวก RSA, EC และ DSA

APK Signature Scheme v1: Android ทุก version support อันนี้เสมอ แต่ไม่แนะนำให้ใช้ เนื่องจากเรื่องความปลอดภัย และ performance

APK Signature Scheme v2: support Android 7.0 ขึ้นไป ถ้า Android version ตํ่ากว่านี้เป็น APK Signature Scheme v1 ข้อดีเลย คือ แอพติดตั้งไวขึ้น, verify integrity, apk file เล็กลง

APK Signature Scheme v3: suport Android 9 ขึ้นไป อยู่บนพื้นฐาน APK Signature Scheme v2 มี feature เพิ่ม คือ key rotation เป็นการ rotate keystore ถ้าสมมุติแอพเราตั้งมาแล้ว 10 ปี แล้ว key มัน expire ล่ะ ทำให้แอพของเราติดตั้งลง Android device ไม่ได้เลย ดังนั้นจะต้อง upgrade key ตัวใหม่เอาไปได้ และมี algorithm ที่แข็งแรงมากขึ้น ใช้ของใหม่ทับของเก่าได้เลย อีกทั้งมีหลักการ proof-of ใด ๆ ที่ชาว web3 จะได้ยิน proof-of-work เอย proof-of-stack เอย อันนี้เป็น proof-of-rotation รู้จัก key ก่อนหน้า ถึงจะเชื่อมของใหม่ได้

APK Signature Scheme v4: รองรับ Android 11 ขึ้นไป ทำให้ sign app ได้เร็วขึ้น load บางส่วน และ verify บางส่วนก่อนได้ อีกทั้งใช้ markle hash tree ในการทำ verify ได้เร็วขึ้น ทำให้ทำงานเร็วขึ้นอีกด้วย และมีไฟล์ .idsig แยกมาด้วย

APK Signature Scheme v3.1: รองรับ Android 13 ขึ้นไป สงสัยล่ะสิทำไมไม่ version 5 อะไรงี้ เพราะว่าแก้บัค version 3 แล้วก็ backward version 3 ให้ทำงานกับ version 4 ได้ด้วย

อันนี้แผนภาพการทำงานตอน install APK ว่าผ่าน process อะไรบ้าง

ถ้าเราอยากใช้ทำยังไง? สามารถไปเปิดที่ gradle ได้นะ ใส่ enableV3Signing กับ enableV4Signing โดยตอนที่ pentest ใช้ version 3 ผ่าน

Play App Signing

ใช้ key sign เป็น apk ให้ สามารถใช้ key เดิมได้ แต่แนะนำให้ generate upload key ซึ่งใช้ได้ตลอดเมื่อ build app ส่งเฉพาะ Google Play

การทำงาน signing บิ้วแอพผ่าน upload key แล้วส่งแอพขึ้น Google Play และ sign ไปหา user

PEPK tool (Play Encrypt Private Key tool): เป็น tool ที่เอาไว้ gen private key ส่งให้ Google Play เก็บไว้ในที่ปลอดภัย

ซึ่งเราสามารถ upgrade key เอง หรือผ่าน Play Store ก็ได้

algorithm ทื่ใช้: pentest บอกว่าไม่ strong พอ ควรใช้ RSASSA-PSS with 4096 bits ขึ้นไป แล้ว algorithm ที่มีอยู่ล่ะ

  • Play App Signing: RSA key with 4096 bits (RSASSA_PKCS1V15)
  • Android Studio: RSA key with 1024 bits (RSASSA_PKCS1V15)

เผื่อ ITSEC ถามประเด็นนี้ ยื่นรูปนี้ได้เลยยยย

Key upgrades on Google Play

  • Android version 13 ขึ้นไป: support 3.1, upgrade มาใช้ key ใหม่
  • Android version 7 - 12: ใช้ key เก่า ให้ Google Play ดูให้
  • Android version ตํ่ากว่า 7: เป็น v1 ไม่แนะนำในด้านความปลอดภัย

Google Play จำ key เก่า, protect

Source Stamp Signer: มาจาก Google Play ดูว่าแอพเราถูก download จากไหน

Post-key rotation เพิ่ม SHA-1, SHA-256 ห้ามลบ key เก่าเดี๋ยวแตก

อยาก gen ทำยังไง? jetbrain java runtime ได้ keystore ที่แข็งแรงมากขึ้น

APK Signature analysis

  • apksigner: เป็น tool ที่เอา apk มาแกะ แบบไม่ reverse engineer เรียก command line เพื่อ signing เอามา verify signature ได้
  • apksigtool: เป็น 3rd-party บอก signing algorithm เน้น algorithm ที่ใช้ เอาไป check ได้

สรุป

  • Google Play support key rotation ได้ / access data ด้วย signing key เดียวกัน ทำให้ส่งข้อมูลโดยไม่ผ่าน intent ได้
  • ใช้ robust signature algorithm กับ key ของเรา
  • ให้เก็บ signing key และ upload key แยกกัน
  • เปิดใช้งาน v3 และ v4 scheme
  • update minSDK เพื่อปิดการใช้งาน v1 scheme ก็คือแอพขั้นตํ่าต้อง Android 7 ขึ้นไปล่ะ
  • ทำ spp signing เพื่อป้องกันคนแก้โค้ดและแอบอ้าง แต่ไม่กัน reverse engineer นะ ยังสามารถ sign ของใหม่ทับอยู่

Resource

เผื่อหาต่อ

App signing | Android Open Source Project
https://source.android.com/docs/security/features/apksigning
Use Play App Signing - Play Console Help
With Play App Signing, Google manages and protects your app’s signing key for you and uses it to sign optimized distribution APKs that are generated from your app bundles. Play App Signing stores your
https://support.google.com/googleplay/android-developer/answer/9842756
apksigner | Android Studio | Android Developers
Learn about the apksigner tool which allows you to sign APKs and to confirm that an APK's signature will be verified successfully on all versions of the Android platform supported by those APKs.
https://developer.android.com/tools/apksigner
APK Signing Block considerations
APK Signing Block considerations. GitHub Gist: instantly share code, notes, and snippets.
https://gist.github.com/obfusk/31c332b884464cd8aa06ce1ba1583c05

สไลด์ของ session นี้

Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
Why App Signing Matters for Your Android Apps Somkiat Khitwongwattana Android GDE @akexorcist
https://docs.google.com/presentation/d/1swg-1Og5ZhzoIM82p3c0ZByM0OoUcLgzg8_622T5mHY/edit

แล้วขากลับมีไปทานข้าวเย็นร่วมกันด้วย เพราะหิวสุบ ๆ กับชาวคอมมู และ speaker บางท่านด้วยล่ะ ตอนหลังมีคุณ Su กับคุณ Veronica มากับฝน แล้วเขา enjoy สิ่งนี้มากกกก ข้าวเหนียวมะม่วง เป็นสิ่งเดียวบนโต๊ะที่ถ่ายทันล่ะ เผื่อใครสงสัยว่าร้านอะไร ร้านบ้านหญิง Siam Center ชั้น 2 (ที่เมื่อก่อนคือชั้น 4 ตอนนี้คือชั้น 2 งงม่ะ งงมาก ตอนไปแรลลี่แล้วไปกินนํ้าแข็งไสตรงข้ามบ้านหญิงนี่แหละ แต่เหมือนร้านจะไม่อยู่แล้ว ...)

โดยรวมกับข้าวอร่อยมาก ๆ มีผัดผักอะไรสักอย่างอร่อย แต่ผักอะไรไม่รู้จำไม่ได้ แล้วก็ยำสักอย่าง จำได้ว่าใบมันเป็นผักบุ้ง พอมาแล้วตกใจ ใช่ผักบุ้งแน่นะวิ ทำไมใบใหญ่เกินผักบุ้งที่เรารู้จักกันนะ

หลังจากนั้นเขาต่อ After You กัน แต่เราไม่ได้ไปด้วย แหะ ๆ สรุปวันรุ่งขึ้นไถ Facebook เจอโพสพี่เอกได้พวงกุญแจ cry baby มา ก็ว่าเราลืมอะไรไป 🤣

สุดท้ายในฐานะ speaker ของปีนี้ แน่นอนขอบคุณทุกคนที่เสียสละเวลาวันอาทิตย์มางานนี้ โดยเฉพาะคนมาเช้ามาฟัง session เรา และขอบคุณทาง Google Developer Group Bangkok และทุกภาคส่วน ที่มีงานแบบนี้ในทุก ๆ ปีด้วยค้าบ เสื้อคือทรง oversize สีขาว ผ้าหนา ใส่ได้บ่อยแน่นอน


ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย แนะนำให้ใช้ tipme เน้อ ผ่าน promptpay ได้เต็มไม่หักจ้า

ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.