คำแนะนำสำหรับนักพัฒนา Android ในการลดขนาดไฟล์ APK
เผยแพร่แล้ว: 2015-10-281) โปรการ์ด
เครื่องมือสำหรับการย่อขนาดโค้ด เช่น ProGuard จะลดขนาดไฟล์ APK ลงอย่างมาก เครื่องมือนี้มีให้ที่ sourceforge โปรดทราบว่า การทดสอบแอปพลิเคชันทั้งหมดอีกครั้งหลังจากใช้ ProGuard เป็นสิ่งสำคัญมาก เนื่องจากอาจเปลี่ยนลักษณะการทำงานของแอปพลิเคชันในบางครั้ง เนื่องจาก ProGuard เข้ามาแทนที่สัญลักษณ์ของแอปพลิเคชัน เพื่อทำให้โค้ดอ่านยาก สิ่งสำคัญคือคุณต้องรักษาการแมปสัญลักษณ์ไว้ เพื่อให้คุณสามารถแปลสแต็กเทรซกลับไปเป็นสัญลักษณ์ดั้งเดิมได้ หากคุณต้องตรวจสอบการขัดข้องในแอปพลิเคชันของคุณ
2) การลบข้อมูลการดีบัก
ฉันแนะนำให้คุณลบฟังก์ชันที่เกี่ยวข้องกับการดีบักทั้งหมดออกจากแอปพลิเคชัน โดยทั่วไป แอปพลิเคชันจะไม่เห็นหรือใช้ข้อมูลนี้ และระบบปฏิบัติการ Android ไม่ต้องการให้เรียกใช้แอปพลิเคชัน ดังนั้น ข้อมูลการดีบักจะเปลืองพื้นที่เท่านั้น และควรลบออก
ในการทำให้สำเร็จ ฟังก์ชันที่เกี่ยวข้องกับการดีบักทั้งหมดจะต้องอยู่ในบล็อกแบบมีเงื่อนไข ดังตัวอย่างด้านล่าง:
ดีบักสุดท้ายคงที่ = เท็จ; ถ้า (ดีบัก) { v(TAG "ดีบัก …”) }
สิ่งสำคัญคือต้องตั้งค่าสถานะการดีบัก ณ เวลาคอมไพล์ (เช่น ประกาศเป็นสแตติกสุดท้าย) เพื่อให้คอมไพเลอร์สามารถลบฟังก์ชันการดีบักทั้งหมดได้อย่างสมบูรณ์ การสร้างวิธีการแก้ไขข้อบกพร่องของคุณเองดังที่แสดงด้านล่างไม่ใช่ความคิดที่ดี เนื่องจากการเรียก myDebugPrint() ไม่ได้ปิดล้อมด้วยบล็อกแบบมีเงื่อนไข ซึ่งหมายความว่าคอมไพเลอร์ต้องเก็บข้อมูลเกี่ยวกับ myDebugPrint() ในคลาสการเรียก
โมฆะสาธารณะ myDebugPrint() ถ้า (ดีบัก) v(TAG, "ดีบัก …”); } } … myDebugPrint()
3) การลบสัญลักษณ์การดีบักออกจากไลบรารีดั้งเดิม การใช้สัญลักษณ์การดีบักนั้นสมเหตุสมผลหากแอปพลิเคชันของคุณยังอยู่ระหว่างการพัฒนาและยังต้องมีการแก้ไขข้อบกพร่อง แต่ถ้าสัญลักษณ์การดีบักยังคงปรากฏขึ้นเมื่อคุณคอมไพล์บิลด์รีลีส และหากคุณต้องการลบออก เราแนะนำให้ลบสัญลักษณ์ดีบักออกจากไลบรารีดั้งเดิม (ไฟล์ .so) ทำได้โดยใช้คำสั่ง arm-eabi-strip จาก Android NDK
4) รูปแบบสื่อที่แนะนำ หากแอปพลิเคชันของคุณต้องอาศัยรูปภาพ เสียง หรือวิดีโอเป็นอย่างมาก อีกวิธีหนึ่งที่คุณสามารถลดขนาดไฟล์ APK ได้คือการใช้รูปแบบสื่อบางรูปแบบ เราขอแนะนำให้คุณใช้รูปแบบสื่อต่อไปนี้สำหรับรูปภาพ เสียง และวิดีโอ:
- วิดีโอ: ใช้ H264 AVC เข้ารหัสวิดีโอให้มีความละเอียดไม่เกินความละเอียดหน้าจอของอุปกรณ์เป้าหมาย (หากทราบ)
- เสียง : แนะนำให้ใช้ AAC Audio สำหรับทรัพยากรเสียงทั้งหมด AAC สามารถบีบอัดได้ดีกว่าในคุณภาพที่กำหนด เมื่อเทียบกับ mp3 หรือ Ogg Vorbis ไม่ควรใช้รูปแบบ Raw เช่น WAV เหตุผลทั่วไปสำหรับการใช้รูปแบบ WAV ก็คือการถอดรหัสสตรีมเสียงที่บีบอัดมักจะหมายถึงเวลาแฝงสูงในการเล่น อย่างไรก็ตาม Android มี Sound Pool API ซึ่งช่วยให้แอปพลิเคชันใช้สตรีมเสียงที่บีบอัดได้โดยไม่มีการปรับเวลาในการตอบสนองสูง
- รูปภาพ : PNG หรือ JPEG ใช้ PNG เนื่องจากเป็นรูปแบบที่ไม่สูญเสียข้อมูล จึงเหมาะอย่างยิ่งสำหรับพื้นผิวและงานศิลปะ เนื่องจากจะไม่มีสิ่งประดิษฐ์ทางสายตาจากการบีบอัด หากมีข้อจำกัดด้านพื้นที่ ให้ใช้ JPEG หรือ PNG และ JPEG ผสมกัน รูปภาพ JPEG คุณภาพสูงอาจทำงานได้ดีสำหรับรูปภาพขนาดใหญ่ที่เหมือนจริง ซึ่งรูปแบบการบีบอัด JPEG ได้รับการปรับให้เหมาะสมที่สุด
- ปรับขนาด PNG ให้เหมาะสมโดยไม่สูญเสียคุณภาพ
หากคุณใช้รูปแบบ PNG รูปภาพ PNG จะลดลงในขนาดไฟล์โดยไม่สูญเสียคุณภาพ ในการดำเนินการนี้ ให้ใช้เครื่องมือ เช่น OptiPNG หรือ PNGCrush ทั้งสองอย่างนี้เหมาะอย่างยิ่งสำหรับการลดขนาดไฟล์ PNG ในขณะที่ยังคงรักษาคุณภาพของภาพ PNGcrush เป็นโปรแกรมโอเพนซอร์ซที่วนซ้ำบนตัวกรอง PNG และพารามิเตอร์ zlib (Deflate) บีบอัดรูปภาพซ้ำๆ โดยใช้การกำหนดค่าพารามิเตอร์แต่ละรายการ และเลือกการกำหนดค่าที่ให้ผลลัพธ์ที่บีบอัดน้อยที่สุด (IDAT) ในทางกลับกัน OptiPNG ทำการทดลองทั้งหมดในหน่วยความจำ และเขียนเฉพาะไฟล์เอาต์พุตสุดท้ายบนดิสก์ นอกจากนี้ยังมีการตั้งค่าล่วงหน้าสำหรับการเพิ่มประสิทธิภาพหลายรายการให้กับผู้ใช้
5) ลบทรัพยากรที่ไม่ได้ใช้ อีกกลุ่มหนึ่งของพื้นที่ที่อาจสิ้นเปลืองพื้นที่เพื่อพิจารณาให้นำออกจากไฟล์ APK ของคุณคือทรัพยากรที่ไม่ได้ใช้ในไดเรกทอรี res ของคุณ เช่น เลย์เอาต์ที่ไม่ได้ใช้ Drawable และสี หากต้องการตรวจหาทรัพยากรที่ไม่ได้ใช้ใน APK ของคุณซึ่งอาจลบออกได้ ให้ใช้เครื่องมือทรัพยากรที่ไม่ได้ใช้ android Android Unused Resources เป็นแอปพลิเคชัน Java ที่จะสแกนโครงการของคุณเพื่อหาทรัพยากรที่ไม่ได้ใช้
6) หลีกเลี่ยงการทำซ้ำ ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณไม่มีฟังก์ชันที่ซ้ำกันหรือเนื้อหาที่ซ้ำกันเป็นวิธีที่ชัดเจนในการหลีกเลี่ยงการมีไฟล์ที่ไม่จำเป็นใน APK ของคุณ สิ่งสำคัญคือต้องเข้าใจว่าคุณใช้ Android API ใดและฟังก์ชันเต็มรูปแบบที่แต่ละรายการมีให้ อาจเป็นไปได้ว่า Android API ตัวหนึ่งกำลังทำงานกับ API อื่นอยู่แล้ว เนื้อหาที่ซ้ำกัน (สตริง บิตแมป ฯลฯ) ก็เป็นการสิ้นเปลืองพื้นที่เช่นกัน และสามารถหลีกเลี่ยงได้อย่างง่ายดาย ในขอบเขตที่น้อยกว่า โค้ดที่ซ้ำกันจะเพิ่มขนาดของไบนารีที่ส่งโดยไม่จำเป็น
7) ลดจำนวนวิธีการของคุณ นักพัฒนา Avid Android มักประสบปัญหาที่ทำให้ปวดหัวกับแอปของพวกเขา จำนวนวิธีที่แอปสามารถมีได้มีจำกัด มันเคยถูกจำกัด ในที่สุด คนดีที่ Google ได้เสนอวิธีแก้ปัญหาเมื่อเดือนตุลาคมปีที่แล้ว แต่ก็ยังห่างไกลจากอุดมคติ แม้ว่าจะใช้งานได้ง่ายมาก แต่โซลูชัน multidex นั้นซับซ้อนและใช้เวลาในการคอมไพล์นานมาก โดยไม่หยุดนิ่ง เริ่มด้วย Lollipop (Android 5.0) เครื่องเสมือนของ Android ทั้งหมดได้รับการปฏิวัติเพื่อนำเสนอโซลูชันที่ทนทานกว่ามาก ซึ่งเป็นแบบที่ปรับปรุงได้แม้กระทั่งเวลาในการรวบรวมปกติ อย่างไรก็ตาม ในตอนนี้ โซลูชัน Lollipop ก็ไม่เหมาะเช่นกัน นักพัฒนาซอฟต์แวร์ต้องพัฒนากับ Lollipop เท่านั้น ซึ่งอาจเป็นปัญหาได้เนื่องจากแอปส่วนใหญ่ต้องการเข้ากันได้กับกลุ่มผู้ชมที่กว้างขึ้น และอาจกลัวการใช้คุณลักษณะที่ไม่พร้อมใช้งานใน Android เวอร์ชันก่อนหน้า ดังนั้นตอนนี้ โซลูชัน Lollipop จึงเป็นโซลูชัน Android ที่ดีในอนาคต แต่อาจไม่ส่งผลกระทบมากนักในอนาคตอันใกล้ ดังนั้นสิ่งที่สามารถทำได้ในระหว่างนี้? เราทุกคนต่างเห็นพ้องกันว่าคุณไม่ควรละทิ้งคุณสมบัติและความสามารถ เพียงเพื่อหลีกเลี่ยงไม่ให้ถึงขีดจำกัด 65K แต่ไม่ต้องสงสัยเลยว่าแนวทางปฏิบัติที่ดีที่สุดยังคงเป็นการลดจำนวนวิธีสมัครของคุณ ดังนั้นคุณจะยังพยายามลดจำนวนวิธีการของคุณโดยไม่สูญเสียจุดประกายเล็กๆ น้อยๆ ที่ทำให้แอปของคุณพิเศษได้อย่างไร
ภาพรวมโดยย่อ: “วิธีการทั้งหมดเหล่านี้มาจากไหน”
ขีด จำกัด จำนวนวิธีการอยู่ที่ประมาณ 65K วิธี (65,536 เป็นที่แน่นอน) ที่ฟังดูเหมือนจำนวนมาก หากคุณเป็นนักพัฒนา Android มือใหม่ คุณอาจกำลังคิดว่า "ทำไมแอปมากมายถึงได้ตัวเลขนี้เร็วขนาดนี้บนโลกนี้" คุณอาจจะค่อนข้างถูกต้อง มันไม่ง่ายเลยที่จะเขียนวิธีการมากมายด้วยตัวคุณเอง แต่นักพัฒนาแอพไม่ได้เขียนแอพทั้งหมดด้วยตัวเอง นักพัฒนาแอปกำลังใช้ไลบรารีของบุคคลที่สาม (SDK – Software Development Kits) มากขึ้นเรื่อยๆ ซึ่งช่วยให้พวกเขาบรรลุเป้าหมายและคุณลักษณะบางอย่างที่ไม่เช่นนั้นพวกเขาจะต้องพัฒนาอย่างสมบูรณ์ด้วยตนเอง ตั้งแต่โฆษณาไปจนถึงการปรับปรุง GUI ไปจนถึงโซเชียลเน็ตเวิร์ก การรายงานข้อขัดข้อง และอื่นๆ อีกมากมาย SDK นำเสนอความสามารถและ API ที่หลากหลายซึ่งช่วยประหยัดเวลาในการพัฒนาอันมีค่าและช่วยให้แอปของคุณพร้อมใช้งานเร็วขึ้น แต่ SDK แต่ละรายการจะเพิ่มจำนวนวิธีการของคุณ และ SDK บางตัวยังทำมากกว่าสิ่งที่คุณต่อรอง ไม่จำเป็นต้องเป็นสิ่งที่ไม่ดีแน่นอน อย่างไรก็ตาม การรัฐประหารมาจากกูเกิลเอง ชุดเครื่องมือ Google Play Services ของพวกเขาคือ SDK ขนาดใหญ่ที่มีวิธีการมากกว่า 28,000 วิธี ด้วยขีด จำกัด ที่ 65K จำนวนนั้นไม่ต่ำอย่างแน่นอน และนักพัฒนาแอปจำนวนมากต้องการใช้ SDK นี้เนื่องจากเปิดประตูสู่อาณาจักร Google อันมหัศจรรย์ ซึ่งเป็นความสามารถที่ต้องการอย่างมากซึ่งจะเพิ่มมูลค่ามากมายให้กับแอปของตน ในโพสต์นี้ ฉันจะไม่เพียงแค่อธิบายวิธีเลือกใช้แพ็คเกจ Google Play Services แต่ยังให้รายละเอียดเกี่ยวกับวิธีการที่แต่ละแพ็คเกจเหล่านี้เพิ่มไปยังแอปของคุณ จับที่นั่งไว้ให้ดี มันจะเป็นหลุมเป็นบ่อ
สนาม เด็กเล่นบริการ Google Play
Google Play Services เพิ่มได้กี่วิธี? เช่นเดียวกับทุกสิ่งทุกอย่างในชีวิต มันซับซ้อนกว่าแค่ตัวเลขพื้นฐาน แต่ลองมาทีละขั้นตอน Google Play Services SDK มี SDK ที่แตกต่างกัน 19 ชุด ด้วย Gradle คุณสามารถเลือกได้ว่าจะใช้อันไหน สิ่งที่คุณต้องทำคือเพิ่มการพึ่งพาต่อไปนี้ในไฟล์ build.gradle ของโมดูลแอปของคุณ:
การพึ่งพา { คอมไพล์ 'com.google.android.gms:play-services:7.5.0' }
โดยที่ 7.5.0 เป็น GPS เวอร์ชันล่าสุดที่ออกวางจำหน่ายในเวลานี้ มีการระบุว่าเป็นรุ่นแก้ไข 25 ภายใน Android SDK Manager ในการเลือกแพ็คเกจเฉพาะ ให้แทนที่บรรทัดต่อไปนี้ด้วยบรรทัดการพึ่งพามากเท่าที่คุณต้องการ โดยระบุแพ็คเกจเฉพาะ ตัวอย่างเช่น คุณแค่ต้องการ Google Plus, Google Games, Google Ads และ Google Maps:
การพึ่งพา { คอมไพล์ 'com.google.android.gms:play-services-plus:7.5.0' คอมไพล์ 'com.google.android.gms:play-services-games:7.5.0' คอมไพล์ 'com.google.android.gms:play-services-ads:7.5.0' คอมไพล์ 'com.google.android.gms:play-services-maps:7.5.0' }
ไม่ยากเกินไป แต่นี่เป็นครั้งแรกที่จับได้ หนึ่งใน 19 SDK อันรุ่งโรจน์เรียกว่า play-services-base หากคุณรวมแพ็คเกจบริการ Google Play ไว้ แพ็คเกจนั้นจะถูกเพิ่มโดยอัตโนมัติเช่นกัน แพ็คเกจพื้นฐานมีกี่วิธี? เกือบ 8,000 (จำนวนที่แน่นอนด้านล่าง)
และนี่คือการจับครั้งที่สอง ฉันไม่ได้รวมแค่ 3 แพ็คเกจในตัวอย่างด้านบน ฉันไม่ได้รวมแค่ 4 ถ้าคุณนับแพ็คเกจพื้นฐานด้วย อันที่จริงฉันรวม 5 แพ็คเกจ ทำไม เนื่องจากแพ็คเกจ Google Games ใช้แพ็คเกจ Google Drive และนำเข้าเช่นกัน (อันที่จริง Google Ads ยังมีแพ็คเกจที่เรียกว่าตัวจัดการแท็กด้วย แต่ฉันนับเฉพาะแพ็คเกจที่ "เลือกได้" ที่นี่)
ตอนนี้เราเริ่มเข้าใจแล้วว่าทำไมการนับจำนวนวิธีที่แต่ละแพ็คเกจของบริการ Google Play เพิ่มในแอปของเราจึงยากขึ้นเล็กน้อย การรวมแพ็คเกจหนึ่งไม่ได้หมายความว่าไม่รวมแพ็คเกจอื่น
ด้านล่างนี้คือแพ็คเกจที่คุณสามารถเพิ่มได้ จำนวนวิธีที่เพิ่ม และแพ็คเกจอื่นๆ ที่พวกเขานำมาเพื่อทำให้ปาร์ตี้ล่ม ข้อมูลอ้างอิงถึงเวอร์ชันล่าสุดของ Google Play Services (7.5.0 / ฉบับแก้ไข 25):
จำนวนวิธีการทั้งหมด: 28,175 คุณต้องยอมรับตัวเลขเหล่านี้บางจำนวนที่เลวร้ายอย่างแท้จริง ถ้าคุณต้องการเพียงแค่แพ็คเกจพาโนรามา คุณไม่สามารถทำได้แค่เก้าวิธี คุณต้องได้เกือบ 8,000 วิธี ไม่น่าแปลกใจที่แอปจำนวนมากใกล้ถึงหรือเกินขีดจำกัด 65K นั้น
ตัวเลขเหล่านี้บางส่วนอาจดูไม่สอดคล้องกันเล็กน้อยหากคุณพยายามรวมเข้าด้วยกัน นั่นเป็นเพราะว่า ตรรกะเบื้องหลังบริการ Google Play นั้นค่อนข้างซับซ้อนกว่าที่คิด ตัวอย่างเช่น Google Analytics มีวิธีเดียวจาก Google Ads เพื่อรับรหัสโฆษณาของบัญชี
โปรดทราบว่าเมื่อคำนวณว่าแต่ละแพ็คเกจเพิ่มไปยังแอปของคุณมากเพียงใด อย่าลืมแยกเป็นสองเท่า (เช่น อย่านับแพ็กเกจหลักมากกว่าหนึ่งครั้ง)
คุณไม่สามารถเลือกเพิ่มทุกอย่างได้
และนี่คือต่อยสุดท้าย มีแพ็คเกจเล็ก ๆ สองแพ็คเกจใน Google Play Services ที่ไม่สามารถเลือกเพิ่มได้ แพ็คเกจ การค้นหา (ให้คุณเข้าถึง Google Now API) มีเพียง 22 วิธีเท่านั้น หากคุณต้องการใช้งาน คุณไม่มีทางเลือกอื่นนอกจากต้องเพิ่มวิธีการทั้งหมด 28,000+ วิธี ซึ่งก็คือบริการ Google Play ทั้งหมด หวังว่าสิ่งนี้จะได้รับการแก้ไขในรุ่นที่ใหม่กว่า
(แพ็คเกจ "ไม่สามารถเข้าถึงได้" อีกแพ็คเกจหนึ่งคือแพ็คเกจ appstate ที่มี 111 วิธี แต่ตอนนี้เลิกใช้แล้วใน SavedGames ซึ่งรวมอยู่ในแพ็คเกจ google-play-games)