Vibie ลดขนาดแอพได้กว่า 80 MB ได้อย่างไร

Siwakorn Petchuchuay
Donuts Bangkok Family
3 min readNov 22, 2019

ด้วยความที่เป็นแอพ Live Streaming ที่มีฟีเจอร์และกิจกรรมมากมายภายในแอพ ที่เราทำมาตั้งแต่ต้น ทำให้ App size มัน growth ขึ้นเรื่อยๆ จนถึงวันนึง Vibie มีขนาดแอพอยู่ที่ 102MB ซึ่งตอนนั้นเรารู้สึกแล้วว่ามันใหญ่เกินไปมากแล้ว จนทำให้ต้องเริ่มหาวิธีลดขนาด ซึ่งจะมาบอกเล่าเผื่อมีใครหลงมาอ่านแล้วเอาไปใช้ได้

App Bundle

ในช่วงนั้น Google ปล่อยฟีเจอร์ App Bundle มา ทางเราก็ได้ทดลองใช้ ปรากฏว่าสามารถลดไปได้อยู่ที่ประมาณ 46 MB

ขอเล่าหลักการโดยคร่าวๆ ของ App Bundle คือ

ปกติ Assets ต่างๆ ในแอพ เวลาเราใส่ไป แล้ว release มันก็จะมัดรวมทุกอย่างลงในไฟล์ APK อันเดียว (1 ไฟล์มีทุกขนาดจอ หรือทุกภาษา) หมายความว่า User ติดตั้งแอพในเครื่องที่ใช้ขนาดจอ xhdpi มันจะยังคงมี assets ของทุกขนาดเข้ามาด้วย ซึ่งเป็นสิ่งที่ไม่จำเป็น Google เลยคิด App Bundle ขึ้นมา

ซึ่งแปลว่าแต่ละ User จะได้รับแอพที่ขนาดไม่เท่ากัน โดยอิงตามเครื่อง

ref. Android Developers

โดยเวลาเรา build จาก Android ให้ไปที่ Build > Generate Signed Bundle / APK.. จะได้ไฟล์ .aab ซึ่งนำมาอัพโหลดใน Play Publish ได้ ในขั้นตอนนี้ การอัพโหลดจะนานกว่าเดิมหน่อย เพราะ Google จะ Generate แอพที่มีขนาดต่างกันก่อน

หลังจากที่เอามาใช้ก็ทำให้ลดขนาดไปได้มากสุดอยู่ที่ 45 MB

หลังจากปล่อยไป โศกอนาฏกรรมก็เกิดขึ้น ต้นเหตุจาก Library ชื่อ Fresco ที่ไม่รองรับ App Bundle ในตอนนั้น ทำให้ Release แรกเป็นปัญหามาก ดังนั้นถ้าใครจะลองใช้ฟีเจอร์นี้ให้ลองทดสอบเยอะๆ ก่อนในครั้งแรก แต่ตอนนี้ทุก Library น่าจะรองรับหมดแล้ว

Use WepP

WebP เป็น format รูปที่พัฒนาโดย Google เองเลย ที่มีมาสักพักแล้ว ส่วนสรรพคุณก็เขาเคลมไว้ว่าขนาดไฟล์จะเล็กกว่า PNG ประมาณ 26% โดยแบบไม่เสียคุณภาพเลย (คุณภาพเท่า PNG แต่ขนาดไฟล์เล็กกว่า) โดยรองรับทั้ง Still picture และ Animated Picture ด้วย

ใน Android Studio ก็รองรับการแปลงแบบ Built-in โดยสามารถคลิกขวาที่ res/drawable > Convert to WebP…

คือมันจะมีสองแบบ

  • Lossy encoding คือการแปลงแบบเสียคุณภาพ โดยจะเลือก % ได้
  • Lossless encoding คือแบบคุณภาพเท่าเดิม (ทางเราเลือกแบบ lossless)

ถ้าเลือกแบบ Lossy สามารถดู Preview ได้ สามารถลาก Scroll ดูความต่างของภาพได้ด้วย

หลังจากแปลง Assets เป็น WebP หมดแล้ว ขนาดลดไปประมาณ 3-5MB

ย้าย Assets ที่ไม่จำเป็นไปอยู่บน Server

สำหรับบาง Assets ที่ค่อนข้าง Dynamic มากๆ อย่างเช่น Sticker ที่ใช้ในแอพ หรือพวกกรอบ User ในแอพ เราได้ย้ายไปไว้บน Server ทั้งหมด โดยจะใช้เป็น URL ภาพแทนในแอพ ซึ่งได้ประโยชน์สองอย่างคือ แอพขนาดเล็กลงมากๆ กับ เราสามารถปรับ Assets ผ่าน Server โดยไม่ต้องอัพเดทแอพ

แต่.. เรื่องที่สำคัญสำหรับข้อนี้คือแน่นอน trade-off ที่ตามมาคือเวลาโหลดภาพจะช้าลง ซึ่งจำเป็นต้อง Optimize Assets ให้เล็กที่สุดเท่าที่จะทำได้ ส่วนฝั่ง App เองก็ต้องทำการ Cache ไฟล์พวกนี้ไว้ด้วยในเครื่อง

ขั้นตอนนี้ไม่ได้คำนวณเอาไว้ น่าจะลดไปราวๆ 30MB

The Others

นอกจากนี้ยังมีปรับส่วนอื่นๆ อีก เช่น dependencies ที่ไม่ได้ใช้ หรือลบ Assets ที่ไม่ได้ใช้ออก โดย Android Studio มีฟีเจอร์ built-in มาเหมือนกัน

ส่วนนี้ต้องระวัง ลบแล้วต้องทดสอบดีๆ เพราะหลังจากเราปรับแล้ว twitter มีปัญหา เพราะ Android Studio ดันไปลบ KEY ของ Twitter เพราะคิดว่าไม่ได้เอาไปใช้งาน เพราะตรวจไม่เจอ reference ในโค้ด

จากวันนั้น ที่ Vibie เคยมีขนาด 102MB ตอนนี้เหลือ 14MB โดยที่มี Feature ทุกอย่างครบเหมือนเดิม และแทบไม่กระทบ User Experience เลย

ลองไปปรับใช้กันดูนะครับ

--

--