วิเคราะห์บิลด์ด้วยตัววิเคราะห์ APK

Android Studio มีตัววิเคราะห์ APK ที่ให้ข้อมูลเชิงลึกในทันทีเกี่ยวกับ องค์ประกอบของ APK หรือ Android App Bundle หลังจากกระบวนการบิลด์เสร็จสมบูรณ์ การใช้ตัววิเคราะห์ APK จะช่วยลดเวลาที่คุณใช้ในการแก้ไขข้อบกพร่องของไฟล์ DEX และทรัพยากรภายในแอป รวมถึงช่วยลดขนาด APK ตัววิเคราะห์ APK ยังพร้อมใช้งานจากบรรทัดคำสั่งด้วย apkanalyzer


ตัววิเคราะห์ APK ช่วยให้คุณทำสิ่งต่อไปนี้ได้

  • ดูขนาดสัมบูรณ์และขนาดสัมพัทธ์ของไฟล์ในแอป เช่น ไฟล์ DEX และไฟล์ทรัพยากร Android
  • ทําความเข้าใจองค์ประกอบของไฟล์ DEX
  • ดูไฟล์เวอร์ชันสุดท้ายในแอปได้อย่างรวดเร็ว เช่น ไฟล์ AndroidManifest.xml
  • เปรียบเทียบ APK หรือ App Bundle 2 รายการแบบเคียงข้างกัน

คุณเข้าถึง APK Analyzer ได้ 3 วิธีเมื่อเปิดโปรเจ็กต์

  • ลาก APK หรือ App Bundle ไปยังหน้าต่างเอดิเตอร์ของ Android Studio
  • เปลี่ยนไปใช้มุมมองโปรเจ็กต์ในหน้าต่างโปรเจ็กต์ จากนั้น ดับเบิลคลิก APK ในไดเรกทอรี build/output/apks/ เริ่มต้น
  • เลือกสร้าง > วิเคราะห์ APK ในแถบเมนู แล้วเลือก APK หรือ App Bundle

ดูข้อมูลไฟล์และขนาด

APK คือไฟล์ที่ใช้รูปแบบไฟล์ ZIP APK Analyzer จะแสดงแต่ละ ไฟล์หรือโฟลเดอร์เป็นเอนทิตีที่คุณขยายเพื่อไปยังโฟลเดอร์ได้ ลำดับชั้นของเอนทิตีจะแสดงโครงสร้างของไฟล์ และโฟลเดอร์ในไฟล์ APK

APK Analyzer จะแสดงค่าขนาดไฟล์ที่บีบอัด (หรือ "ขนาดไฟล์ดิบ") และขนาดไฟล์ดาวน์โหลดสำหรับแต่ละเอนทิตี ดังที่แสดงในรูปที่ 1 ขนาดไฟล์ดิบ แสดงสัดส่วนของเอนทิตีต่อขนาด APK ทั้งหมด ขนาดการดาวน์โหลดแสดงถึงขนาดที่บีบอัดแล้วโดยประมาณของเอนทิตีตามที่ Google Play จะส่ง % ของขนาดการดาวน์โหลดทั้งหมดระบุ เปอร์เซ็นต์ของขนาดการดาวน์โหลดทั้งหมดของ APK ที่เอนทิตีแสดง

รูปที่ 1 ขนาดไฟล์ใน APK Analyzer

ดู AndroidManifest.xml

หากโปรเจ็กต์มีไฟล์ AndroidManifest.xml หลายไฟล์ เช่น สำหรับ Product Flavor หรือมีไลบรารีที่ให้ไฟล์ Manifest ด้วย ระบบจะ ผสานรวมไฟล์เหล่านั้นเป็นไฟล์เดียวในแอป ไฟล์ Manifest นี้ มักจะเป็นไฟล์ไบนารีภายใน APK หรือ App Bundle แต่เมื่อ เลือกใน APK Analyzer ระบบจะสร้างรูปแบบ XML ของเอนทิตีนี้ขึ้นใหม่และ แสดง

ซึ่งจะช่วยให้คุณเข้าใจการเปลี่ยนแปลงที่อาจเกิดขึ้นกับแอปในระหว่างการสร้าง เช่น คุณจะดูได้ว่าระบบผสานรวมAndroidManifest.xmlไฟล์จากไลบรารีที่แอปพลิเคชันของคุณขึ้นอยู่กับไฟล์นั้น เข้ากับAndroidManifest.xmlไฟล์สุดท้ายอย่างไร

