AAPT2

AAPT2 (Android ऐसेट पैकेजिंग टूल) एक बिल्ड टूल है. Android Studio और Android Gradle प्लगिन, इसका इस्तेमाल आपके ऐप्लिकेशन के संसाधनों को कंपाइल और पैकेज करने के लिए करते हैं. AAPT2, संसाधनों को पार्स करता है, उन्हें इंडेक्स करता है, और उन्हें बाइनरी फ़ॉर्मैट में कंपाइल करता है. यह फ़ॉर्मैट, Android प्लैटफ़ॉर्म के लिए ऑप्टिमाइज़ किया गया है.

Android Gradle प्लग इन 3.0.0 और इसके बाद के वर्शन में, AAPT2 डिफ़ॉल्ट रूप से चालू होता है. आम तौर पर, आपको aapt2 को खुद शुरू करने की ज़रूरत नहीं होती. हालांकि, अगर आपको Android Studio के बजाय अपने टर्मिनल और बिल्ड सिस्टम का इस्तेमाल करना है, तो कमांड लाइन से AAPT2 का इस्तेमाल किया जा सकता है. कमांड लाइन से, AAPT2 से जुड़ी बिल्ड गड़बड़ियों को भी डीबग किया जा सकता है. इसके लिए, Android SDK बिल्ड टूल 26.0.2 और इसके बाद के वर्शन में, AAPT2 को स्टैंडअलोन टूल के तौर पर ढूंढें.

कमांड लाइन से Android SDK Build Tools डाउनलोड करने के लिए, sdkmanager का इस्तेमाल करें और यह कमांड चलाएं:

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

एसडीके बिल्ड टूल डाउनलोड करने के बाद, android_sdk/build-tools/version/ में AAPT2 ढूंढें.

Android SDK Build Tools के वर्शन में अक्सर बदलाव नहीं किए जाते. इसलिए, हो सकता है कि आपके SDK Build Tools में शामिल AAPT2 का वर्शन, नया न हो. AAPT2 का नया वर्शन पाने के लिए, Google मेवन से AAPT2 डाउनलोड करें.

Linux या Mac पर कमांड लाइन से AAPT2 का इस्तेमाल करने के लिए, aapt2 कमांड चलाएं. Windows पर, aapt2.exe कमांड चलाएं.

AAPT2, इंक्रीमेंटल कंपाइलेशन की सुविधा चालू करके, संसाधनों को तेज़ी से कंपाइल करने में मदद करता है. इंक्रीमेंटल कंपाइलेशन के लिए, संसाधन प्रोसेसिंग को दो चरणों में बांटा जाता है:

  • कंपाइल करें: इससे संसाधन फ़ाइलों को बाइनरी फ़ॉर्मैट में कंपाइल किया जाता है.
  • लिंक: यह सभी कंपाइल की गई फ़ाइलों को मर्ज करता है और उन्हें एक पैकेज में पैक करता है.

इस तरह अलग-अलग करने से, इंक्रीमेंटल बिल्ड की परफ़ॉर्मेंस बेहतर होती है. उदाहरण के लिए, अगर किसी एक फ़ाइल में बदलाव किए गए हैं, तो आपको सिर्फ़ उस फ़ाइल को फिर से कंपाइल करना होगा.

Google Maven से AAPT2 डाउनलोड करना

अगर आपको AAPT2 का नया वर्शन चाहिए, जो बिल्ड टूल में बंडल नहीं किया गया है, तो Google की मेवन रिपॉज़िटरी से AAPT2 डाउनलोड करें. इसके लिए, यह तरीका अपनाएं:

  1. रिपॉज़िटरी इंडेक्स में, com.android.tools.build > aapt2 पर जाएं.
  2. AAPT2 के नए वर्शन का नाम कॉपी करें.
  3. कॉपी किए गए वर्शन के नाम को इस यूआरएल में डालें और अपने टारगेट ऑपरेटिंग सिस्टम के बारे में बताएं: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    उदाहरण के लिए, Windows के लिए 3.2.0-alpha18-4804415 वर्शन डाउनलोड करने के लिए, इसका इस्तेमाल करें: 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. किसी ब्राउज़र में यूआरएल पर जाएं. AAPT2 जल्द ही डाउनलोड होना शुरू हो जाएगा.

  5. अभी डाउनलोड की गई JAR फ़ाइल को अनपैक करें.

    JAR फ़ाइल में एक aapt2 एक्ज़ीक्यूटेबल और कुछ ऐसी लाइब्रेरी होनी चाहिए जिन पर एक्ज़ीक्यूटेबल निर्भर करता है.

