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 โดยทำดังนี้
- ในดัชนีที่เก็บ ให้ไปที่ com.android.tools.build > aapt2
- คัดลอกชื่อ AAPT2 เวอร์ชันล่าสุด
แทรกชื่อเวอร์ชันที่คุณคัดลอกลงใน 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
ไปที่ URL ในเบราว์เซอร์ ระบบจะเริ่มดาวน์โหลด AAPT2 ในอีกสักครู่
คลายแพ็กเกจไฟล์ JAR ที่คุณเพิ่งดาวน์โหลด
ไฟล์ JAR ควรมีไฟล์ปฏิบัติการ
aapt2และไลบรารีบางรายการที่ไฟล์ปฏิบัติการ ขึ้นอยู่กับ
คอมไพล์
AAPT2 รองรับการคอมไพล์ประเภททรัพยากร Android ทั้งหมด เช่น
ไฟล์ Drawable และ XML เมื่อเรียกใช้ AAPT2 เพื่อคอมไพล์ ให้ส่งไฟล์ทรัพยากรไฟล์เดียวเป็นอินพุตต่อการเรียกใช้ จากนั้น AAPT2 จะแยกวิเคราะห์ไฟล์
และสร้างไฟล์ไบนารีระดับกลางที่มีนามสกุล .flat
เมื่อส่งทั้งไดเรกทอรี AAPT2 จะคอมไพล์ไฟล์ทั้งหมดในไดเรกทอรีอีกครั้ง
แม้ว่าจะมีทรัพยากรเพียงรายการเดียวที่เปลี่ยนแปลงก็ตาม แม้ว่าคุณจะส่งไดเรกทอรีทรัพยากร
ที่มีไฟล์ทรัพยากรมากกว่า 1 ไฟล์ไปยัง AAPT2 โดยใช้แฟล็ก --dir
ได้ แต่คุณจะไม่ได้รับประโยชน์จากการคอมไพล์ทรัพยากรแบบเพิ่มทีละรายการด้วยวิธีนี้
ประเภทไฟล์เอาต์พุตอาจแตกต่างกันไปตามอินพุตที่คุณระบุสำหรับการคอมไพล์ ดังที่แสดงในตารางต่อไปนี้
ตารางที่ 1 ประเภทไฟล์อินพุตและเอาต์พุตสำหรับการคอมไพล์
| อินพุต | เอาต์พุต |
|---|---|
ไฟล์ทรัพยากร XML เช่น
String และ
Style
ซึ่งอยู่ในไดเรกทอรี res/values/
|
ตารางทรัพยากรที่มี *.arsc.flat เป็นส่วนขยาย
|
| ไฟล์ทรัพยากรอื่นๆ ทั้งหมด |
ไฟล์ทั้งหมดนอกเหนือจากไฟล์ในไดเรกทอรี
นอกจากนี้ ระบบจะบีบอัดไฟล์ PNG ทั้งหมดโดยค่าเริ่มต้นและใช้ส่วนขยาย |
ไฟล์ที่ 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
|
สร้างไฟล์ข้อความที่มีสัญลักษณ์ทรัพยากรใน
|
-preserve-visibility-of-styleables
|
หากระบุไว้ จะใช้กฎการมองเห็นเดียวกันสำหรับองค์ประกอบที่ปรับแต่งได้ซึ่ง ใช้สำหรับทรัพยากรอื่นๆ ทั้งหมด ไม่เช่นนั้น ระบบจะทำให้องค์ประกอบที่ปรับแต่งได้ทั้งหมดเป็นแบบสาธารณะ |
-visibility [public|private|default|]
|
ตั้งค่าระดับการมองเห็นของทรัพยากรที่คอมไพล์แล้วเป็นระดับที่ระบุ |
-trace-folder folder
|
สร้างsystraceส่วนข้อมูลการติดตาม JSON ไปยัง |
-source-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 ในไฟล์ทรัพยากร
|
-A directory
|
ระบุไดเรกทอรีเนื้อหาที่จะรวมไว้ใน APK
คุณใช้ไดเรกทอรีนี้เพื่อจัดเก็บไฟล์ต้นฉบับที่ยังไม่ได้ประมวลผลได้ หากต้องการ ดูข้อมูลเพิ่มเติม โปรดอ่าน การเข้าถึงไฟล์ต้นฉบับ |
-R file
|
ส่ง.flatไฟล์linkแต่ละไฟล์ไปยัง overlay โดยใช้ความหมาย
โดยไม่ต้องใช้แท็ก <add-resource>
เมื่อคุณระบุไฟล์ทรัพยากรที่ซ้อนทับไฟล์ที่มีอยู่ ระบบจะใช้ ทรัพยากรที่ขัดแย้งกันล่าสุด |
--package-id package-id
|
ระบุรหัสแพ็กเกจที่จะใช้กับแอป
รหัสแพ็กเกจที่คุณระบุต้องมากกว่าหรือเท่ากับ 0x7f
เว้นแต่จะใช้ร่วมกับ
|
--allow-reserved-package-id
|
อนุญาตให้ใช้รหัสแพ็กเกจที่สงวนไว้ รหัสแพ็กเกจที่สงวนไว้คือรหัสที่โดยปกติจะกำหนดให้กับไลบรารีที่ใช้ร่วมกัน
และอยู่ในช่วง 0x02 ถึง 0x7e รวม การใช้
ตัวเลือกนี้ควรใช้กับแพ็กเกจที่มีเวอร์ชัน |
--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
เหมาะสำหรับใช้เป็นอินพุตของ
|
--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
ควรใช้ตัวเลือกนี้ร่วมกับ |
-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
|
ระบุเส้นทางไปยังไฟล์ รูปแบบ: 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 เวอร์ชันล่าสุด แล้วเผยแพร่ไลบรารี อีกครั้ง