AAPT2

AAPT2 (Android Asset Pack Tool) คือเครื่องมือสร้างที่ Android Studio และ ปลั๊กอิน Android Gradle ใช้เพื่อคอมไพล์และจัดแพ็กเกจแอปของคุณ แหล่งข้อมูล การแยกวิเคราะห์ ดัชนี AAPT2 และคอมไพล์ทรัพยากรเป็นรูปแบบไบนารีที่มีการปรับให้เหมาะสมสำหรับ แพลตฟอร์ม Android

ปลั๊กอิน Android Gradle 3.0.0 ขึ้นไปจะเปิดใช้ AAPT2 โดยค่าเริ่มต้น คุณ มักจะไม่จำเป็นต้องเรียกใช้ aapt2 ด้วยตัวเอง แต่หากคุณต้องการใช้ เทอร์มินัลและระบบบิลด์ของคุณเอง แทนที่จะเป็น Android Studio คุณสามารถใช้ AAPT2 จากบรรทัดคำสั่ง คุณยังแก้ไขข้อบกพร่องของข้อผิดพลาดในการสร้างที่เกี่ยวข้องกับ AAPT2 ได้ด้วย จากบรรทัดคำสั่ง ในการดำเนินการนี้ ให้ค้นหา AAPT2 เป็นเครื่องมือแบบสแตนด์อโลนใน เครื่องมือสร้าง Android SDK 26.0.2 ขึ้นไป

หากต้องการดาวน์โหลดเครื่องมือสร้าง Android SDK จากบรรทัดคำสั่ง ให้ใช้ sdkmanager แล้วเรียกใช้คำสั่งต่อไปนี้

sdkmanager "build-tools;build-tools-version"

เมื่อดาวน์โหลดเครื่องมือสร้าง SDK ให้ค้นหา AAPT2 ใน android_sdk/build-tools/version/

เนื่องจากเวอร์ชันแก้ไขของเครื่องมือสร้าง Android SDK ยังไม่เผยแพร่ บ่อยครั้งที่เวอร์ชัน AAPT2 ที่รวมอยู่ในเครื่องมือสร้าง SDK ของคุณอาจไม่ได้ ล่าสุด หากต้องการรับ AAPT2 เวอร์ชันล่าสุด ให้ทำดังนี้ ดาวน์โหลด AAPT2 จาก Google Maven

หากต้องการใช้ AAPT2 จากบรรทัดคำสั่งใน Linux หรือ Mac ให้เรียกใช้คำสั่ง aapt2 เรียกใช้คำสั่ง aapt2.exe ใน Windows

AAPT2 รองรับการรวบรวมทรัพยากรได้เร็วขึ้นโดยเปิดใช้ส่วนเพิ่ม ในการรวบรวม ในการคอมไพล์แบบเพิ่มขึ้นเรื่อยๆ จะต้องประมวลผลทรัพยากร แบ่งออกเป็น 2 ขั้นตอนดังนี้

  • คอมไพล์: คอมไพล์ไฟล์ทรัพยากรเป็นรูปแบบไบนารี
  • ลิงก์: รวมไฟล์ที่คอมไพล์ทั้งหมดแล้วจัดแพ็กเกจให้เป็นไฟล์เดียว ใหม่

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

ดาวน์โหลด AAPT2 จาก Google Maven

หากต้องการรับ AAPT2 เวอร์ชันใหม่ล่าสุดที่ไม่ได้รวมอยู่ในเครื่องมือสร้าง ดาวน์โหลด AAPT2 จากที่เก็บ Maven ของ Google ดังนี้

  1. ในดัชนีที่เก็บ ให้ไปที่ ไปยัง com.android.tools.build > aapt2
  2. คัดลอกชื่อ AAPT2 เวอร์ชันล่าสุด
  3. ใส่ชื่อเวอร์ชันที่คุณคัดลอกลงใน URL ต่อไปนี้และระบุ ระบบปฏิบัติการเป้าหมาย: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    ตัวอย่างเช่น หากต้องการดาวน์โหลดเวอร์ชัน 3.2.0-alpha18-4804415 สำหรับ Windows ให้ใช้รูปแบบต่อไปนี้ https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar

  4. ไปที่ URL ในเบราว์เซอร์ AAPT2 จะเริ่มดาวน์โหลดในไม่ช้า

  5. แยกแพ็กเกจไฟล์ JAR ที่คุณเพิ่งดาวน์โหลด

    ไฟล์ JAR ควรมีไฟล์ปฏิบัติการ aapt2 และไลบรารีบางรายการที่ ไฟล์ปฏิบัติการจะขึ้นอยู่กับว่า

คอมไพล์

AAPT2 รองรับการคอมไพล์ทั้งหมด ประเภททรัพยากร Android เช่น ไฟล์ที่ถอนออกได้และไฟล์ XML เมื่อเรียกใช้ AAPT2 สำหรับการคอมไพล์ ให้ข้าม ไฟล์ทรัพยากรเดียวเป็นอินพุตต่อการเรียกใช้ AAPT2 จะแยกวิเคราะห์ไฟล์ และสร้างไฟล์ไบนารีที่มีนามสกุล .flat