कंपाइल करें

AAPT2, सभी Android रिसॉर्स टाइप को कंपाइल करने की सुविधा देता है. जैसे, ड्रॉएबल और एक्सएमएल फ़ाइलें. कंपाइलेशन के लिए AAPT2 को शुरू करते समय, हर बार एक इनपुट के तौर पर एक रिसॉर्स फ़ाइल पास करें. इसके बाद, AAPT2 फ़ाइल को पार्स करता है और .flat एक्सटेंशन वाली इंटरमीडिएट बाइनरी फ़ाइल जनरेट करता है.

पूरी डायरेक्ट्री पास करने पर, AAPT2 डायरेक्ट्री में मौजूद सभी फ़ाइलों को फिर से कंपाइल करता है. भले ही, सिर्फ़ एक संसाधन में बदलाव किया गया हो. --dir फ़्लैग का इस्तेमाल करके, AAPT2 को एक से ज़्यादा संसाधन फ़ाइलें रखने वाली संसाधन डायरेक्ट्री पास की जा सकती हैं. हालांकि, इस तरीके से आपको इंक्रीमेंटल रिसोर्स कंपाइलेशन के फ़ायदे नहीं मिलते.

कंपाइल करने के लिए दिए गए इनपुट के आधार पर, आउटपुट फ़ाइल टाइप अलग-अलग हो सकते हैं. इसके बारे में यहां दी गई टेबल में बताया गया है:

पहली टेबल. कंपाइलेशन के लिए इनपुट और आउटपुट फ़ाइल टाइप

टेक्स्ट लिखो आउटपुट
एक्सएमएल रिसॉर्स फ़ाइलें, जैसे कि स्ट्रिंग और स्टाइल, जो res/values/ डायरेक्ट्री में मौजूद हैं *.arsc.flat एक्सटेंशन वाली संसाधन टेबल.
अन्य सभी संसाधन फ़ाइलें.

res/values/ डायरेक्ट्री में मौजूद फ़ाइलों के अलावा, सभी फ़ाइलों को *.flat एक्सटेंशन वाली बाइनरी एक्सएमएल फ़ाइलों में बदल दिया जाता है.

इसके अलावा, सभी PNG फ़ाइलों को डिफ़ॉल्ट रूप से कंप्रेस किया जाता है और वे *.png.flat एक्सटेंशन का इस्तेमाल करती हैं. अगर आपको पीएनजी फ़ाइलों को कंप्रेस नहीं करना है, तो कंपाइल करने के दौरान --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 है.

कंपाइल करने के विकल्प

टेबल 2 में दिखाए गए compile कमांड के साथ कई विकल्पों का इस्तेमाल किया जा सकता है:

टेबल 2. कमांड कंपाइल करने के विकल्प

विकल्प ब्यौरा
-o path

इससे कंपाइल किए गए संसाधन(नों) के आउटपुट पाथ के बारे में पता चलता है.

यह ज़रूरी फ़्लैग है, क्योंकि आपको उस डायरेक्ट्री का पाथ बताना होगा जहां AAPT2, कंपाइल किए गए रिसॉर्स को आउटपुट और सेव कर सकता है.

--dir directory

यह विकल्प, संसाधनों को स्कैन करने के लिए डायरेक्ट्री तय करता है.

इस फ़्लैग का इस्तेमाल करके, एक ही निर्देश से कई संसाधन फ़ाइलों को कंपाइल किया जा सकता है. हालांकि, इससे इंक्रीमेंटल कंपाइलेशन के फ़ायदे नहीं मिलते. इसलिए, इस फ़्लैग का इस्तेमाल बड़े प्रोजेक्ट के लिए नहीं किया जाना चाहिए.

