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 ดังนี้
- ในดัชนีที่เก็บ ให้ไปที่ ไปยัง 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 เช่น
ไฟล์ที่ถอนออกได้และไฟล์ XML เมื่อเรียกใช้ AAPT2 สำหรับการคอมไพล์ ให้ข้าม
ไฟล์ทรัพยากรเดียวเป็นอินพุตต่อการเรียกใช้ AAPT2 จะแยกวิเคราะห์ไฟล์
และสร้างไฟล์ไบนารีที่มีนามสกุล .flat
เมื่อส่งทั้งไดเรกทอรี AAPT2 จะคอมไพล์ไฟล์ทั้งหมดในไดเรกทอรีใหม่
แม้ว่าจะเปลี่ยนแหล่งข้อมูลเพียงแหล่งเดียวก็ตาม แม้ว่าคุณจะสามารถส่งต่อแหล่งข้อมูล
ไดเรกทอรีที่มีไฟล์ทรัพยากรมากกว่า 1 ไฟล์ที่ส่งไปยัง AAPT2 โดยใช้ --dir
ทำให้คุณไม่ได้รับประโยชน์จากการรวบรวมทรัพยากรที่เพิ่มขึ้นด้วยวิธีนี้
ประเภทไฟล์เอาต์พุตอาจแตกต่างกันไป ขึ้นอยู่กับอินพุตที่คุณระบุสำหรับการคอมไพล์ ดังที่แสดงในตารางต่อไปนี้
อินพุต | เอาต์พุต |
---|---|
ไฟล์ทรัพยากร XML เช่น
สตริง และ
รูปแบบ
อยู่ในไดเรกทอรี 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_img.png.flat
ตัวเลือกคอมไพล์
มีหลายตัวเลือกที่คุณใช้กับคำสั่ง compile
ได้ ตามที่แสดง
ในตาราง 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
|
สร้างไฟล์ข้อความที่มีสัญลักษณ์แหล่งข้อมูลใน
|
-preserve-visibility-of-styleables
|
หากระบุไว้ จะใช้กฎการแสดงผลเดียวกันกับการจัดรูปแบบที่ ที่ใช้สำหรับทรัพยากรอื่นๆ ทั้งหมด มิเช่นนั้น สไตล์ทั้งหมดที่จัดรูปแบบได้จะกลายเป็นสาธารณะ |
-visibility [public|private|default|]
|
ตั้งค่าการเปิดเผยของทรัพยากรที่คอมไพล์เป็นระดับที่ระบุ |
-trace-folder folder
|
สร้างส่วนย่อยการติดตาม JSON ของ systrace ไปยัง |
-source-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
ได้
ตัวเลือก | คำอธิบาย |
---|---|
-o path
|
ระบุเส้นทางเอาต์พุตสำหรับ APK ของทรัพยากรที่ลิงก์ไว้ ค่านี้เป็นแฟล็กที่จำเป็นเนื่องจากคุณต้องระบุเส้นทางสำหรับ APK เอาต์พุตที่สามารถเก็บทรัพยากรที่ลิงก์ได้ |
--manifest file
|
ระบุเส้นทางไปยังไฟล์ Manifest ของ Android เพื่อสร้าง ค่าสถานะนี้จำเป็น เนื่องจากไฟล์ Manifest แนบอยู่ ข้อมูลสำคัญเกี่ยวกับแอป เช่น ชื่อแพ็กเกจและแอปพลิเคชัน ID |
-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
|
ปิดใช้การกำหนดเวอร์ชันอัตโนมัติของเวกเตอร์ที่ถอนออกได้ ใช้ธงนี้เมื่อสร้าง 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
เหมาะสำหรับใช้เป็นอินพุต
วันที่ |
--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
|
สร้างชุดกฎ 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
คำสั่งย่อย | คำอธิบาย |
---|---|
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
ตัวเลือก | คำอธิบาย |
---|---|
--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
ได้
ตัวเลือก | คำอธิบาย |
---|---|
-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
|
แสดงความช่วยเหลือของเครื่องมือ |
ทำ 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
ตัวเลือก | คำอธิบาย |
---|---|
-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 เวอร์ชันล่าสุด และเผยแพร่ ไลบรารี