เมื่อส่งทั้งไดเรกทอรี AAPT2 จะคอมไพล์ไฟล์ทั้งหมดในไดเรกทอรีใหม่ แม้ว่าจะเปลี่ยนแหล่งข้อมูลเพียงแหล่งเดียวก็ตาม แม้ว่าคุณจะสามารถส่งต่อแหล่งข้อมูล ไดเรกทอรีที่มีไฟล์ทรัพยากรมากกว่า 1 ไฟล์ที่ส่งไปยัง AAPT2 โดยใช้ --dir ทำให้คุณไม่ได้รับประโยชน์จากการรวบรวมทรัพยากรที่เพิ่มขึ้นด้วยวิธีนี้

ประเภทไฟล์เอาต์พุตอาจแตกต่างกันไป ขึ้นอยู่กับอินพุตที่คุณระบุสำหรับการคอมไพล์ ดังที่แสดงในตารางต่อไปนี้

ตาราง 1 ไฟล์อินพุตและเอาต์พุต ประเภทการรวบรวม

อินพุต เอาต์พุต
ไฟล์ทรัพยากร XML เช่น สตริง และ รูปแบบ อยู่ในไดเรกทอรี res/values/ ตารางแหล่งข้อมูลที่มี *.arsc.flat เป็นส่วนขยาย
ไฟล์ทรัพยากรอื่นๆ ทั้งหมด

ไฟล์ทั้งหมดนอกเหนือจากไฟล์ในไดเรกทอรี res/values/ จะ แปลงเป็นไฟล์ XML ไบนารีที่มีส่วนขยาย *.flat รายการแล้ว

นอกจากนี้ ระบบจะบีบอัดไฟล์ PNG ทั้งหมดโดยค่าเริ่มต้น และใช้ส่วนขยาย *.png.flat หากคุณเลือกที่จะไม่บีบอัด PNG คุณสามารถใช้ --no-crunch ในระหว่างการคอมไพล์

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

คอมไพล์ไวยากรณ์

ไวยากรณ์ทั่วไปสำหรับการใช้ compile มีดังนี้

aapt2 compile path-to-input-files [options] -o output-directory/

ในตัวอย่างต่อไปนี้ AAPT2 รวบรวมไฟล์ทรัพยากรชื่อ values.xml และ myImage.png ทีละรายการ:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

ดังที่ปรากฏในตาราง 1 ชื่อไฟล์เอาต์พุตขึ้นอยู่กับอินพุต ชื่อไฟล์และชื่อของไดเรกทอรีระดับบน

สำหรับตัวอย่างก่อนหน้านี้ที่มีไฟล์ strings.xml เป็นอินพุต aapt2 โดยอัตโนมัติ ตั้งชื่อไฟล์เอาต์พุตเป็น values-en_strings.arsc.flat อย่างไรก็ตาม ระบบรวบรวมข้อมูล ไฟล์ที่ถอนออกได้ซึ่งจัดเก็บไว้ในไดเรกทอรีที่ถอนออกได้มีชื่อว่า drawable_img.png.flat

ตัวเลือกคอมไพล์

มีหลายตัวเลือกที่คุณใช้กับคำสั่ง compile ได้ ตามที่แสดง ในตาราง 2:

ตาราง 2 คอมไพล์ตัวเลือกคำสั่ง

ตัวเลือก คำอธิบาย
-o path

ระบุเส้นทางเอาต์พุตสำหรับทรัพยากรที่คอมไพล์

ค่านี้เป็นแฟล็กที่จำเป็นเนื่องจากคุณต้องระบุเส้นทางไปยัง ไดเรกทอรีที่ AAPT2 สามารถส่งออกและจัดเก็บทรัพยากรที่คอมไพล์ได้

--dir directory

ระบุไดเรกทอรีที่จะสแกนหาทรัพยากร

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

--pseudo-localize สร้าง pseudolocalized เวอร์ชันของสตริงเริ่มต้น เช่น en-XA และ en-XB
--no-crunch ปิดใช้การประมวลผล PNG

ใช้ตัวเลือกนี้ถ้าประมวลผลไฟล์ PNG แล้ว หรือหากคุณ กำลังสร้างบิลด์การแก้ไขข้อบกพร่องที่ไม่ต้องใช้การลดขนาดไฟล์ การเปิดใช้ตัวเลือกนี้จะทำให้การดำเนินการรวดเร็วขึ้นแต่จะเพิ่มผลลัพธ์ ขนาดไฟล์

--legacy จัดการข้อผิดพลาดที่อนุญาตเมื่อใช้ AAPT เวอร์ชันก่อนหน้าเป็น

ควรใช้แฟล็กนี้สำหรับข้อผิดพลาดในเวลาคอมไพล์ที่ไม่คาดคิด เพื่อแก้ไขปัญหา การเปลี่ยนแปลงลักษณะการทำงานที่ทราบที่อาจเกิดขึ้นขณะใช้ AAPT2 โปรดอ่าน ลักษณะการทำงานเปลี่ยนแปลงไปเมื่อใช้ AAPT2

-zip file file เป็นไฟล์ ZIP ที่มีไดเรกทอรี res ที่จะสแกน ที่ไม่ซับซ้อน
-output-text-symbols file สร้างไฟล์ข้อความที่มีสัญลักษณ์แหล่งข้อมูลใน file
-preserve-visibility-of-styleables หากระบุไว้ จะใช้กฎการแสดงผลเดียวกันกับการจัดรูปแบบที่ ที่ใช้สำหรับทรัพยากรอื่นๆ ทั้งหมด มิเช่นนั้น สไตล์ทั้งหมดที่จัดรูปแบบได้จะกลายเป็นสาธารณะ
-visibility [public|private|default|] ตั้งค่าการเปิดเผยของทรัพยากรที่คอมไพล์เป็นระดับที่ระบุ
-trace-folder folder สร้างส่วนย่อยการติดตาม JSON ของ systrace ไปยังโฟลเดอร์ที่ระบุ
-source-path path ตั้งค่าเส้นทางไฟล์ต้นฉบับของไฟล์ทรัพยากรที่คอมไพล์เป็น path
-h แสดงความช่วยเหลือเกี่ยวกับเครื่องมือ
-v เปิดใช้การบันทึกที่มีข้อมูลขนาดใหญ่

