Java SDK टूल लागू करें

Android प्लैटफ़ॉर्म पर बड़ी संख्या में शेयर की गई Java लाइब्रेरी मौजूद हैं जिसे वैकल्पिक रूप से ऐप्लिकेशन के क्लासपाथ में शामिल किया जा सकता है. ऐप्लिकेशन मेनिफ़ेस्ट में <uses-library> टैग जोड़ा है. ऐप्लिकेशन के लिंक इसलिए इन लाइब्रेरी को बाकी Android एपीआई की तरह इस्तेमाल करें. Google Analytics 4 प्रॉपर्टी के साथ काम करता है. हालांकि, ध्यान दें कि कि ज़्यादातर लाइब्रेरी में ये सुविधाएं नहीं हैं.

java_sdk_library मॉड्यूल टाइप, लाइब्रेरी को मैनेज करने में मदद करता है अलग-अलग तरह के ईमेल दिखते हैं. डिवाइस बनाने वाली कंपनियां अपने लिए, इस तरीके का इस्तेमाल कर सकती हैं साथ ही, एपीआई को पुराने सिस्टम के साथ काम करने के लिए बनाया गया है. यदि डिवाइस निर्माता बूट क्लास पाथ के बजाय <uses-library> टैग, java_sdk_library पुष्टि कर सकता है कि ये Java लाइब्रेरी एपीआई-स्टेबल.

java_sdk_library, वैकल्पिक SDK API को लागू करता है, ताकि इनका इस्तेमाल किया जा सके दिखाई देता है. आपकी java_sdk_library तक लागू की गई लाइब्रेरी बिल्ड फ़ाइल (Android.bp) के लिए ये काम करें:

  • स्टब लाइब्रेरी, stubs, stubs.system और stubs.test. ये स्टब लाइब्रेरी, @hide की पहचान करके बनाई जाती हैं, @SystemApi और @TestApi एनोटेशन.
  • java_sdk_library, एपीआई की खास बातों वाली फ़ाइलों को मैनेज करता है (जैसे, current.txt). ये फ़ाइलें नए कोड के हिसाब से जांच की जाती है, ताकि यह पक्का किया जा सके कि वे कर सकते हैं. अगर ऐसा नहीं है, तो आपको गड़बड़ी का एक मैसेज मिलेगा में उन्हें अपडेट करने का तरीका बताया गया है. इसमें हुए सभी अपडेट बदलावों की मैन्युअल रूप से समीक्षा करें पक्का करें कि वे आपकी उम्मीदों के मुताबिक हों.

    सभी एपीआई को अपडेट करने के लिए, m update-api का इस्तेमाल करें. एपीआई अप-टू-डेट है या नहीं, इसकी पुष्टि करने के लिए, m checkapi का इस्तेमाल करें.
  • एपीआई की खास बातों वाली फ़ाइलों की जांच हाल ही में की गई है Android के पब्लिश किए गए वर्शन, ताकि यह पक्का किया जा सके कि एपीआई पुराने सिस्टम के साथ काम करता है पुरानी रिलीज़ के साथ. java_sdk_library मॉड्यूल दिया गया है के भाग के रूप में अपने पूर्व में रिलीज़ किए गए वर्शन को prebuilts/sdk/<latest number>.
  • API विशिष्टता फ़ाइलों की जाँच के संबंध में, आप यह कर सकते हैं नीचे दी गई तीन चीज़ों में से एक:
    • जांच जारी रखें. (कुछ न करें.)
    • java_sdk_library में यह जोड़कर जांच बंद करें:
      unsafe_ignore_missing_latest_api: true,
    • नए java_sdk_library मॉड्यूल के लिए खाली एपीआई दें में module_name.txt नाम वाली खाली टेक्स्ट फ़ाइलें बनाकर version/scope/api डायरेक्ट्री.
  • अगर रनटाइम के लिए लागू करने वाली लाइब्रेरी इंस्टॉल है, तो एक एक्सएमएल फ़ाइल जनरेट और इंस्टॉल हो जाता है.