นอกจากนี้ โปรแกรมดูนี้ยังมีความสามารถในการตรวจสอบโค้ดบางอย่างด้วย คำเตือนหรือ ข้อผิดพลาดจะปรากฏที่มุมขวาบน รูปที่ 2 แสดงข้อผิดพลาดที่รายงาน สำหรับไฟล์ Manifest ที่เลือก

รูปที่ 2 ไอคอนข้อผิดพลาดจะปรากฏที่ด้านขวาบนของไฟล์ Manifest ที่เลือก

ดูไฟล์ DEX

โปรแกรมดูไฟล์ DEX ของ APK Analyzer ช่วยให้คุณเข้าถึงข้อมูลพื้นฐานในไฟล์ DEX ของแอปได้ทันที โปรแกรมดูจะแสดงจำนวนคลาส แพ็กเกจ การอ้างอิงทั้งหมด และการประกาศ ซึ่งจะช่วยในการตัดสินใจว่าจะใช้ Multidex หรือวิธีนำการอ้างอิงออกเพื่อให้มีจำนวนต่ำกว่าขีดจำกัด DEX 64K

รูปที่ 3 แสดงแอปขนาดกลางที่มีขนาดต่ำกว่าขีดจำกัด DEX 64K แต่ละแพ็กเกจ คลาส และเมธอดภายในไฟล์ DEX จะมีจำนวนที่แสดงอยู่ในคอลัมน์เมธอดที่กำหนดและเมธอดที่อ้างอิง

คอลัมน์วิธีการอ้างอิงจะนับวิธีการทั้งหมดที่ไฟล์ DEX อ้างอิง โดยปกติแล้วจะรวมถึงเมธอดที่กำหนดไว้ในโค้ด ไลบรารีการอ้างอิง และเมธอดที่กำหนดไว้ในแพ็กเกจ Java และ Android มาตรฐานที่โค้ดใช้ ซึ่งเป็นวิธีการที่นับรวมในขีดจำกัดของวิธีการ 64K ในแต่ละ DEX file

คอลัมน์วิธีการที่กำหนดจะนับเฉพาะวิธีการที่กำหนดไว้ใน ไฟล์ DEX ไฟล์ใดไฟล์หนึ่ง ดังนั้นตัวเลขนี้จึงเป็นส่วนย่อยของวิธีการที่อ้างอิง

รูปที่ 3 แอปขนาดกลาง

กรองมุมมองแผนผังไฟล์ DEX

เหนือรายการคลาสเล็กน้อย เครื่องมือวิเคราะห์ APK จะมีตัวกรองสำหรับ ดูเนื้อหาของไฟล์ DEX ที่เลือก ดังที่แสดงในรูปที่ 4

รูปที่ 4 ตัวกรอง DEX ตั้งค่าให้แสดง ฟิลด์และเมธอดสำหรับ BuildConfig

หากต้องการใช้ตัวกรองเพื่อแสดงเมธอดและฟิลด์ทั้งหมดภายในคลาส ให้ทำดังนี้

  1. เลือกไฟล์ classes.dex ในรายการไฟล์
  2. ในรายการชั้นเรียน ให้ไปที่ชั้นเรียนแล้วเลือก
  3. ขยายชั้นเรียนที่คุณเลือก
  4. สลับแสดงช่อง เพื่อแสดงหรือซ่อนช่องของคลาส
  5. สลับแสดงวิธีการ เพื่อแสดงหรือซ่อนวิธีการของคลาส
  6. สลับแสดงเมธอดหรือฟิลด์ที่อ้างอิงทั้งหมด เพื่อแสดงหรือซ่อนแพ็กเกจ คลาส เมธอด และฟิลด์ที่อ้างอิง

    ในมุมมองแบบต้นไม้ โหนดที่แสดงเป็นตัวเอียงคือการอ้างอิงที่ไม่มีคำจำกัดความในไฟล์ DEX ที่เลือก ไฟล์ DEX สามารถอ้างอิงเมธอดและ ฟิลด์ที่กำหนดไว้ในไฟล์อื่นได้ เช่น System.out.println() เป็นการอ้างอิงถึงเมธอด println() ใน เฟรมเวิร์ก Android