ในขั้นตอนการลิงก์ AAPT2 จะรวมไฟล์กลางทั้งหมดที่การคอมไพล์ เฟสที่สร้างขึ้น เช่น ตารางทรัพยากร, ไฟล์ XML ไบนารี และ PNG ที่ประมวลผลแล้ว แล้วรวมไฟล์ลงใน APK เดียว นอกจากนี้ สร้างไฟล์เสริมได้ เช่น ไฟล์กฎ R.java และ ProGuard ในช่วงนี้ อย่างไรก็ตาม APK ที่สร้างขึ้นไม่มีไบต์โค้ด DEX และ ไม่มีการลงชื่อ คุณไม่สามารถทำให้ APK นี้ใช้งานได้ในอุปกรณ์

หากคุณไม่ได้ใช้ปลั๊กอิน Android Gradle ในการ สร้างแอปจากบรรทัดคำสั่ง ใช้เครื่องมือบรรทัดคำสั่งอื่นๆ เช่น d8 เพื่อคอมไพล์ ไบต์โค้ด Java ลงใน DEX ไบต์โค้ดและ apksigner เพื่อรับรอง APK ของคุณ

ไวยากรณ์ทั่วไปสำหรับการใช้ link มีดังนี้

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

ในตัวอย่างต่อไปนี้ AAPT2 จะรวมไฟล์ระดับกลาง 2 ไฟล์ drawable_Image.flat และ values_values.arsc.flat และ AndroidManifest.xml ไฟล์ AAPT2 ลิงก์ผลลัพธ์กับ android.jar ซึ่งมีทรัพยากรที่กำหนดไว้ในแพ็กเกจ android:

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

คุณใช้ตัวเลือกต่อไปนี้ร่วมกับคําสั่ง link ได้

ตารางที่ 3 ตัวเลือกคำสั่งของลิงก์

ตัวเลือก คำอธิบาย
-o path

ระบุเส้นทางเอาต์พุตสำหรับ APK ของทรัพยากรที่ลิงก์ไว้

ค่านี้เป็นแฟล็กที่จำเป็นเนื่องจากคุณต้องระบุเส้นทางสำหรับ APK เอาต์พุตที่สามารถเก็บทรัพยากรที่ลิงก์ได้

--manifest file

ระบุเส้นทางไปยังไฟล์ Manifest ของ Android เพื่อสร้าง

ค่าสถานะนี้จำเป็น เนื่องจากไฟล์ Manifest แนบอยู่ ข้อมูลสำคัญเกี่ยวกับแอป เช่น ชื่อแพ็กเกจและแอปพลิเคชัน ID

-I

ระบุเส้นทางไปยัง android.jar ของแพลตฟอร์มหรือ APK อื่นๆ เช่น framework-res.apk ซึ่งอาจเป็นประโยชน์ขณะสร้าง ใหม่ๆ

ต้องระบุแฟล็กนี้หากคุณใช้แอตทริบิวต์ที่มี เนมสเปซ android ในไฟล์ทรัพยากร
-A directory ระบุไดเรกทอรีเนื้อหาที่จะรวมไว้ใน APK

คุณใช้ไดเรกทอรีนี้เพื่อจัดเก็บไฟล์ต้นฉบับที่ไม่ได้ประมวลผลได้ ถึง ดูข้อมูลเพิ่มเติม อ่าน การเข้าถึงไฟล์ต้นฉบับ

-R file ส่งต่อไฟล์ .flat ไฟล์เดียวไปยัง link โดยใช้ความหมาย overlay โดยไม่ใช้แท็ก <add-resource>

เมื่อคุณให้ไฟล์ทรัพยากรที่วางซ้อนไฟล์ที่มีอยู่ มีการใช้ทรัพยากรที่ขัดแย้งกันครั้งล่าสุด

--package-id package-id ระบุรหัสแพ็กเกจที่จะใช้สำหรับแอป

รหัสแพ็กเกจที่คุณระบุต้องมากกว่าหรือเท่ากับ 0x7f ยกเว้นเมื่อใช้ร่วมกับ --allow-reserved-package-id

--allow-reserved-package-id

อนุญาตให้ใช้รหัสแพ็กเกจที่สงวนไว้

รหัสแพ็กเกจที่สงวนไว้คือรหัสที่โดยปกติแล้วจะมีการกำหนดให้แชร์ และในช่วงตั้งแต่ 0x02 ถึง 0x7e โดยการใช้ --allow-reserved-package-id คุณสามารถกําหนดรหัสที่ตรงกับ ในช่วงของรหัสแพ็กเกจที่จองไว้

ควรใช้ตัวเลือกนี้สำหรับแพ็กเกจที่มีเวอร์ชัน min-sdk เท่านั้น 26 หรือต่ำกว่า