java_sdk_library कैसे काम करता है

X नाम का java_sdk_library, ये चीज़ें बनाता है:

  1. लागू की जाने वाली लाइब्रेरी की दो कॉपी: X नाम की एक लाइब्रेरी और X.impl नाम का एक दूसरा डोमेन है. लाइब्रेरी X इंस्टॉल हो गई है डिवाइस पर. लाइब्रेरी X.impl सिर्फ़ तब उपलब्ध होगी, जब को लागू करने के लिए इस्तेमाल की जाने वाली लाइब्रेरी ज़रूरी है. उदाहरण के लिए, दूसरे मॉड्यूल में इस्तेमाल करने के लिए टेस्टिंग हो रही है. ध्यान दें कि साफ़ तौर पर जानकारी ऐक्सेस करने की ज़रूरत बहुत ही कम होती है.
  2. ऐक्सेस को पसंद के मुताबिक बनाने के लिए, दायरों को चालू या बंद किया जा सकता है. (Java से मिलते-जुलते कीवर्ड-ऐक्सेस मॉडिफ़ायर, एक सार्वजनिक दायरा बड़ा करके ऐक्सेस उपलब्ध कराता है; एक जांच के दायरे में सिर्फ़ जांच में इस्तेमाल होने वाले एपीआई शामिल हैं.) हर चालू किए गए दायरे के लिए लाइब्रेरी से इन्हें बनाया जाता है:
    • एक स्टब्स सोर्स मॉड्यूल (droidstubs मॉड्यूल टाइप का) - इस्तेमाल करता है लागू करने का सोर्स और स्टब सोर्स के एक सेट का आउटपुट देता है एपीआई की खास बातों वाली फ़ाइल में.
    • एक स्टब्स लाइब्रेरी (java_library मॉड्यूल टाइप का) - स्टब का कंपाइल किया गया वर्शन है. इसे कंपाइल करने के लिए इस्तेमाल की गई लिब्स बिलकुल वही है जो java_sdk_library को दिया गया है. इससे यह पक्का होता है कि एपीआई स्टब में, लागू करने की जानकारी लीक नहीं होती.
    • अगर आपको स्टब को कंपाइल करने के लिए अतिरिक्त लाइब्रेरी की ज़रूरत है, तो stub_only_libs और stub_only_static_libs प्रॉपर्टी इस्तेमाल करें.

अगर किसी java_sdk_library को “X” कहा जाता है और “X” के तौर पर कंपाइल किया जाता है, इसलिए हमेशा इसे इसी तरीके से देखें और इसे. बिल्ड सही लाइब्रेरी को चुनेगा. यह पक्का करने के लिए कि आपके पास सबसे कारगर लाइब्रेरी है, तो अपने स्टब की जांच करके देखें कि बिल्ड गड़बड़ियां हैं. इन दिशा-निर्देशों का इस्तेमाल करके ज़रूरी बदलाव करें:

  • कमांड लाइन देखकर और पुष्टि करें कि आपके पास एक सही लाइब्रेरी है इस बात की जांच करना कि कौनसे स्टब वहां लिस्ट किए गए हैं, ताकि आपके स्कोप के बारे में पता चल सके:
    • दायरा बहुत बड़ा है: निर्भर लाइब्रेरी के लिए एपीआई के एक खास दायरे की ज़रूरत होती है. लेकिन आपको लाइब्रेरी में ऐसे एपीआई दिखते हैं जो उस दायरे से बाहर होते हैं, जैसे सिस्टम एपीआई, जो सार्वजनिक एपीआई के साथ शामिल हैं.
    • दायरा बहुत कम है: निर्भर लाइब्रेरी के पास जिसमें लाइब्रेरी की ज़रूरत पूरी होती है. उदाहरण के लिए, निर्भर लाइब्रेरी को सिस्टम एपीआई को पाने के बजाय, सार्वजनिक एपीआई को ऐक्सेस करता है. आम तौर पर, इस वजह से कंपाइलेशन गड़बड़ी, क्योंकि ज़रूरी एपीआई मौजूद नहीं हैं.
  • लाइब्रेरी की समस्या ठीक करने के लिए, इनमें से सिर्फ़ एक काम करें:
    • अपनी ज़रूरत के हिसाब से वर्शन चुनने के लिए, sdk_version को बदलें. या
    • उस लाइब्रेरी के बारे में साफ़ तौर पर बताएं, जैसे कि <X>.stubs या <X>.stubs.system.

