อัพเดตประจำปี Android Bangkok Conference 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 ปกติบ้าง
ทั้งหมดอ่านเพิ่มได้ที่นี่เลย
ส่วนอันนี้ Github
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 แหะ ๆ
สามารถไปอ่านในนี้ได้เลย
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 ตัวอย่างที่เขาทำให้ดูเป็นแอพคล้าย ๆ ดูหนัง
ส่วนรายละเอียดลึก ๆ เขาแนะนำให้ดูคลิปนี้
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
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
จากนั้นก็ 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
อันนี้สไลด์เขา
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
เผื่อหาต่อ
สไลด์ของ session นี้
แล้วขากลับมีไปทานข้าวเย็นร่วมกันด้วย เพราะหิวสุบ ๆ กับชาวคอมมู และ speaker บางท่านด้วยล่ะ ตอนหลังมีคุณ Su กับคุณ Veronica มากับฝน แล้วเขา enjoy สิ่งนี้มากกกก ข้าวเหนียวมะม่วง เป็นสิ่งเดียวบนโต๊ะที่ถ่ายทันล่ะ เผื่อใครสงสัยว่าร้านอะไร ร้านบ้านหญิง Siam Center ชั้น 2 (ที่เมื่อก่อนคือชั้น 4 ตอนนี้คือชั้น 2 งงม่ะ งงมาก ตอนไปแรลลี่แล้วไปกินนํ้าแข็งไสตรงข้ามบ้านหญิงนี่แหละ แต่เหมือนร้านจะไม่อยู่แล้ว ...)
โดยรวมกับข้าวอร่อยมาก ๆ มีผัดผักอะไรสักอย่างอร่อย แต่ผักอะไรไม่รู้จำไม่ได้ แล้วก็ยำสักอย่าง จำได้ว่าใบมันเป็นผักบุ้ง พอมาแล้วตกใจ ใช่ผักบุ้งแน่นะวิ ทำไมใบใหญ่เกินผักบุ้งที่เรารู้จักกันนะ
หลังจากนั้นเขาต่อ After You กัน แต่เราไม่ได้ไปด้วย แหะ ๆ สรุปวันรุ่งขึ้นไถ Facebook เจอโพสพี่เอกได้พวงกุญแจ cry baby มา ก็ว่าเราลืมอะไรไป 🤣
สุดท้ายในฐานะ speaker ของปีนี้ แน่นอนขอบคุณทุกคนที่เสียสละเวลาวันอาทิตย์มางานนี้ โดยเฉพาะคนมาเช้ามาฟัง session เรา และขอบคุณทาง Google Developer Group Bangkok และทุกภาคส่วน ที่มีงานแบบนี้ในทุก ๆ ปีด้วยค้าบ เสื้อคือทรง oversize สีขาว ผ้าหนา ใส่ได้บ่อยแน่นอน
ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย แนะนำให้ใช้ tipme เน้อ ผ่าน promptpay ได้เต็มไม่หักจ้า
ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