--pseudo-localize यह 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 यह फ़ंक्शन, तय किए गए फ़ोल्डर में systrace JSON ट्रेस फ़्रैगमेंट जनरेट करता है.
-source-path path इस विकल्प का इस्तेमाल करके, कंपाइल की गई संसाधन फ़ाइल के सोर्स फ़ाइल पाथ को path पर सेट किया जाता है.
-h इस विकल्प से, टूल के बारे में जानकारी मिलती है.
-v इस कुकी से, Verbose logging चालू होती है.

लिंक करने के चरण में, AAPT2 उन सभी इंटरमीडिएट फ़ाइलों को मर्ज करता है जिन्हें कंपाइल करने के चरण में जनरेट किया जाता है. जैसे, संसाधन टेबल, बाइनरी एक्सएमएल फ़ाइलें, और प्रोसेस की गई पीएनजी फ़ाइलें. इसके बाद, इन फ़ाइलों को एक ही APK में पैकेज किया जाता है. इसके अलावा, इस फ़ेज़ के दौरान अन्य सहायक फ़ाइलें भी जनरेट की जा सकती हैं. जैसे, R.java और ProGuard के नियमों वाली फ़ाइलें. हालांकि, जनरेट किए गए APK में DEX बाइटकोड नहीं होता और इस पर हस्ताक्षर नहीं किया जाता. इस APK को किसी डिवाइस पर डिप्लॉय नहीं किया जा सकता.

अगर कमांड लाइन से अपना ऐप्लिकेशन बनाने के लिए, Android Gradle प्लगिन का इस्तेमाल नहीं किया जा रहा है, तो कमांड लाइन वाले अन्य टूल का इस्तेमाल किया जा सकता है. जैसे, Java बाइटकोड को DEX बाइटकोड में कंपाइल करने के लिए d8 और अपने APK को साइन करने के लिए apksigner.

link का इस्तेमाल करने का सामान्य सिंटैक्स यहां दिया गया है:

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

यहां दिए गए उदाहरण में, AAPT2 दो इंटरमीडिएट फ़ाइलों, 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

यह विकल्प, Android मेनिफ़ेस्ट फ़ाइल का पाथ तय करता है, ताकि उसे बनाया जा सके.

यह ज़रूरी फ़्लैग है, क्योंकि मेनिफ़ेस्ट फ़ाइल में आपके ऐप्लिकेशन के बारे में ज़रूरी जानकारी होती है. जैसे, पैकेज का नाम और ऐप्लिकेशन आईडी.

-I

यह प्लैटफ़ॉर्म के android.jar या अन्य APK का पाथ देता है. जैसे, framework-res.apk. यह सुविधाओं को बनाने के दौरान काम आ सकता है.

अगर संसाधन फ़ाइलों में android नेमस्पेस वाले एट्रिब्यूट का इस्तेमाल किया जा रहा है, तो यह फ़्लैग ज़रूरी है.
-A directory यह APK में शामिल की जाने वाली ऐसेट डायरेक्ट्री के बारे में बताता है.

इस डायरेक्ट्री का इस्तेमाल, ओरिजनल और बिना प्रोसेस की गई फ़ाइलों को सेव करने के लिए किया जा सकता है. ज़्यादा जानने के लिए, ओरिजनल फ़ाइलों को ऐक्सेस करना लेख पढ़ें.

-R file <add-resource> टैग का इस्तेमाल किए बिना, overlay सिमैंटिक का इस्तेमाल करके, किसी .flat फ़ाइल को link पर पास करता है.

जब कोई ऐसी संसाधन फ़ाइल दी जाती है जो किसी मौजूदा फ़ाइल पर ओवरले करती है, तो विरोध करने वाले आखिरी संसाधन का इस्तेमाल किया जाता है.