--java directory ระบุไดเรกทอรีที่จะสร้าง R.java
--proguard proguard_options สร้างไฟล์เอาต์พุตสำหรับกฎ ProGuard
--proguard-conditional-keep-rules สร้างไฟล์เอาต์พุตของกฎ ProGuard สำหรับ DEX หลัก
--no-auto-version ปิดใช้การกำหนดเวอร์ชัน SDK ของรูปแบบและเลย์เอาต์อัตโนมัติ
--no-version-vectors ปิดใช้การกำหนดเวอร์ชันอัตโนมัติของเวกเตอร์ที่ถอนออกได้ ใช้ธงนี้เมื่อสร้าง APK ด้วย Vector Drawable เท่านั้น คลัง
--no-version-transitions ปิดใช้การกำหนดเวอร์ชันทรัพยากรการเปลี่ยนโดยอัตโนมัติ ใช้แฟล็กนี้เมื่อสร้าง APK ด้วยไลบรารีการสนับสนุนการเปลี่ยนเท่านั้น
--no-resource-deduping ปิดใช้การกรองทรัพยากรที่ซ้ำกันโดยอัตโนมัติที่มีค่าเหมือนกันใน และการกำหนดค่าที่เข้ากันได้
--enable-sparse-encoding เปิดใช้การเข้ารหัสรายการแบบกระจัดกระจายโดยใช้แผนผังการค้นหาไบนารี การดำเนินการนี้มีประโยชน์สำหรับการเพิ่มประสิทธิภาพขนาด APK แต่มีค่าใช้จ่ายสำหรับทรัพยากร ประสิทธิภาพการดึงข้อมูล
-z ต้องมีการแปลสตริงที่ทำเครื่องหมายว่า "แนะนำ"
-c config ระบุรายการการกำหนดค่าที่คั่นด้วยคอมมา

ตัวอย่างเช่น หากคุณมีทรัพยากร Dependency ในไลบรารีการสนับสนุน ซึ่ง มีคำแปลสำหรับหลายภาษา คุณกรองแหล่งข้อมูลได้ เฉพาะสำหรับการกำหนดค่าภาษาหนึ่งๆ เช่น อังกฤษหรือสเปน

คุณต้องกำหนดค่าภาษาโดยใช้ ISO 639-1 แบบ 2 ตัวอักษร รหัสภาษา ตามด้วย ISO 3166-1-alpha-2 แบบ 2 ตัวอักษร รหัสภูมิภาคที่นำหน้าด้วยอักษรตัวพิมพ์เล็ก "r" เช่น en-rUS

--preferred-density density อนุญาตให้ AAPT2 เลือกความหนาแน่นและแถบที่ตรงกันมากที่สุด อื่นๆ ทั้งหมด

มีตัวระบุความหนาแน่นของพิกเซลหลายแบบให้ใช้ในแอปของคุณ เช่น ldpi, hdpi และ xhdpi เมื่อคุณระบุความหนาแน่นที่ต้องการ AAPT2 เลือกและจัดเก็บความหนาแน่นของการจับคู่ที่ใกล้เคียงที่สุดในทรัพยากร ตารางและนำรายการอื่นๆ ทั้งหมดออก

--output-to-dir แสดงเนื้อหา APK ไปยังไดเรกทอรีที่ -o ระบุ

หากคุณพบข้อผิดพลาดใดๆ เมื่อใช้ Flag นี้ คุณสามารถแก้ไขข้อผิดพลาดเหล่านั้นได้ด้วยการอัปเกรด ไปยังเครื่องมือสร้าง Android SDK 28.0.0 ขึ้นไป

--min-sdk-version min-sdk-version ตั้งค่าเวอร์ชัน SDK ขั้นต่ำเริ่มต้นที่จะใช้ AndroidManifest.xml
--target-sdk-version target-sdk-version ตั้งค่าเวอร์ชัน SDK เป้าหมายเริ่มต้นที่จะใช้ AndroidManifest.xml
--version-code version-code ระบุรหัสเวอร์ชันที่จะแทรกลงไป AndroidManifest.xml หากไม่มี
--version-name version-name ระบุชื่อเวอร์ชันที่จะแทรก AndroidManifest.xml หากไม่มี
--revision-code revision-code ระบุโค้ดการแก้ไขที่จะแทรกลงไป AndroidManifest.xml ไฟล์ หากไม่มี
--replace-version หากเป็น --version-code, --version-name หรือ มีการระบุ --revision-code ค่าเหล่านี้จะแทนที่ค่าใดๆ ในไฟล์ Manifest อยู่แล้ว โดยค่าเริ่มต้น จะไม่มีการเปลี่ยนแปลงใดๆ หากไฟล์ Manifest กำหนดแอตทริบิวต์เหล่านี้แล้ว
--compile-sdk-version-nacodeme compile-sdk-version-name ระบุรหัสเวอร์ชันที่จะแทรกลงไป AndroidManifest.xml ไฟล์ หากไม่มี
--compile-sdk-version-name compile-sdk-version-name ระบุชื่อเวอร์ชันที่จะแทรก AndroidManifest.xml ไฟล์ หากไม่มี
--proto-format สร้างทรัพยากรที่คอมไพล์แล้วในรูปแบบ Protobuf

เหมาะสำหรับใช้เป็นอินพุต วันที่ bundletool เพื่อสร้าง Android App Bundle

--non-final-ids สร้าง R.java ที่มีรหัสทรัพยากรที่ไม่ใช่ขั้นสุดท้าย อ้างอิงไปยัง รหัสจากโค้ดของแอปไม่แสดงในบรรทัดระหว่าง kotlinc หรือ javac ในการรวบรวม
--emit-ids path ส่งออกไฟล์ที่เส้นทางที่ระบุพร้อมด้วยรายการของประเภททรัพยากรและ การแมปรหัส เหมาะสำหรับใช้กับ --stable-ids
--stable-ids outputfilename.ext จะใช้ไฟล์ที่สร้างด้วย --emit-ids ซึ่งมีค่า รายการชื่อประเภททรัพยากรและรหัสที่กำหนดไว้

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

