ลอง Android Instant Apps

Champ AK
Fungjai
Published in
3 min readMay 27, 2017

Android Instant Apps เปิดตัวครั้งแรกในงาน Google I/O 2016 ช่วงเวลานั้นเปิดให้ limited request เท่านั้น ซึ่ง @jiramot เองก็ส่งฟอร์ม request แต่ก็ไม่ได้เมล์ตอบกลับมา ก็เลยอดลองกัน

http://gadgets.ndtv.com/apps/news/google-android-instant-apps-open-to-developers-1695115

มาปีนี้ I/O 2017 เปิดให้นักพัฒนาสามารถใช้งานฟีเจอร์นี้ได้แล้ว g.co/InstantApps

แล้ว Android Instant Apps คืออะไรกัน

Native Android apps, without the installation

คือแอพ Android ที่เป็น native ที่สามารถเข้าถึงและใช้งานได้โดยไม่ต้องมีการติดตั้งลงบนมือถือก่อน

แล้วถามว่ามันดียังไง ส่วนตัวผมคิดว่า ผู้ใช้สามารถเข้าถึงแอพได้ง่ายและเร็วขึ้น และสามารถนำเสนอ User Experience (UX) ในรูปแบบของแอพ native ส่งตรงถึงผู้ใช้ได้ทันที

ตัวอย่างเช่น วันนี้ถ้าผมต้องการส่งเพลงให้เพื่อนฟัง ปกติก็แค่ส่งลิงค์เพลงนั้นไป ถ้าเข้าผ่านมือถือโดยที่ไม่มีแอพก็ฟังผ่าน mobile browser ไป ถ้าบังเอิญเพื่อนมีแอพฟังเพลงใดๆติดตั้งอยู่ในเครื่อง และตัวแอพได้จัดการเรื่อง App Links เพื่อนก็สามารถฟังเพลงผ่านแอพได้ทันที

การมี Instant apps ก็เหมือนเป็นการเพิ่มโอกาส (Reach) ให้ผู้ใช้รับฟังเพลงได้ง่ายขึ้นและรวดเร็วขึ้นนั่นเอง

เพิ่มอีกตัวอย่างจากแอพ Pocket, แอพไว้ bookmark บทความต่างๆที่เราสนใจ หากมีการแชร์ลิงค์บทความจาก Pocket และถ้าผู้ใช้ที่ยังไม่มีแอพกดลิงค์เข้ามาก็จะเปิดหน้าบทความทันที อ่านเพิ่มเติมได้ที่นี่

Instant apps getting started จริงๆ document ในการทำค่อนข้างละเอียดพอสมควร เลยจะพูดถึง 3 ประเด็นที่คิดว่าสำคัญคือ Project structure, App Links และ Testing

Project structure

มารอบนี้ถ้าพูดถึงเครื่องมือมือในการสร้างโปรเจคในการพัฒนา Android เพื่อให้สนับสนุน Instant apps เปลี่ยนไปพอสมควร โดยหลักการคือฟีเจอร์ในแอพควรแยกเป็น module ได้ (modularize) สามารถที่จะถอด หรือ ประกอบรวมกันได้ โดยไม่ breaking สิ่งนี้อาจเป็นฝันร้ายได้ ถ้าหาก codebase ที่เราทำอยู่นั้นไม่ได้ถูกแบ่งโดยฟีเจอร์ แต่ยังไงก็แล้วแต่ document เองก็แนะนำสุดท้ายควร refactor แยกเป็น module จะดีกว่า

ส่วนตัวผมเองก็แยก package ตามฟีเจอร์ เช่นถ้าเป็นฟีเจอร์ login อะไรที่เกี่ยวกับ login ก็จะอยู่รวมกันในนั้น ไม่ได้แยกตาม context ยกตัวอย่างเช่น activities, fragments หรือ services ลองดูอันนี้ประกอบ package by-features not layers

ในเชิงของการทดสอบ testing เอง การแบ่งเป็น feature module เองก็ช่วยให้แบ่งการทดสอบให้เล็กลง (unit test) และน่าจะช่วยให้การทดสอบง่ายขึ้น

เริ่มต้นที่ Gradle 3.0.0-alpha มี plugin ที่เพิ่มมาใหม่

apply plugin: 'com.android.feature'

โดยที่เราสามารถที่จะมีกี่ฟีเจอร์ก็ได้ แต่สิ่งที่ต้องมีคือ base feature module ซึ่งมองว่าเป็น code ที่สามารถ shared กันแต่ละฟีเจอร์เรียกใช้ได้ ก็ควรมาอยู่ใน base module นี้ utility class เป็นต้น รูปร่างก็จะออกมาประมาณนี้

https://developer.android.com/topic/instant-apps/getting-started/images/aia-features-multi.png

บางคนอาจเคยเห็น

apply plugin: 'com.android.library'

