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 डाउनलोड करें. इसके लिए, यह तरीका अपनाएं:
- रिपॉज़िटरी इंडेक्स में, com.android.tools.build > aapt2 पर जाएं.
 - AAPT2 के नए वर्शन का नाम कॉपी करें.
 कॉपी किए गए वर्शन के नाम को इस यूआरएल में डालें और अपने टारगेट ऑपरेटिंग सिस्टम के बारे में बताएं: 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
किसी ब्राउज़र में यूआरएल पर जाएं. AAPT2 जल्द ही डाउनलोड होना शुरू हो जाएगा.
अभी डाउनलोड की गई JAR फ़ाइल को अनपैक करें.
JAR फ़ाइल में एक
aapt2एक्ज़ीक्यूटेबल और कुछ ऐसी लाइब्रेरी होनी चाहिए जिन पर एक्ज़ीक्यूटेबल निर्भर करता है.
कंपाइल करें
AAPT2, सभी Android रिसॉर्स टाइप को कंपाइल करने की सुविधा देता है. जैसे, ड्रॉएबल और एक्सएमएल फ़ाइलें. कंपाइलेशन के लिए AAPT2 को शुरू करते समय, हर बार एक इनपुट के तौर पर एक रिसॉर्स फ़ाइल पास करें. इसके बाद, AAPT2 फ़ाइल को पार्स करता है और .flat एक्सटेंशन वाली इंटरमीडिएट बाइनरी फ़ाइल जनरेट करता है.
पूरी डायरेक्ट्री पास करने पर, AAPT2 डायरेक्ट्री में मौजूद सभी फ़ाइलों को फिर से कंपाइल करता है. भले ही, सिर्फ़ एक संसाधन में बदलाव किया गया हो. --dir फ़्लैग का इस्तेमाल करके, AAPT2 को एक से ज़्यादा संसाधन फ़ाइलें रखने वाली संसाधन डायरेक्ट्री पास की जा सकती हैं. हालांकि, इस तरीके से आपको इंक्रीमेंटल रिसोर्स कंपाइलेशन के फ़ायदे नहीं मिलते.
कंपाइल करने के लिए दिए गए इनपुट के आधार पर, आउटपुट फ़ाइल टाइप अलग-अलग हो सकते हैं. इसके बारे में यहां दी गई टेबल में बताया गया है:
पहली टेबल. कंपाइलेशन के लिए इनपुट और आउटपुट फ़ाइल टाइप
| टेक्स्ट लिखो | आउटपुट | 
|---|---|
      एक्सएमएल रिसॉर्स फ़ाइलें, जैसे कि
      स्ट्रिंग और
      स्टाइल,
      जो 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 है.
कंपाइल करने के विकल्प
टेबल 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
     | 
    
     इस विकल्प का इस्तेमाल करके, कंपाइल की गई संसाधन फ़ाइल के सोर्स फ़ाइल पाथ को  | 
  
      -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 नेमस्पेस वाले एट्रिब्यूट का इस्तेमाल किया जा रहा है, तो यह फ़्लैग ज़रूरी है.
     | 
  
      -A directory
     | 
    
      यह APK में शामिल की जाने वाली ऐसेट डायरेक्ट्री के बारे में बताता है.
         इस डायरेक्ट्री का इस्तेमाल, ओरिजनल और बिना प्रोसेस की गई फ़ाइलों को सेव करने के लिए किया जा सकता है. ज़्यादा जानने के लिए, ओरिजनल फ़ाइलों को ऐक्सेस करना लेख पढ़ें.  | 
  
      -R file
     | 
    
      <add-resource> टैग का इस्तेमाल किए बिना, overlay सिमैंटिक का इस्तेमाल करके, किसी .flat फ़ाइल को link पर पास करता है.
      
      जब कोई ऐसी संसाधन फ़ाइल दी जाती है जो किसी मौजूदा फ़ाइल पर ओवरले करती है, तो विरोध करने वाले आखिरी संसाधन का इस्तेमाल किया जाता है.  | 
  
      --package-id package-id
     | 
    
      आपके ऐप्लिकेशन के लिए इस्तेमाल किए जाने वाले पैकेज आईडी के बारे में बताता है.
       आपने जो पैकेज आईडी दिया है वह 0x7f से ज़्यादा या इसके बराबर होना चाहिए. हालांकि, अगर इसका इस्तेमाल   | 
  
      --allow-reserved-package-id
     | 
    
       इससे रिज़र्व किए गए पैकेज आईडी का इस्तेमाल किया जा सकता है. आरक्षित पैकेज आईडी ऐसे आईडी होते हैं जो आम तौर पर शेयर की गई लाइब्रेरी को असाइन किए जाते हैं. इनकी रेंज 0x02 से 0x7e तक होती है.  इस विकल्प का इस्तेमाल सिर्फ़ उन पैकेज के लिए किया जाना चाहिए जिनमें   | 
  
      --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 ऐप्लिकेशन बंडल जनरेट करने के लिए, इसे 
          | 
  
      --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 के लिए, टारगेट पैकेज का नाम बदलता है.
 इस विकल्प का इस्तेमाल   | 
  
      -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
     | 
    
       यह उस  फ़ॉर्मैट: 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 के नए वर्शन का इस्तेमाल करके, लाइब्रेरी को फिर से बनाएं और उसे फिर से पब्लिश करें.