--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 यह मुख्य DEX के लिए, ProGuard के नियमों वाली आउटपुट फ़ाइल जनरेट करता है.
--no-auto-version यह कुकी, स्टाइल और लेआउट के एसडीके वर्शन के अपने-आप अपडेट होने की सुविधा बंद करती है.
--no-version-vectors यह विकल्प चुनने पर, वेक्टर ड्रॉएबल के वर्शन अपने-आप सेव नहीं होते. इस फ़्लैग का इस्तेमाल सिर्फ़ तब करें, जब Vector Drawable लाइब्रेरी की मदद से APK बनाया जा रहा हो.
--no-version-transitions यह विकल्प चुनने पर, ट्रांज़िशन रिसॉर्स के वर्शन अपने-आप नहीं बनते. इस फ़्लैग का इस्तेमाल सिर्फ़ तब करें, जब ट्रांज़िशन सपोर्ट लाइब्रेरी की मदद से अपना APK बनाया जा रहा हो.
--no-resource-deduping यह विकल्प, एक जैसे कॉन्फ़िगरेशन वाले संसाधनों के डुप्लीकेट अपने-आप हटाने की सुविधा बंद कर देता है.
--enable-sparse-encoding इससे संसाधन की एंट्री के लिए स्पार्स एन्कोडिंग की सुविधा चालू होती है. इससे APK का साइज़, मेमोरी का इस्तेमाल, और स्टार्टअप लेटेंसी कम हो जाती है. साथ ही, स्टार्टअप के बाद अलग-अलग संसाधनों को खोजने में लगने वाले समय में थोड़ी बढ़ोतरी होती है.
-z 'सुझाया गया' के तौर पर मार्क की गई स्ट्रिंग का अनुवाद, स्थानीय भाषा के हिसाब से करना ज़रूरी है.
-c config इस नीति से, कॉमा लगाकर अलग किए गए कॉन्फ़िगरेशन की सूची मिलती है.

उदाहरण के लिए, अगर आपको सहायता लाइब्रेरी पर निर्भर रहना है, जिसमें कई भाषाओं के लिए अनुवाद शामिल हैं, तो सिर्फ़ दी गई भाषा के कॉन्फ़िगरेशन, जैसे कि अंग्रेज़ी या स्पैनिश के लिए संसाधनों को फ़िल्टर किया जा सकता है.

आपको भाषा का कॉन्फ़िगरेशन, दो अक्षरों वाले ISO 639-1 भाषा कोड के हिसाब से तय करना होगा. इसके बाद, दो अक्षरों वाले ISO 3166-1-ऐल्फ़ा-2 क्षेत्र कोड को भी तय किया जा सकता है. हालांकि, यह ज़रूरी नहीं है. क्षेत्र कोड से पहले, छोटे अक्षरों वाला 'r' होना चाहिए. उदाहरण के लिए, en-rUS.

--preferred-density density इससे AAPT2 को सबसे मिलती-जुलती डेंसिटी चुनने और बाकी सभी को हटाने की अनुमति मिलती है.

आपके ऐप्लिकेशन में इस्तेमाल करने के लिए, पिक्सल डेंसिटी के कई क्वालिफ़ायर उपलब्ध हैं. जैसे, ldpi, hdpi, और xhdpi. पसंदीदा डेंसिटी तय करने पर, AAPT2 संसाधन टेबल में सबसे मिलती-जुलती डेंसिटी चुनता है और उसे सेव करता है. साथ ही, बाकी सभी डेंसिटी हटा देता है.

--output-to-dir -o के ज़रिए तय की गई डायरेक्ट्री में APK का कॉन्टेंट आउटपुट करता है.

अगर इस फ़्लैग का इस्तेमाल करते समय आपको कोई गड़बड़ी मिलती है, तो Android SDK Build Tools 28.0.0 या उसके बाद के वर्शन पर अपग्रेड करके, उन्हें ठीक किया जा सकता है.

