AAPT2

AAPT2 (Android Asset Packaging Tool) เป็นเครื่องมือบิลด์ที่ Android Studio และ Android Gradle Plugin ใช้เพื่อคอมไพล์และแพ็กเกจทรัพยากรของแอป 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 ใน Windows ให้เรียกใช้คำสั่ง aapt2.exe

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

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

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

ดาวน์โหลด 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 ทั้งหมด เช่น ไฟล์ Drawable และ XML เมื่อเรียกใช้ AAPT2 เพื่อคอมไพล์ ให้ส่งไฟล์ทรัพยากรไฟล์เดียวเป็นอินพุตต่อการเรียกใช้ จากนั้น AAPT2 จะแยกวิเคราะห์ไฟล์ และสร้างไฟล์ไบนารีระดับกลางที่มีนามสกุล .flat

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

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

ตารางที่ 1 ประเภทไฟล์อินพุตและเอาต์พุตสำหรับการคอมไพล์

อินพุต เอาต์พุต
ไฟล์ทรัพยากร XML เช่น String และ Style ซึ่งอยู่ในไดเรกทอรี 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 ที่คอมไพล์แล้วซึ่งจัดเก็บไว้ในไดเรกทอรี Drawable จะมีชื่อว่า drawable_img.png.flat

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

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

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

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

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

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

--dir directory

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

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

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

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

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

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

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

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

หากไม่ได้ใช้ปลั๊กอิน Android Gradle เพื่อสร้างแอปจากบรรทัดคำสั่ง คุณสามารถใช้เครื่องมือบรรทัดคำสั่งอื่นๆ เช่น d8 เพื่อคอมไพล์ Java bytecode เป็น DEX bytecode และ 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 มีข้อมูลสำคัญเกี่ยวกับแอป เช่น ชื่อแพ็กเกจและรหัสแอปพลิเคชัน

-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 ปิดใช้การควบคุมเวอร์ชันอัตโนมัติของ Vector Drawable ใช้แฟล็กนี้เมื่อสร้าง APK ด้วยไลบรารี Vector Drawable เท่านั้น
--no-version-transitions ปิดใช้การควบคุมเวอร์ชันอัตโนมัติของทรัพยากรการเปลี่ยนฉาก ใช้แฟล็กนี้เมื่อสร้าง APK ด้วยไลบรารีการรองรับการเปลี่ยนผ่านเท่านั้น
--no-resource-deduping ปิดใช้การลบข้อมูลที่ซ้ำกันโดยอัตโนมัติของทรัพยากรที่มีค่าเหมือนกันในการกำหนดค่าที่เข้ากันได้
--enable-sparse-encoding เปิดใช้การเข้ารหัสแบบกระจัดกระจายของรายการทรัพยากร ซึ่งจะช่วยลดขนาด APK, การใช้หน่วยความจำ และเวลาในการตอบสนองเมื่อเริ่มต้น รวมถึงเพิ่มเวลาในการค้นหาทรัพยากรแต่ละรายการเล็กน้อยหลังจากเริ่มต้น
-z ต้องแปลสตริงที่มีเครื่องหมาย "แนะนำ"
-c config ระบุรายการการกำหนดค่าที่คั่นด้วยคอมมา

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

คุณต้องกำหนดค่าภาษาด้วยรหัสภาษาแบบ 2 ตัวอักษรตามมาตรฐาน ISO 639-1 และอาจตามด้วยรหัสภูมิภาคแบบ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1-alpha-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 สร้างชุดกฎ ProGuard Keep ขั้นต่ำ
--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 สร้างsystraceส่วนข้อมูลการติดตาม JSON ไปยังfolderที่ระบุ
--merge-only ผสานทรัพยากรเท่านั้นโดยไม่ต้องยืนยันการอ้างอิงทรัพยากร ควรใช้แฟล็กนี้ ร่วมกับแฟล็ก --static-lib เท่านั้น
-h แสดงเมนูความช่วยเหลือ
-v เปิดใช้เอาต์พุตที่มีรายละเอียดมากขึ้น

ดัมพ์

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

ไวยากรณ์การส่งออก

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

aapt2 dump sub-command filename.apk [options]

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

aapt2 dump resources output.apk

คำสั่งย่อยของ Dump

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

ตารางที่ 4 คำสั่งย่อยของ Dump

คำสั่งย่อยคำอธิบาย
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

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

ไวยากรณ์ Diff

ไวยากรณ์ทั่วไปสำหรับการใช้ 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 แสดงความช่วยเหลือของเครื่องมือ

แปลง

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

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

ไวยากรณ์ทั่วไปสำหรับ 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 ซึ่งจะสร้างส่วนย่อยของร่องรอย systrace JSON ไปยัง folder ที่ระบุ

เวอร์ชัน

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

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

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

ก่อน AAPT2 นั้น AAPT เป็นเวอร์ชันเริ่มต้นของเครื่องมือแพ็กเกจชิ้นงาน Android ซึ่งตอนนี้เลิกใช้งานแล้ว แม้ว่า 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 ซ้อนกันอย่างถูกต้อง ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมของ App 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 เวอร์ชันล่าสุด แล้วเผยแพร่ไลบรารี อีกครั้ง