--custom-package package_name ระบุแพ็กเกจ Java ที่กำหนดเองเพื่อสร้าง R.java ภายใต้
--extra-packages package_name สร้างไฟล์ R.java เดียวกัน แต่มีแพ็กเกจต่างกัน
--add-javadoc-annotation annotation เพิ่มคำอธิบายประกอบ JavaDoc ลงในชั้นเรียน Java ที่สร้างขึ้นทั้งหมด
--output-text-symbols path สร้างไฟล์ข้อความที่มีสัญลักษณ์แหล่งข้อมูลของคลาส R ในไฟล์ที่ระบุ

คุณต้องระบุเส้นทางไปยังไฟล์เอาต์พุต

--auto-add-overlay อนุญาตการเพิ่มทรัพยากรใหม่ในการวางซ้อนโดยไม่ต้องใช้ แท็ก <add-resource>
--rename-manifest-package manifest-package เปลี่ยนชื่อแพ็กเกจในไฟล์ AndroidManifest.xml
--rename-instrumentation-target-package instrumentation- target-package เปลี่ยนชื่อแพ็กเกจเป้าหมายสำหรับ instrumentation

ควรใช้ตัวเลือกนี้ร่วมกับ --rename-manifest-package

-0 extension

ระบุนามสกุลของไฟล์ที่คุณไม่ต้องการบีบอัด

--split path:config[,config[..]] แยกทรัพยากรตามชุดการกำหนดค่าเพื่อสร้างทรัพยากร เวอร์ชัน APK

คุณต้องระบุเส้นทางไปยัง APK เอาต์พุต พร้อมด้วยชุดของ การกำหนดค่าเอง