--min-sdk-version min-sdk-version इस विकल्प की मदद से, AndroidManifest.xml के लिए इस्तेमाल किए जाने वाले एसडीके के डिफ़ॉल्ट वर्शन को सेट किया जाता है.
--target-sdk-version target-sdk-version इस विकल्प की मदद से, 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 वैल्यू दी जाती हैं, तो ये वैल्यू, मेनिफ़ेस्ट में पहले से मौजूद किसी भी वैल्यू की जगह ले लेती हैं. अगर मेनिफ़ेस्ट में पहले से ही इन एट्रिब्यूट को तय किया गया है, तो डिफ़ॉल्ट रूप से कोई बदलाव नहीं होता.
--compile-sdk-version-nacodeme compile-sdk-version-name अगर AndroidManifest.xml फ़ाइल में कोई वर्शन कोड मौजूद नहीं है, तो यह विकल्प उस वर्शन कोड को इंजेक्ट करता है.
--compile-sdk-version-name compile-sdk-version-name अगर AndroidManifest.xml फ़ाइल में कोई वर्शन मौजूद नहीं है, तो यह विकल्प उस फ़ाइल में वर्शन का नाम डालने की सुविधा देता है.
--proto-format यह Protobuf फ़ॉर्मैट में कंपाइल किए गए संसाधन जनरेट करता है.

Android ऐप्लिकेशन बंडल जनरेट करने के लिए, इसे bundletool में इनपुट के तौर पर इस्तेमाल किया जा सकता है.

--non-final-ids यह फ़ंक्शन, फ़ाइनल नहीं किए गए संसाधन आईडी के साथ R.java जनरेट करता है. ऐप्लिकेशन के कोड में मौजूद आईडी के रेफ़रंस, kotlinc या javac कंपाइलेशन के दौरान इनलाइन नहीं किए जाते.
--emit-ids path यह दिए गए पाथ पर एक फ़ाइल बनाता है. इसमें संसाधन टाइप के नामों की सूची और उनके आईडी मैपिंग की जानकारी होती है. इसका इस्तेमाल --stable-ids के साथ किया जा सकता है.
--stable-ids outputfilename.ext --emit-ids की मदद से जनरेट की गई फ़ाइल का इस्तेमाल करता है. इस फ़ाइल में, संसाधन टाइप के नामों की सूची और उन्हें असाइन किए गए आईडी होते हैं.

इस विकल्प की मदद से, लिंक करते समय नए संसाधन जोड़ने या मौजूदा संसाधनों को मिटाने पर भी, असाइन किए गए आईडी स्थिर रहते हैं.

--custom-package package_name यह विकल्प, R.java जनरेट करने के लिए कस्टम Java पैकेज के बारे में बताता है.
--extra-packages package_name यह एक ही R.java फ़ाइल जनरेट करता है, लेकिन इसके पैकेज के नाम अलग-अलग होते हैं.
--add-javadoc-annotation annotation इससे जनरेट की गई सभी Java क्लास में JavaDoc एनोटेशन जुड़ जाता है.
--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 मुख्य DEX के लिए जनरेट किए गए ProGuard नियमों की आउटपुट फ़ाइल.
--proguard-minimal-keep-rules यह ProGuard के नियमों का कम से कम सेट जनरेट करता है.
--no-resource-removal यह विकल्प, डिफ़ॉल्ट वैल्यू के बिना संसाधनों को अपने-आप हटाने की सुविधा बंद कर देता है. इस विकल्प का इस्तेमाल सिर्फ़ तब करें, जब रनटाइम रिसॉर्स ओवरले पैकेज बनाए जा रहे हों.
-x लेगसी फ़्लैग, जो पैकेज आइडेंटिफ़ायर 0x01 के इस्तेमाल के बारे में बताता है.
--product products-list यह पैरामीटर, कॉमा लगाकर अलग किए गए उन प्रॉडक्ट के नामों की सूची तय करता है जिन्हें बनाए रखना है.
--no-xml-namespaces यह AndroidManifest.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 एक्सएमएल फ़ाइलों में एट्रिब्यूट की ओरिजनल वैल्यू सेव करता है.
--no-compress-regex regular-expression यह regular-expression से मेल खाने वाले एक्सटेंशन को कंप्रेस नहीं करता. लाइन के आखिर में $ सिंबल का इस्तेमाल करें. केस-सेंसिटिव ECMAScript रेगुलर एक्सप्रेशन व्याकरण का इस्तेमाल करता है.
--warn-manifest-validation यह विकल्प, मेनिफ़ेस्ट की पुष्टि करने से जुड़ी गड़बड़ियों को चेतावनियों के तौर पर दिखाता है.
--exclude-configs qualifier[,qualifier[..]] उन संसाधनों की वैल्यू शामिल नहीं करता जिनके कॉन्फ़िगरेशन में तय किए गए क्वालिफ़ायर शामिल हैं.
--debug-mode यह मेनिफ़ेस्ट के ऐप्लिकेशन नोड में android:debuggable="true" डालता है. इससे ऐप्लिकेशन को प्रोडक्शन डिवाइसों पर भी डीबग किया जा सकता है.
--strict-visibility इससे अलग-अलग विज़िबिलिटी लेवल वाले ओवरले की अनुमति नहीं मिलती.
--exclude-sources Protobuf फ़ॉर्मैट में संसाधन जनरेट करते समय, सोर्स फ़ाइल की जानकारी को क्रम से नहीं लगाता.
--trace-folder folder यह folder में बताए गए systrace JSON ट्रेस फ़्रैगमेंट जनरेट करता है.
--merge-only यह सिर्फ़ संसाधनों को मर्ज करता है. यह संसाधनों के रेफ़रंस की पुष्टि नहीं करता. इस फ़्लैग का इस्तेमाल सिर्फ़ --static-lib फ़्लैग के साथ किया जाना चाहिए.
-h सहायता मेन्यू दिखाता है.
-v इससे आउटपुट में ज़्यादा जानकारी मिलती है.