โหลดการแมป ProGuard

ไอคอนการแมป ProGuard จะอยู่ข้างไอคอนการกรอง ไอคอน ProGuard จะเป็นสีเทาจนกว่าคุณจะโหลดชุดไฟล์การแมป ProGuard ที่เพิ่ม ฟังก์ชันการทำงานให้กับโปรแกรมดู DEX เช่น การยกเลิกการปิดบังชื่อ (mapping.txt) การแสดงโหนดที่ถูกนำออก (usage.txt) และการระบุโหนด ที่นำออกไม่ได้ (seeds.txt)

ไฟล์การแมป ProGuard ที่คุณนําเข้าต้องมาจากบิลด์เดียวกันกับที่ สร้างไฟล์ DEX ที่เปิดใช้การลดขนาดโค้ด

รูปที่ 5 โหลดการแมป Proguard...

หากต้องการโหลดไฟล์การแมป ProGuard ให้ทำดังนี้

  1. คลิกโหลดการแมป Proguard...
  2. ไปที่โฟลเดอร์โปรเจ็กต์ที่มีไฟล์การแมป แล้วโหลดไฟล์ทั้งหมด ไฟล์ชุดใดก็ได้ หรือโฟลเดอร์ที่มีไฟล์

    โดยปกติแล้วไฟล์การแมปจะอยู่ใน project/app/build/outputs/mappings/release/ ตัวเลือกไฟล์จะใช้โฟลเดอร์รุ่นเป็นค่าเริ่มต้นหากตรวจพบโครงสร้างโปรเจ็กต์นี้

    ก่อนอื่น ตัวเลือกไฟล์จะตรวจสอบชื่อไฟล์ที่ตรงกับ mapping.txt seeds.txt และ usage.txt ทุกประการ จากนั้น ตัวเลือกไฟล์จะตรวจสอบชื่อไฟล์ ที่มีข้อความ mapping, usage หรือ seeds อยู่ที่ใดที่หนึ่งและลงท้ายด้วย .txt เช่น release-seeds-1.10.15.txt จะถือว่าตรงกัน

รายการต่อไปนี้อธิบายไฟล์การแมป

  • seeds.txt: โหนดที่การกำหนดค่า ProGuard ป้องกันไม่ให้ถูกนำออก ระหว่างการลดขนาดจะแสดงเป็นตัวหนา
  • mapping.txt: เปิดใช้เลิกซ่อนชื่อ เพื่อให้คุณกู้คืนชื่อเดิมของโหนดที่ R8 ซ่อนไว้ได้ เช่น คุณสามารถกู้คืนชื่อโหนดที่ผ่านการปกปิด อย่าง a, b, c เป็น MyClass, MainActivity และ myMethod() ได้
  • usage.txt: เปิดใช้แสดงโหนดที่นำออก เพื่อให้คุณแสดงคลาส เมธอด และฟิลด์ที่ R8 นำออก ระหว่างการลดขนาดได้ โดยโหนดที่กู้คืนจะแสดงเป็น ขีดทับ

    ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ R8 เพื่อสร้างความสับสนและลดขนาดโค้ดได้ที่ ลดขนาด สร้างความสับสน และเพิ่มประสิทธิภาพแอป

แสดงไบต์โค้ด ค้นหาการใช้งาน และสร้างกฎ Keep

โหนดในมุมมองรายการคลาสมีเมนูบริบทที่มีตัวเลือกต่อไปนี้ ซึ่งช่วยให้คุณดูไบต์โค้ด ค้นหาการใช้งาน และแสดงกล่องโต้ตอบที่แสดงกฎ ProGuard เพื่อคัดลอกและวางสำหรับโหนดที่เลือก คลิกขวาที่โหนดใดก็ได้ในมุมมองรายการชั้นเรียนเพื่อแสดงเมนูตามบริบท

แสดงไบต์โค้ด: แยกคอมไพล์คลาส เมธอด หรือฟิลด์ที่เลือก และแสดงการแทนไบต์โค้ด Smali ในกล่องโต้ตอบ ดังนี้

รูปที่ 6 ไบต์โค้ด DEX สำหรับ init method