--proguard-main-dex file ไฟล์เอาต์พุตของกฎ ProGuard ที่สร้างขึ้นสำหรับ DEX หลัก
--proguard-minimal-keep-rules สร้างชุดกฎ Keep ของ ProGuard เพียงเล็กน้อย
--no-resource-removal ปิดใช้การนำทรัพยากรออกโดยอัตโนมัติโดยไม่มีค่าเริ่มต้น ใช้ตัวเลือกนี้ เมื่อสร้างแพ็กเกจการวางซ้อนทรัพยากรรันไทม์เท่านั้น
-x แฟล็กเดิมที่ระบุการใช้ตัวระบุแพ็กเกจ 0x01
--product products-list ระบุรายการชื่อผลิตภัณฑ์ที่จะเก็บไว้โดยคั่นด้วยคอมมา
--no-xml-namespaces นำคำนำหน้า XML Namespace และข้อมูล URI ออกจาก AndroidManifest.xml ไฟล์และไบนารี XML ใน res/*
--shared-lib สร้างไลบรารีรันไทม์ของ Android ที่ใช้ร่วมกัน
--static-lib สร้างไลบรารี Android แบบคงที่
--no-static-lib-packages ผสานทรัพยากรไลบรารีทั้งหมดภายใต้แพ็กเกจของแอป
--no-proguard-location-reference ป้องกันไม่ให้ไฟล์กฎ ProGuard อ้างอิงไปยังไฟล์ต้นฉบับ
--private-symbols package-name package-name ระบุชื่อแพ็กเกจที่จะใช้เมื่อสร้าง R.java สำหรับสัญลักษณ์ส่วนตัว หากไม่ได้ระบุ จะเป็นสาธารณะและ สัญลักษณ์ส่วนตัวจะใช้ชื่อแพ็กเกจของแอป
--override-styles-instead-of-overlaying ทำให้รูปแบบที่กำหนดไว้ในทรัพยากร -R แทนที่คำจำกัดความก่อนหน้า แทนที่จะรวมเข้าด้วยกัน
--rename-resources-package package-name เปลี่ยนชื่อแพ็กเกจในตารางทรัพยากรเป็น package-name
--no-compress ไม่บีบอัดทรัพยากรใดๆ
--keep-raw-values เก็บรักษาค่าแอตทริบิวต์ดิบในไฟล์ XML
--no-compress-regex regular-expression ไม่บีบอัดส่วนขยายที่ตรงกับ regular-expression ใช้สัญลักษณ์ $ ที่ท้ายบรรทัด ใช้ ไวยากรณ์ของนิพจน์ทั่วไป ECMAScript ที่พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
--warn-manifest-validation ถือว่าข้อผิดพลาดในการตรวจสอบความถูกต้องของไฟล์ Manifest เป็นคำเตือน
--exclude-configs qualifier[,qualifier[..]] ไม่รวมค่าของทรัพยากรที่การกำหนดค่ามีที่ระบุ รอบก่อน
--debug-mode แทรก android:debuggable="true" ลงในโหนดของแอปพลิเคชัน ของไฟล์ Manifest ทำให้สามารถแก้ไขข้อบกพร่องของแอปพลิเคชันได้แม้ในเวอร์ชันที่ใช้งานจริง อุปกรณ์
--strict-visibility ไม่อนุญาตให้โฆษณาซ้อนทับที่มีระดับการมองเห็นแตกต่างกัน
--exclude-sources ไม่เรียงลำดับข้อมูลไฟล์ต้นฉบับเมื่อสร้างทรัพยากรใน รูปแบบ Protobuf
--trace-folder folder สร้างส่วนย่อยการติดตาม JSON ของ systrace ไปยัง folder ที่ระบุ
--merge-only ระบบจะผสานเฉพาะทรัพยากรโดยไม่ยืนยันการอ้างอิงทรัพยากรเท่านั้น ช่วงเวลานี้ ควรใช้ Flag เฉพาะกับ --static-lib เท่านั้น แจ้ง
-h แสดงเมนูความช่วยเหลือ
-v เปิดใช้การพูดรายละเอียดที่เพิ่มขึ้นของเอาต์พุต

ดัมพ์

dump ใช้เพื่อพิมพ์ข้อมูลเกี่ยวกับ APK ที่คุณสร้างโดยใช้ คำสั่ง link

ดัมพ์ไวยากรณ์

ไวยากรณ์ทั่วไปสำหรับการใช้ dump มีดังนี้

aapt2 dump sub-command filename.apk [options]

ตัวอย่างต่อไปนี้พิมพ์เนื้อหาจากตารางทรัพยากรของข้อมูลที่ระบุ APK:

aapt2 dump resources output.apk

คำสั่งย่อยดัมพ์

ระบุคำสั่งย่อยรายการใดรายการหนึ่งต่อไปนี้ด้วยคำสั่ง dump

ตาราง 4 คำสั่งย่อยดัมพ์

คำสั่งย่อยคำอธิบาย
apc พิมพ์เนื้อหาของคอนเทนเนอร์ AAPT2 (APC) ที่สร้างขึ้นระหว่าง ในการรวบรวม
badging พิมพ์ข้อมูลที่ดึงมาจากไฟล์ Manifest ของ APK
configurations พิมพ์การกำหนดค่าทั้งหมดที่ทรัพยากรใน APK ใช้
overlayable พิมพ์ทรัพยากร APK ที่วางซ้อนได้
packagename พิมพ์ชื่อแพ็กเกจของ APK
permissions พิมพ์สิทธิ์ที่ดึงมาจากไฟล์ Manifest ของ APK
strings พิมพ์เนื้อหาของพูลสตริงทรัพยากรในตารางทรัพยากรของ APK
styleparents พิมพ์รูปแบบหลักที่ใช้ใน APK
resources พิมพ์เนื้อหาในตารางทรัพยากรของ APK
xmlstrings พิมพ์สตริงจาก XML ที่คอมไพล์ของ APK
xmltree พิมพ์แผนผังของ XML ที่คอมไพล์ของ APK

ตัวเลือกดัมพ์

ใช้ตัวเลือกต่อไปนี้กับ dump

ตาราง 5 ตัวเลือกดัมพ์

ตัวเลือกคำอธิบาย
--no-values ระงับเอาต์พุตของค่าเมื่อแสดงทรัพยากร
--file file ระบุไฟล์เป็นอาร์กิวเมนต์ที่จะนำออกจาก APK
-v เพิ่มการพูดรายละเอียดของเอาต์พุต

ความแตกต่าง

ใช้ diff เพื่อเปรียบเทียบ APK 2 รายการและระบุความแตกต่างระหว่าง APK

ความแตกต่างทางไวยากรณ์

ไวยากรณ์ทั่วไปสำหรับการใช้ diff มีดังนี้

aapt2 diff first.apk second.apk

ไม่มีตัวเลือกสำหรับคำสั่ง diff

เพิ่มประสิทธิภาพ

optimize ใช้เพื่อเพิ่มประสิทธิภาพสำหรับทรัพยากรที่ผสานรวมและ resources.arsc ก่อนที่จะใช้แพ็กเกจใน APK การเพิ่มประสิทธิภาพนี้ สามารถลดขนาด APK ลงได้ประมาณ 1-3% ขึ้นอยู่กับขนาดและจำนวน ทรัพยากรที่ใช้ได้

เพิ่มประสิทธิภาพไวยากรณ์

ไวยากรณ์ทั่วไปสำหรับการใช้ optimize มีดังนี้

aapt2 optimize options file[,file[..]]

ตัวอย่างต่อไปนี้จะเพิ่มประสิทธิภาพทรัพยากรใน input.apk และสร้าง APK ที่เพิ่มประสิทธิภาพใน output.apk จะแทนที่การแสดงตารางค่าเดี่ยวตามปกติ ด้วยแผนผังการค้นหาไบนารีที่กะทัดรัดกว่า ส่งผลให้ APK มีขนาดเล็กลง ต้นทุนของประสิทธิภาพการเรียกข้อมูล:

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

ตัวเลือกการเพิ่มประสิทธิภาพ

คุณใช้ตัวเลือกต่อไปนี้กับ optimize ได้

ตาราง 6 ตัวเลือกการเพิ่มประสิทธิภาพ

ตัวเลือกคำอธิบาย
-o path ระบุเส้นทางเอาต์พุตสำหรับ APK ของทรัพยากรที่ลิงก์ไว้

ค่านี้เป็นแฟล็กที่จำเป็นเนื่องจากคุณต้องระบุเส้นทางสำหรับ APK เอาต์พุตที่สามารถเก็บทรัพยากรที่ลิงก์ได้

-d directory ระบุเส้นทางไปยังไดเรกทอรีเอาต์พุตสำหรับการแยก
-x path ระบุเส้นทางไปยังไฟล์การกำหนดค่า XML
-p พิมพ์อาร์ติแฟกต์ APK หลายรายการแล้วออก
--target-densities density[,density[..]] ระบุรายการความหนาแน่นหน้าจอที่คั่นด้วยคอมมาของ APK ที่ได้รับการเพิ่มประสิทธิภาพ ทรัพยากรทั้งหมดที่อาจไม่ได้ใช้ในอุปกรณ์ของ ระบบจะนำความหนาแน่นที่ระบุออกจาก APK
--resources-config-path path

ระบุเส้นทางไปยังไฟล์ resources.cfg ที่มีลิสต์ของ และคำสั่งของทรัพยากรแต่ละรายการ

รูปแบบ: type/resource_name#[directive][,directive]

-c config[,config[..]] ระบุรายการการกำหนดค่าที่คั่นด้วยจุลภาคที่จะรวม ค่าเริ่มต้นคือทั้งหมด การกำหนดค่าเอง
--split path:config[,config[..]] แยกทรัพยากรตามชุดการกำหนดค่าเพื่อสร้างทรัพยากร เวอร์ชัน APK

คุณต้องระบุเส้นทางไปยัง APK เอาต์พุต พร้อมด้วยชุดของ การกำหนดค่าเอง

--keep-artifacts artifact[,artifact[..]] ระบุรายการอาร์ติแฟกต์ที่จะเก็บไว้โดยคั่นด้วยคอมมา ถ้าไม่ได้ระบุ และจะเก็บอาร์ติแฟกต์ทั้งหมดไว้
--enable-sparse-encoding เปิดใช้การเข้ารหัสรายการแบบกระจัดกระจายโดยใช้แผนผังการค้นหาไบนารี ตัวเลือกนี้มีประโยชน์สำหรับการเพิ่มประสิทธิภาพขนาด APK แต่มีค่าใช้จ่าย ประสิทธิภาพการเรียกดูทรัพยากร
--collapse-resource-names ยุบชื่อทรัพยากรเป็นค่าเดียวในพูลสตริงคีย์ ทรัพยากรได้รับการยกเว้นโดยใช้คำสั่ง no_collapse ใน ไฟล์ที่ระบุโดย --resources-config-path
--shorten-resource-paths ย่อเส้นทางทรัพยากรภายใน APK
--resource-path-shortening-map path ระบุเส้นทางที่จะแสดงการแมปเส้นทางแหล่งข้อมูลเก่าเป็นเส้นทางที่สั้นลง
-v เพิ่มการพูดรายละเอียดของเอาต์พุต
-h แสดงความช่วยเหลือของเครื่องมือ

ทำ Conversion

โดยค่าเริ่มต้น คำสั่ง compile ของ AAPT จะรวบรวมทรัพยากรในรูปแบบไบนารี ที่เหมาะสำหรับ APK ได้อย่างไร สามารถระบุรูปแบบ Protobuf ที่เหมาะกับ AAB โดยการระบุ --proto-format convert จะแปลง APK ระหว่างรูปแบบทั้งสอง

แปลงไวยากรณ์

ไวยากรณ์ทั่วไปสำหรับ convert มีดังนี้

aapt2 convert -o output-file options file[,file[..]]

ตัวอย่างต่อไปนี้จะแปลงทรัพยากรใน input.apk และสร้าง APK ใน output.apk ที่มีทรัพยากรรูปแบบ Protobuf จะแทนที่ การแสดงตารางค่าเดี่ยวที่มีแผนผังการค้นหาไบนารีที่กะทัดรัดกว่า ทำให้ได้ ใน APK ที่เล็กลงแต่ใช้ต้นทุนในการดึงข้อมูล เช่น

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

ตัวเลือกการแปลง

ใช้ตัวเลือกต่อไปนี้กับ convert

ตารางที่ 7 ตัวเลือกการแปลง

ตัวเลือกคำอธิบาย
-o path

ระบุเส้นทางเอาต์พุตสำหรับ APK ของทรัพยากรที่ลิงก์ไว้

ค่านี้เป็นแฟล็กที่จำเป็นเนื่องจากคุณต้องระบุเส้นทางสำหรับ APK เอาต์พุตที่สามารถเก็บทรัพยากรที่ลิงก์ได้

--output-format [proto|binary] รูปแบบของเอาต์พุต ค่าที่ยอมรับคือ proto และ binary หากไม่ได้ตั้งค่าไว้ ค่าเริ่มต้นจะเป็น binary
--enable-sparse-encoding เปิดใช้การเข้ารหัสรายการแบบกระจัดกระจายโดยใช้แผนผังการค้นหาไบนารี ตัวเลือกนี้มีประโยชน์สำหรับการเพิ่มประสิทธิภาพขนาด APK แต่มีค่าใช้จ่าย ประสิทธิภาพการเรียกดูทรัพยากร
--keep-raw-values เก็บรักษาค่าแอตทริบิวต์ดิบในไฟล์ XML
-v เพิ่มการพูดรายละเอียดของเอาต์พุต
-h แสดงความช่วยเหลือของเครื่องมือ

โหมด Daemon

AAPT เวอร์ชัน 2.19 ได้เปิดตัวโหมด Daemon สำหรับการออกคำสั่ง โหมด Daemon ช่วยให้ คุณป้อนคำสั่งหลายรายการในเซสชัน AAPT เดียว

ไวยากรณ์ Daemon

เริ่มต้นโหมด Daemon ด้วยคำสั่งต่อไปนี้

aapt2 daemon

เมื่อโหมด Daemon ทำงานแล้ว คุณสามารถป้อนคำสั่งได้ อาร์กิวเมนต์แต่ละรายการของ ต้องอยู่ในบรรทัดแยกต่างหาก และมีบรรทัดว่างอยู่ท้ายคำสั่ง ออกจากโหมด Daemon โดยพิมพ์ Control+D

พิจารณาคำสั่ง compile แต่ละรายการต่อไปนี้

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

คำสั่งเหล่านี้ป้อนได้ในโหมด Daemon ดังนี้

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

ตัวเลือกโหมด Daemon

ตัวเลือกเดียวสำหรับโหมด Daemon คือ --trace-folder folder ซึ่งสร้าง JSON ของ systrace การติดตามส่วนไปยัง folder ที่ระบุ

เวอร์ชัน

ระบุเวอร์ชันของ AAPT2 ที่คุณใช้ด้วยคำสั่ง version ดังนี้

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

การเปลี่ยนแปลงลักษณะการทำงานเมื่อใช้ AAPT2

ก่อน AAPT2 นั้น AAPT เป็นเวอร์ชันเริ่มต้นของ Android Asset Packing Tool ซึ่งตอนนี้เลิกใช้งานแล้ว แม้ว่า AAPT2 ควรทํางานร่วมกับ จากโปรเจ็กต์เก่าแล้ว ส่วนนี้จะอธิบายการเปลี่ยนแปลงลักษณะการทำงานบางอย่างที่คุณควรทำ ทราบ

ลำดับชั้นขององค์ประกอบในไฟล์ Manifest ของ Android

ใน AAPT เวอร์ชันก่อนหน้า องค์ประกอบที่ฝังอยู่ในโหนดที่ไม่ถูกต้องใน ไฟล์ AndroidManifest.xml รายการถูกเพิกเฉยหรือมีคำเตือน ตัวอย่างเช่น โปรดพิจารณาตัวอย่างต่อไปนี้

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

AAPT เวอร์ชันก่อนหน้าจะไม่สนใจแท็ก <action> ที่ใส่ผิดที่

เมื่อใช้ AAPT2 คุณจะได้รับข้อผิดพลาดต่อไปนี้

AndroidManifest.xml:15: error: unknown element <action> found.

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

การประกาศทรัพยากร

คุณระบุประเภทของทรัพยากรจากแอตทริบิวต์ name ไม่ได้อีกต่อไป ตัวอย่างต่อไปนี้ประกาศรายการทรัพยากร attr อย่างไม่ถูกต้อง

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

การประกาศประเภททรัพยากรด้วยวิธีนี้ส่งผลให้เกิดข้อผิดพลาดของบิลด์ต่อไปนี้

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

หากต้องการแก้ไขข้อผิดพลาดนี้ โปรดประกาศประเภทอย่างชัดแจ้งโดยใช้ type="attr"

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

นอกจากนี้ เมื่อประกาศองค์ประกอบ <style> องค์ประกอบระดับบนสุดต้องเป็น ประเภททรัพยากรของรูปแบบ ไม่เช่นนั้น คุณจะได้รับข้อผิดพลาดที่คล้ายกับข้อความต่อไปนี้

Error: (...) invalid resource type 'attr' for parent of style

การใช้สัญลักษณ์การอ้างอิงทรัพยากร @ ไม่ถูกต้อง

AAPT2 แสดงข้อผิดพลาดเกี่ยวกับบิลด์เมื่อคุณละเว้นหรือวางทรัพยากรไม่ถูกต้อง สัญลักษณ์อ้างอิง (@) เช่น หากคุณละสัญลักษณ์เมื่อ การระบุแอตทริบิวต์ของรูปแบบ:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

เมื่อสร้างโมดูล AAPT2 แสดงข้อผิดพลาดต่อไปนี้

ERROR: expected color but got (raw string) color/colorPrimary

นอกจากนี้ หากคุณใส่สัญลักษณ์ไม่ถูกต้องเมื่อเข้าถึง ทรัพยากรจากเนมสเปซ android:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

เมื่อสร้างโมดูล AAPT2 แสดงข้อผิดพลาดต่อไปนี้

Error: style attribute '@android:attr/windowEnterAnimation' not found

การกำหนดค่าไลบรารีไม่ถูกต้อง

หากแอปมีทรัพยากร Dependency ในไลบรารีของบุคคลที่สามที่สร้างขึ้นจากเวอร์ชันเก่า เครื่องมือสร้าง Android SDK แอปอาจขัดข้องขณะรันไทม์โดยไม่แสดงข้อผิดพลาดหรือคำเตือน ข้อขัดข้องนี้ อาจเกิดขึ้นเนื่องจากในระหว่างการสร้างไลบรารี ฟิลด์ R.java ประกาศเป็น final ดังนั้น รหัสทรัพยากรทั้งหมดจะอยู่ในบรรทัด ของห้องสมุด

AAPT2 ใช้ความสามารถในการกำหนดรหัสให้กับทรัพยากรไลบรารีอีกครั้งเมื่อสร้าง แอปของคุณ หากไลบรารีถือว่ารหัสคือ final และรวมรหัสไว้ใน DEX ไลบรารีจะมีรันไทม์ที่ไม่ตรงกัน

หากต้องการแก้ไขข้อผิดพลาดนี้ โปรดติดต่อผู้เขียนห้องสมุดเพื่อสร้างไลบรารีอีกครั้ง โดยใช้เครื่องมือสร้าง Android SDK เวอร์ชันล่าสุด และเผยแพร่ ไลบรารี