java_sdk_library X इस्तेमाल करने का तरीका

लागू करने की लाइब्रेरी X का इस्तेमाल तब किया जाता है, जब उसका रेफ़रंस दिया जाता है apex.java_libs. हालांकि, सूंग सीमा के कारण, जब लाइब्रेरी X का रेफ़रंस, किसी दूसरे java_sdk_library मॉड्यूल से लिया गया है उसी APEX लाइब्रेरी में, X.impl साफ़ तौर पर का उपयोग करना चाहिए, न कि लाइब्रेरी X का.

जब java_sdk_library का रेफ़रंस किसी अन्य जगह से दिया जाता है, तो एक स्टब लाइब्रेरी का इस्तेमाल किया जाता है. स्टब्स लाइब्रेरी मॉड्यूल की sdk_version प्रॉपर्टी सेटिंग से बदल सकते हैं. उदाहरण के लिए, ऐसा मॉड्यूल जो तय करता है कि sdk_version: "current" सार्वजनिक स्टब का इस्तेमाल करता है, जबकि जो मॉड्यूल बताता है कि sdk_version: "system_current" सिस्टम स्टब. अगर एग्ज़ैक्ट मैच नहीं मिलता है, तो सबसे नज़दीकी स्टब लाइब्रेरी को इस्तेमाल किया गया. सिर्फ़ सार्वजनिक एपीआई उपलब्ध कराने वाला java_sdk_library सभी के लिए सार्वजनिक स्टब की सप्लाई करना.

Java SDK लाइब्रेरी की मदद से फ़्लो बनाएं
पहली इमेज. Java की SDK टूल लाइब्रेरी की मदद से फ़्लो बनाएं

उदाहरण और सोर्स

srcs और api_packages प्रॉपर्टी के लिए ज़रूरी है वे java_sdk_library में मौजूद रहेंगे.

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

एओएसपी, उस नए java_sdk_library का सुझाव देता है (हालांकि, ऐसा करना ज़रूरी नहीं है) इंस्टेंस की मदद से उन एपीआई के दायरे को साफ़ तौर पर चालू किया जा सकता है जिनका वे इस्तेमाल करना चाहते हैं. आप यह भी कर सकते हैं (ज़रूरी नहीं) मौजूदा java_sdk_library इंस्टेंस को इस पर माइग्रेट करें उन एपीआई दायरों को साफ़ तौर पर चालू करें जिनका वे इस्तेमाल करेंगे:

java_sdk_library {
         name: "lib",
         public: {
           enabled: true,
         },
         system: {
           enabled: true,
         },
         …
    }

रनटाइम के लिए इस्तेमाल की जाने वाली impl लाइब्रेरी को कॉन्फ़िगर करने के लिए, सभी का इस्तेमाल करें सामान्य java_library प्रॉपर्टी, जैसे कि hostdex, compile_dex और errorprone.