ค้นหาการใช้งาน: แสดงส่วนอื่นๆ ของโค้ด DEX ที่มีการอ้างอิงถึงคลาสหรือเมธอดที่เลือก ดังที่แสดงในรูปที่ 7 หากคุณมี seeds.txt โหลดอยู่ โหนดที่แสดงเป็นตัวหนาจะบ่งบอกว่าการกำหนดค่า ProGuard ป้องกันไม่ให้ระบบนำโหนดเหล่านั้น ออกในระหว่างการลดขนาด

รูปที่ 7 การอ้างอิงถึง MyClass

สร้างกฎ Keep ของ ProGuard: แสดงกฎ ProGuard ที่คุณคัดลอกและวางลงในไฟล์กำหนดค่า ProGuard ของโปรเจ็กต์ได้ ดังที่แสดงในรูปที่ 8 ซึ่งจะช่วยป้องกันไม่ให้ระบบนำแพ็กเกจ คลาส เมธอด หรือฟิลด์ที่ระบุออกในระหว่าง ระยะการย่อโค้ด ดูข้อมูลเพิ่มเติมได้ที่ปรับแต่งโค้ดที่จะเก็บไว้

รูปที่ 8 กฎ ProGuard ที่คุณคัดลอกจากกล่องโต้ตอบไปยังไฟล์การกำหนดค่า ProGuard ได้

ดูเอนทิตีโค้ดและทรัพยากร

งานบิลด์ต่างๆ จะเปลี่ยนเอนทิตีสุดท้ายในแอป เช่น กฎการลดขนาดของ ProGuard สามารถเปลี่ยนโค้ดสุดท้ายได้ และทรัพยากรรูปภาพ สามารถลบล้างได้ด้วยทรัพยากรในProduct Flavor

หากต้องการดูไฟล์เวอร์ชันสุดท้ายด้วย APK Analyzer ให้คลิก เอนทิตีเพื่อดูตัวอย่างเอนทิตีข้อความหรือรูปภาพ ดังที่แสดง ในรูปที่ 9

รูปที่ 9 ตัวอย่างของรูปภาพสุดท้าย แหล่งข้อมูล

APK Analyzer ยังแสดงไฟล์ข้อความและไบนารีต่างๆ ได้ด้วย เช่น โปรแกรมดูเอนทิตี resources.arsc ช่วยให้คุณเห็นค่าเฉพาะการกำหนดค่า เช่น การแปลภาษาสำหรับทรัพยากรสตริง ในรูปที่ 10 คุณจะเห็นคำแปลของทรัพยากรสตริงแต่ละรายการ

รูปที่ 10 ตัวอย่างของสตริงที่แปลแล้ว ทรัพยากร

เปรียบเทียบไฟล์

ตัววิเคราะห์ APK สามารถเปรียบเทียบขนาดของเอนทิตีในไฟล์ APK หรือ App Bundle 2 ไฟล์ที่แตกต่างกันได้ ซึ่งจะเป็นประโยชน์เมื่อคุณต้องการทราบสาเหตุที่แอปมีขนาดใหญ่ขึ้นเมื่อเทียบกับรุ่นก่อนหน้า

ก่อนเผยแพร่แอปที่อัปเดตแล้ว ให้ทำดังนี้

  1. โหลดเวอร์ชันของแอปที่คุณกำลังจะเผยแพร่ลงในตัววิเคราะห์ APK
  2. ที่มุมขวาบนของเครื่องมือวิเคราะห์ APK ให้คลิก เปรียบเทียบกับ APK ก่อนหน้า...
  3. ในกล่องโต้ตอบการเลือก ให้ค้นหาสิ่งประดิษฐ์ที่เผยแพร่ล่าสุดต่อผู้ใช้ แล้วคลิก OK

    กล่องโต้ตอบที่คล้ายกับในรูปที่ 11 จะปรากฏขึ้นเพื่อช่วยคุณประเมินผลกระทบที่การอัปเดตอาจมีต่อผู้ใช้

รูปที่ 11 แสดงความแตกต่างระหว่างบิลด์ดีบักและบิลด์รีลีสของแอปหนึ่งๆ ตัวเลือกการสร้างที่แตกต่างกันจะใช้ระหว่างประเภทการสร้างเหล่านี้ ซึ่ง จะแก้ไขเอนทิตีพื้นฐานแตกต่างกัน

รูปที่ 11 ความแตกต่างระหว่าง APK สำหรับการแก้ไขข้อบกพร่อง และ APK สำหรับรุ่นที่เผยแพร่