डंप करें

dump का इस्तेमाल, link कमांड का इस्तेमाल करके जनरेट किए गए APK के बारे में जानकारी प्रिंट करने के लिए किया जाता है.

डंप सिंटैक्स

dump का इस्तेमाल करने का सामान्य सिंटैक्स यहां दिया गया है:

aapt2 dump sub-command filename.apk [options]

यहां दिए गए उदाहरण में, बताए गए APK की संसाधन टेबल से कॉन्टेंट प्रिंट किया जाता है:

aapt2 dump resources output.apk

डंप सब-कमांड

dump कमांड के साथ इनमें से कोई एक सब-कमांड तय करें:

चौथी टेबल. डंप सब-कमांड

सब-कमांडब्यौरा
apc यह विकल्प, कंपाइल करने के दौरान जनरेट किए गए AAPT2 कंटेनर (APC) का कॉन्टेंट प्रिंट करता है.
badging यह APK के मेनिफ़ेस्ट से निकाली गई जानकारी को प्रिंट करता है.
configurations यह APK में मौजूद किसी संसाधन के लिए इस्तेमाल किए गए हर कॉन्फ़िगरेशन को प्रिंट करता है.
overlayable यह APK के ओवरले किए जा सकने वाले संसाधनों को प्रिंट करता है.
packagename इस विकल्प से, APK के पैकेज का नाम प्रिंट होता है.
permissions यह APK के मेनिफ़ेस्ट से निकाली गई अनुमतियों को प्रिंट करता है.
strings यह APK की रिसॉर्स टेबल के स्ट्रिंग पूल का कॉन्टेंट प्रिंट करता है.
styleparents यह APK में इस्तेमाल की गई स्टाइल के पैरंट प्रिंट करता है.
resources यह विकल्प, APK की संसाधन टेबल का कॉन्टेंट प्रिंट करता है.
xmlstrings यह APK के कंपाइल किए गए एक्सएमएल से स्ट्रिंग प्रिंट करता है.
xmltree यह APK के कंपाइल किए गए एक्सएमएल का ट्री प्रिंट करता है.

डंप करने के विकल्प

dump के साथ इन विकल्पों का इस्तेमाल करें:

टेबल 5. डंप करने के विकल्प

विकल्पब्यौरा
--no-values संसाधन दिखाते समय, वैल्यू के आउटपुट को छिपाता है.
--file file यह APK से डंप की जाने वाली फ़ाइल को आर्ग्युमेंट के तौर पर तय करता है.
-v इससे आउटपुट में ज़्यादा जानकारी मिलती है.

अंतर