java_sdk_library {
        name: "android.test.base",

        srcs: ["src/**/*.java"],

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

स्टब लाइब्रेरी कॉन्फ़िगर करने के लिए, इन प्रॉपर्टी का इस्तेमाल करें:

  • merge_annotations_dirs और merge_inclusion_annotations_dirs.
  • api_srcs: वैकल्पिक सोर्स फ़ाइलों की सूची, जिनका हिस्सा है का हिस्सा नहीं है, लेकिन रनटाइम लाइब्रेरी का हिस्सा नहीं है.
  • stubs_only_libs: उन Java लाइब्रेरी की सूची जो क्लासपाथ का इस्तेमाल करें.
  • hidden_api_packages: उन पैकेज के नामों की सूची जिन्हें को एपीआई से छिपाया गया है.
  • droiddoc_options: इसके लिए अतिरिक्त तर्क मेटलवा के साथ आता है.
  • droiddoc_option_files: यह उन फ़ाइलों की सूची बनाता है जिनका रेफ़रंस दिया जा सकता है $(location <label>) का उपयोग करके droiddoc_options के अंदर से, जहां <file> सूची में एक एंट्री है.
  • annotations_enabled.

java_sdk_library एक java_library है, लेकिन यह droidstubs मॉड्यूल की वजह से, यह सभी droidstubs के साथ काम नहीं करता है प्रॉपर्टी. नीचे दिया गया उदाहरण android.test.mock लाइब्रेरी बिल्ड फ़ाइल से लिए जाते हैं.

java_sdk_library {
        name: "android.test.mock",

        srcs: [":android-test-mock-sources"],
        api_srcs: [
            // Note: The following aren’t APIs of this library. Only APIs under the
            // android.test.mock package are taken. These do provide private APIs
            // to which android.test.mock APIs reference. These classes are present
            // in source code form to access necessary comments that disappear when
            // the classes are compiled into a Jar library.
            ":framework-core-sources-for-test-mock",
            ":framework_native_aidl",
        ],

        libs: [
            "framework",
            "framework-annotations-lib",
            "app-compat-annotations",
            "Unsupportedappusage",
        ],

        api_packages: [
            "android.test.mock",
        ],
        permitted_packages: [
            "android.test.mock",
        ],
        compile_dex: true,
        default_to_stubs: true,
    }

पुराने सिस्टम के साथ काम करने की सुविधा को बनाए रखना

बिल्ड सिस्टम यह देखता है कि एपीआई पुराने सिस्टम का इस्तेमाल कर रहा है या नहीं इसके साथ काम करने के लिए, नई एपीआई फ़ाइलों की तुलना जनरेट की गई बिल्ड टाइम के दौरान एपीआई फ़ाइलें. java_sdk_library यह काम करता है prebuilt_apis में दी गई जानकारी का इस्तेमाल करके कंपैटबिलिटी की जांच करें. java_sdk_library के साथ बनाई गई सभी लाइब्रेरी में एपीआई फ़ाइलें होनी चाहिए prebuilt_apis के api_dirs के सबसे नए वर्शन में. वर्शन को रिलीज़ करने पर, एपीआई में फ़ाइलें और स्टब की सूची होती है लाइब्रेरी को डिस्टेंस बिल्ड के साथ PRODUCT=sdk_phone_armv7-sdk की मदद से डाउनलोड किया जा सकता है.

api_dirs प्रॉपर्टी, एपीआई वर्शन डायरेक्ट्री की सूची है prebuilt_apis में. एपीआई-वर्शन डायरेक्ट्री Android.bp डायरेक्ट्री के लेवल पर मौजूद होता है.

prebuilt_apis {
       name: "foo",
       api_dirs: [
           "1",
           "2",
             ....
           "30",
           "current",
       ],
    }

version/scope/api/ की मदद से डायरेक्ट्री कॉन्फ़िगर करें पहले से बनी हुई डायरेक्ट्री के तहत आता है. version अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एपीआई लेवल से मेल खाता है और scope यह जानकारी होगी कि डायरेक्ट्री सार्वजनिक है, सिस्टम है या टेस्ट है.

  • version/scope इसमें Java लाइब्रेरी मौजूद हैं.
  • version/scope/api में एपीआई मौजूद है .txt फ़ाइलें. नाम वाली खाली टेक्स्ट फ़ाइलें बनाएं module_name.txt अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और module_name-removed.txt यहां हैं.
     ├── 30
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.mock-removed.txt
          │       │   └── android.test.mock.txt
          │       └── android.test.mock.jar
          └── Android.bp