แล้ว feature กับ library อันนี้แตกต่างกันอย่างไร ตัว library โดยส่วนใหญ่ code เหล่านี้สุดท้ายจะ generate ออกมาเป็น JAR/AAR ไฟล์ แล้วสามารถที่จะ include เข้าไปใน project อีกครั้งนึง หรือจะอัพขึ้น public repository

ส่วน feature เป็นเหมือนการรวบทั้งฟีเจอร์ที่ runnable และสามารถที่จะ installable ได้ ขึ้นอยู่กับว่าเราเลือกที่จะแบ่งแบบไหน

App Links

เป็นการจัดการเว็บลิงค์ หรือ URI ต่างๆในแอพ เหมือนตัวอย่างส่งลิงค์เพลงข้างต้นที่กล่าวไป Instant apps เอง นักพัฒนาเองก็ต้องเลือกว่าจะจัดการกับ incoming request ยังไง เช่น ถ้ามีคนกดลิงค์ http://example.com/main นักพัฒนาจะจัดการ incoming request เข้ามาและส่งต่อไปยัง endpoint ต่างๆอย่างไร

<activity android:name=”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="www.example.com" />
<data android:scheme="https" android:host="mobile.example.com" />
</intent-filter>
</activity>

ด้านบนบนตัวอย่างง่ายๆ ในการส่งต่อไปยัง MainActivity เมื่อมี incoming link จาก example.com

ถัดไป Instant apps ต้องมีการ verification ว่า domain ที่เราจัดการ App Links เป็นของเราจริงๆ โดยมีขั้นตอนการทำ Declare Website Associations เป็นการนำไฟล์ format json ไปวางบน hosted ของเรา

สุดท้ายเมื่อมีแอพแล้ว จัดการแบ่งฟีเจอร์ module แล้ว verify ลิงค์ hosted เรียบร้อยแล้ว ถึงขึ้นตอนการ Testing

Testing

ตอนนี้ Instant apps ยังทดสอบได้บนเครื่องจริงไม่เยอะ และผมเองไม่มีเครื่องจริงเลยสักเครื่องที่สามารถทดสอบได้ อันนี้คือที่ support ในตอนนี้

You can develop instant apps on the following devices and emulators 
Devices: Nexus 5X, Nexus 6P, Pixel, Pixel XL, Galaxy S7 running Android 6.0 or higher.
Emulator: Nexus 5X image running Android 6.0 (API level 23), x86, with Google APIs. Create the emulator as described in Create and Manage Virtual Devices.

และต้องมีการ Enable Instant apps ด้วย โดยเข้าไปที่ Settings > Google > Instant Apps

Settings > Google > Instant Apps

ผมลองเริ่มต้นจากสร้างโปรเจคง่ายๆ AndroidInstantAppSetup เพื่อทำความเข้าใจโครงสร้าง และทดสอบบน emulator

เมื่อรันโปรแกรมขึ้นมาจะไม่มีการติดตั้งแอพในเครื่อง แต่จะรันผ่าน Google Play ขึ้นมาและมีตัวเลือกให้เราจะเข้าผ่านแอพ หรือ เข้าผ่านด้วย browser

ทั้งหมดที่กล่าวมาเป็นหัวข้อหลักๆ และตัวอย่างง่ายๆสำหรับเริ่มต้นทำความเข้าใจการทำงานของ Instant apps

สำหรับ Instant Apps ไม่ได้บอกนักพัฒนาว่าจำเป็นต้องมี ขึ้นอยู่กับนักพัฒนาเองว่าจะออกแบบแอพยังไง สุดท้ายก็ขึ้นอยู่กับว่า use case มากกว่าว่าแบบไหนที่จะเหมาะสม

สิ่งที่ต้องคำนึงเพิ่มเติมคือเรื่องของขนาดไฟล์ APK document บอกไว้ไม่ควรเกิน 4MB สำหรับนักพัฒนาเองก็ควรคำนึงการเลือกใช้ library, resources หรือ assets ต่างๆ เพื่อไม่ให้เจอปัญหาเหล่านี้

ถัดไปน่าจะเป็นเรื่องของ UX Instant apps ที่ดี document ก็มีกล่าวถึงไว้เช่นกัน https://developer.android.com/topic/instant-apps/ux-best-practices.html

สรุป Android Instant apps in real world นั้น คงต้องเริ่มจากการ refactor codebase กันพอสมควร แล้วหันมามอง use case ที่เหมาะสม

ซึ่งอาจเป็นจุดเริ่มต้นที่ดีที่จะหันมามองการ refactor codebase กัน …

References:

https://developer.android.com/topic/instant-apps/getting-started/index.html

https://developer.android.com/training/app-links/index.html

https://willowtreeapps.com/ideas/an-introduction-to-android-instant-apps

https://github.com/googlesamples/android-instant-apps/

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

--

--