दो APK की तुलना करने और उनके बीच के अंतर का पता लगाने के लिए, diff का इस्तेमाल करें.

डिफ़ सिंटैक्स

diff का इस्तेमाल करने का सामान्य सिंटैक्स यहां दिया गया है:

aapt2 diff first.apk second.apk

diff कमांड के लिए कोई विकल्प नहीं है.

ऑप्टिमाइज़ करें

optimize का इस्तेमाल, मर्ज किए गए संसाधनों को ऑप्टिमाइज़ करने के लिए किया जाता है. साथ ही, resources.arsc का इस्तेमाल, उन्हें APK में पैकेज करने से पहले किया जाता है. इस ऑप्टिमाइज़ेशन से, APK का साइज़ करीब 1 से 3% तक कम हो सकता है. यह इस बात पर निर्भर करता है कि इस्तेमाल किए जा रहे संसाधनों का साइज़ और संख्या कितनी है.

सिंटैक्स ऑप्टिमाइज़ करना

optimize का इस्तेमाल करने का सामान्य सिंटैक्स यहां दिया गया है:

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

नीचे दिए गए उदाहरण में, input.apk में मौजूद संसाधनों को ऑप्टिमाइज़ किया गया है. साथ ही, output.apk में एक नया, ऑप्टिमाइज़ किया गया APK बनाया गया है. यह सामान्य फ़्लैट टेबल के बजाय, ज़्यादा कॉम्पैक्ट फ़ॉर्मैट का इस्तेमाल करता है. इससे APK का साइज़, मेमोरी का इस्तेमाल, और स्टार्टअप में लगने वाला समय कम हो जाता है. साथ ही, स्टार्टअप के बाद अलग-अलग संसाधनों को खोजने में लगने वाले समय में थोड़ी बढ़ोतरी होती है.

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

ऑप्टिमाइज़ करने के विकल्प

optimize के साथ इन विकल्पों का इस्तेमाल किया जा सकता है:

टेबल 6. ऑप्टिमाइज़ करने के विकल्प

विकल्पब्यौरा
-o path इससे लिंक किए गए संसाधन के APK के आउटपुट पाथ के बारे में पता चलता है.

यह ज़रूरी फ़्लैग है, क्योंकि आपको उस आउटपुट APK का पाथ बताना होगा जिसमें लिंक किए गए संसाधन शामिल हो सकते हैं.

-d directory इससे स्प्लिट के लिए आउटपुट डायरेक्ट्री का पाथ तय किया जाता है.
-x path इस विकल्प से, एक्सएमएल कॉन्फ़िगरेशन फ़ाइल का पाथ तय किया जाता है.
-p यह मल्टी-एपीके आर्टफ़ैक्ट प्रिंट करता है और बंद हो जाता है.
--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 यह फ़ंक्शन, संसाधन के नामों को कुंजी स्ट्रिंग पूल में मौजूद किसी एक वैल्यू में छोटा कर देता है. --resources-config-path में बताई गई फ़ाइल में no_collapse डायरेक्टिव का इस्तेमाल करके, संसाधनों को छूट दी जाती है.
--shorten-resource-paths यह सुविधा, APK में मौजूद संसाधनों के पाथ को छोटा करती है.
--resource-path-shortening-map path यह विकल्प, पुराने रिसॉर्स पाथ को छोटे किए गए पाथ पर मैप करने के लिए, मैप को आउटपुट करने का पाथ तय करता है.
-v इससे आउटपुट में ज़्यादा जानकारी मिलती है.
-h इस टूल के बारे में जानकारी दिखाता है.

बदलें

डिफ़ॉल्ट रूप से, AAPT compile कमांड, संसाधनों को बाइनरी फ़ॉर्मैट में कंपाइल करती है. यह फ़ॉर्मैट, APK के लिए सही होता है. --proto-format तय करके, AAB के लिए सही प्रोटॉबफ़ फ़ॉर्मैट भी तय किया जा सकता है. convert कमांड, APK को इन दोनों फ़ॉर्मैट के बीच बदलती है.

सिंटैक्स बदलना

convert का सामान्य सिंटैक्स यहां दिया गया है:

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

यहां दिए गए उदाहरण में, input.apk में मौजूद संसाधनों को बदला गया है. साथ ही, output.apk में एक नया APK बनाया गया है, जिसमें प्रोटोबफ़ फ़ॉर्मैट वाले संसाधन शामिल हैं. यह सामान्य फ़्लैट टेबल को ज़्यादा कॉम्पैक्ट टेबल से बदल देता है. इससे 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 एक्सएमएल फ़ाइलों में एट्रिब्यूट की ओरिजनल वैल्यू सेव करता है.
-v इससे आउटपुट में ज़्यादा जानकारी मिलती है.
-h इस टूल के बारे में जानकारी दिखाता है.

डीमन मोड

AAPT के वर्शन 2.19 में, कमांड जारी करने के लिए डेमॉन मोड की सुविधा जोड़ी गई है. डेमॉन मोड की मदद से, एक ही AAPT सेशन में कई कमांड डाली जा सकती हैं.

डीमन सिंटैक्स

इस कमांड का इस्तेमाल करके, डेमॉन मोड शुरू करें:

aapt2 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/

इन कमांड को डेमॉन मोड में इस तरह से डाला जा सकता है:

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

डीमन मोड के विकल्प

डेमॉन मोड के लिए सिर्फ़ एक विकल्प उपलब्ध है: --trace-folder folder. यह विकल्प, तय किए गए folder के लिए systrace JSON ट्रेस फ़्रैगमेंट जनरेट करता है.

वर्शन

version कमांड का इस्तेमाल करके, पता लगाएं कि AAPT2 का कौनसा वर्शन इस्तेमाल किया जा रहा है:

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

AAPT2 का इस्तेमाल करने पर व्यवहार में बदलाव

AAPT2 से पहले, AAPT, Android ऐप्लिकेशन पैकेजिंग टूल का डिफ़ॉल्ट वर्शन था. हालांकि, अब इसे बंद कर दिया गया है. हालांकि, AAPT2 को पुराने प्रोजेक्ट के साथ तुरंत काम करना चाहिए. इस सेक्शन में, कुछ ऐसे बदलावों के बारे में बताया गया है जिनके बारे में आपको पता होना चाहिए.

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.

इस समस्या को हल करने के लिए, पक्का करें कि आपके मेनिफ़ेस्ट एलिमेंट सही तरीके से नेस्ट किए गए हों. ज़्यादा जानकारी के लिए, ऐप्लिकेशन मेनिफ़ेस्ट की खास जानकारी पढ़ें.

संसाधनों का एलान

अब 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

लाइब्रेरी का गलत कॉन्फ़िगरेशन

अगर आपका ऐप्लिकेशन, तीसरे पक्ष की ऐसी लाइब्रेरी पर निर्भर है जिसे Android SDK Build Tools के पुराने वर्शन का इस्तेमाल करके बनाया गया था, तो हो सकता है कि रनटाइम के दौरान आपका ऐप्लिकेशन क्रैश हो जाए. हालांकि, इस दौरान कोई गड़बड़ी या चेतावनी नहीं दिखेगी. यह क्रैश इसलिए हो सकता है, क्योंकि लाइब्रेरी बनाते समय R.java फ़ील्ड final के तौर पर घोषित किए जाते हैं. इस वजह से, सभी रिसॉर्स आईडी को लाइब्रेरी की क्लास में इनलाइन किया जाता है.

AAPT2, आपके ऐप्लिकेशन को बनाते समय लाइब्रेरी के संसाधनों को आईडी फिर से असाइन करने पर निर्भर करता है. अगर लाइब्रेरी यह मानती है कि आईडी final हैं और उन्हें लाइब्रेरी DEX में इनलाइन करती है, तो रनटाइम में आईडी मैच नहीं होते.

इस गड़बड़ी को ठीक करने के लिए, लाइब्रेरी के लेखक से संपर्क करें. उनसे कहें कि वे Android SDK Build Tools के नए वर्शन का इस्तेमाल करके, लाइब्रेरी को फिर से बनाएं और उसे फिर से पब्लिश करें.