एचआईडीएल जावा

Android 8.0 में साफ़ इंटरफ़ेस तय करने के लिए Android OS को फिर से संग्रहित किया गया अलग-अलग डिवाइसों पर निर्भर करता है. साथ ही, किसी खास डिवाइस और वेंडर से कोड. Android में ऐसे कई इंटरफ़ेस पहले से ही HAL के तौर पर परिभाषित किए गए हैं इंटरफ़ेस, जिसे hardware/libhardware में C हेडर के तौर पर परिभाषित किया गया है. एचआईडीएल इन HAL इंटरफ़ेस को स्थिर और वर्शन वाले इंटरफ़ेस से बदल दिया गया है. ये या तो Java (नीचे बताया गया है) में होना चाहिए या क्लाइंट- और सर्वर-साइड HIDL होना चाहिए C++ वाले इंटरफ़ेस पर भेजता है.

HIDL इंटरफ़ेस को मुख्य रूप से नेटिव कोड से और नतीजे HIDL का फ़ोकस C++ में बेहतर कोड के अपने-आप जनरेट होने पर है. हालांकि, कुछ Android के तौर पर, HIDL इंटरफ़ेस सीधे Java से इस्तेमाल करने के लिए भी उपलब्ध होना चाहिए सबसिस्टम (जैसे कि Telephony) में Java HIDL इंटरफ़ेस होते हैं.

इस अनुभाग के पृष्ठ HIDL इंटरफ़ेस के लिए Java फ़्रंटएंड का वर्णन करते हैं, सेवाएं बनाने, रजिस्टर करने, और इस्तेमाल करने के बारे में जानकारी दें. साथ ही, यह भी बताएं कि एचएएल और एचएएल कैसे बनाए जाते हैं Java में लिखे गए क्लाइंट, HIDL RPC सिस्टम के साथ इंटरैक्ट करते हैं.

क्लाइंट का उदाहरण

यह पैकेज में IFoo इंटरफ़ेस के लिए क्लाइंट का एक उदाहरण है सेवा के नाम के तौर पर रजिस्टर किया गया android.hardware.foo@1.0 default और कस्टम सेवा के नाम वाली अतिरिक्त सेवा second_impl.

लाइब्रेरी जोड़ें

आपको संबंधित HIDL स्टब लाइब्रेरी पर डिपेंडेंसी जोड़नी होगी, अगर तो आपको इसका इस्तेमाल करना है. आम तौर पर, यह एक स्टैटिक लाइब्रेरी होती है:

// in Android.bp
static_libs: [ "android.hardware.foo-V1.0-java", ],
// in Android.mk
LOCAL_STATIC_JAVA_LIBRARIES += android.hardware.foo-V1.0-java

अगर आपको पता है कि आपने पहले से ही इन लाइब्रेरी की डिपेंडेंसी ले ली है, तो शेयर किए गए लिंक का इस्तेमाल भी किया जा सकता है:

// in Android.bp
libs: [ "android.hardware.foo-V1.0-java", ],
// in Android.mk
LOCAL_JAVA_LIBRARIES += android.hardware.foo-V1.0-java

Android 10 में लाइब्रेरी जोड़ने से जुड़ी कुछ और ज़रूरी बातें

अगर आपके पास कोई ऐसा सिस्टम या वेंडर ऐप्लिकेशन है जो Android 10 या इसके बाद वाले वर्शन को टारगेट करता है, तो आपके पास इन लाइब्रेरी को स्टैटिक रूप से शामिल करने का विकल्प होता है. सिर्फ़ HIDL क्लास का इस्तेमाल किया जा सकता है डिवाइस पर इंस्टॉल किए गए कस्टम JAR से, बेहतर Java API उपलब्ध कराते हैं सिस्टम ऐप्लिकेशन के लिए, मौजूदा uses-library तरीके का इस्तेमाल करके. कॉन्टेंट बनाने बाद का तरीका डिवाइस पर जगह बचाता है. ज़्यादा जानकारी के लिए, Java SDK लाइब्रेरी लागू करना लेख पढ़ें. इसके लिए ऐप्लिकेशन के पुराने वर्शन को बनाए रखा जाएगा.

Android 10 और इसके बाद के वर्शन में, "हैलो" अपडेट करें इन लाइब्रेरी के वर्शन भी उपलब्ध हैं. इनमें विचाराधीन क्लास शामिल है, लेकिन पर निर्भर है. उदाहरण के लिए, android.hardware.foo-V1.0-java-shallow में foo में क्लास शामिल हैं पैकेज, लेकिन इसमें क्लास शामिल नहीं हैं android.hidl.base-V1.0-java, जिसमें सभी का बेस क्लास शामिल है HIDL इंटरफ़ेस. अगर ऐसी लाइब्रेरी बनाई जा रही है जिसमें इंटरफ़ेस की बेस क्लास की डिपेंडेंसी के तौर पर उपलब्ध हैं, तो इनका इस्तेमाल किया जा सकता है:

// in Android.bp
static_libs: [ "android.hardware.foo-V1.0-java-shallow", ],
// in Android.mk
LOCAL_STATIC_JAVA_LIBRARIES += android.hardware.foo-V1.0-java-shallow

अब बूट पर HIDL बेस और मैनेजर लाइब्रेरी भी उपलब्ध नहीं होंगी ऐप्लिकेशन के लिए क्लासपाथ (पहले, इन्हें कभी-कभी छिपे हुए एपीआई के तौर पर इस्तेमाल किया जाता था) की वजह से Android का डेलिगेट-फ़र्स्ट क्लासलोडर). इसके बजाय, उन्हें एक नए jarjar के साथ नेमस्पेस और इनका इस्तेमाल करने वाले ऐप्लिकेशन (ज़रूरी तौर पर निजी) ऐप्लिकेशन) की अलग कॉपी होनी चाहिए. इसका इस्तेमाल करके, बूट क्लासपाथ पर मौजूद मॉड्यूल HIDL को इन Java लाइब्रेरी के शैलो वैरिएंट का इस्तेमाल करना चाहिए. साथ ही, jarjar_rules: ":framework-jarjar-rules" को उनके इन लाइब्रेरी के मौजूदा वर्शन का इस्तेमाल करने के लिए Android.bp बूट क्लासपाथ में.

अपना Java सोर्स बदलें

इस सेवा का सिर्फ़ एक वर्शन (@1.0) है, इसलिए यह कोड केवल उसी वर्शन को प्राप्त करता है. यहां जाएं: इंटरफ़ेस एक्सटेंशन पढ़ें.

import android.hardware.foo.V1_0.IFoo;
...
// retry to wait until the service starts up if it is in the manifest
IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
IFoo anotherServer = IFoo.getService("second_impl", true /* retry */);
server.doSomething(…);

सेवा दें

Java में मौजूद फ़्रेमवर्क कोड को एसिंक्रोनस पाने के लिए, इंटरफ़ेस की ज़रूरत पड़ सकती है एचएएल से कॉलबैक होते हैं.

के वर्शन 1.0 में IFooCallback इंटरफ़ेस के लिए android.hardware.foo पैकेज के लिए, आप अपने इंटरफ़ेस को इसमें लागू कर सकते हैं Java के लिए, यहां दिया गया तरीका अपनाएं:

  1. HIDL में अपना इंटरफ़ेस तय करें.
  2. /tmp/android/hardware/foo/IFooCallback.java को इसके तौर पर खोलें संदर्भ.
  3. Java को लागू करने के लिए एक नया मॉड्यूल बनाएं.
  4. ऐब्स्ट्रैक्ट क्लास की जांच करना android.hardware.foo.V1_0.IFooCallback.Stub, इसके बाद नई क्लास लिखें को बढ़ाया जा सकता है और अमूर्त तरीकों को लागू किया जा सकता है.

अपने-आप जनरेट हुई फ़ाइलें देखें

अपने-आप जनरेट हुई फ़ाइलें देखने के लिए, यह तरीका अपनाएं:

hidl-gen -o /tmp -Ljava \
  -randroid.hardware:hardware/interfaces \
  -randroid.hidl:system/libhidl/transport android.hardware.foo@1.0

ये निर्देश, डायरेक्ट्री जनरेट करते हैं /tmp/android/hardware/foo/1.0. फ़ाइल के लिए hardware/interfaces/foo/1.0/IFooCallback.hal, इससे फ़ाइल /tmp/android/hardware/foo/1.0/IFooCallback.java, जिसमें Java इंटरफ़ेस, प्रॉक्सी कोड, और स्टब्स (दोनों प्रॉक्सी और स्टब, इंटरफ़ेस के अनुरूप होते हैं).

-Lmakefile उन नियमों को जनरेट करता है जो बिल्ड पर इस निर्देश को चलाते हैं समय और आसानी से शामिल किया जा सकता है android.hardware.foo-V1.0-java और लिंक उचित फ़ाइलें. एक स्क्रिप्ट जो इसे पूरे प्रोजेक्ट के लिए अपने-आप कर देती है इंटरफ़ेस hardware/interfaces/update-makefiles.sh पर मिल सकते हैं. इस उदाहरण में दिए गए पाथ एक-दूसरे से मिलते-जुलते हैं; हार्डवेयर/इंटरफ़ेस कुछ समय के लिए ताकि आप इससे पहले HAL डेवलप कर सकें, इसके लिए उसे पब्लिश करने के बारे में ज़्यादा जानें.

कोई सेवा चलाएं

HAL, IFoo इंटरफ़ेस उपलब्ध कराता है, जिसे एसिंक्रोनस बनाना ज़रूरी है IFooCallback इंटरफ़ेस पर फ़्रेमवर्क के लिए कॉलबैक. कॉन्टेंट बनाने IFooCallback इंटरफ़ेस को खोजे जाने लायक नाम से रजिस्टर नहीं किया गया है सेवा; इसके बजाय, IFoo में setFooCallback(IFooCallback x).

के वर्शन 1.0 से IFooCallback को सेट अप करने के लिए android.hardware.foo पैकेज, जोड़ें android.hardware.foo-V1.0-java से Android.mk. कोड सेवा को चलाने के लिए:

import android.hardware.foo.V1_0.IFoo;
import android.hardware.foo.V1_0.IFooCallback.Stub;
....
class FooCallback extends IFooCallback.Stub {
    // implement methods
}
....
// Get the service from which you will be receiving callbacks.
// This also starts the threadpool for your callback service.
IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
....
// This must be a persistent instance variable, not local,
//   to avoid premature garbage collection.
FooCallback mFooCallback = new FooCallback();
....
// Do this once to create the callback service and tell the "foo-bar" service
server.setFooCallback(mFooCallback);

इंटरफ़ेस एक्सटेंशन

यह मानकर कि किसी सेवा के लिए IFoo इंटरफ़ेस को लागू किया जाता है तो ऐसा हो सकता है कि किसी खास डिवाइस पर वह सेवा इंटरफ़ेस एक्सटेंशन में लागू की गई अतिरिक्त सुविधाएं IBetterFoo, इसके बारे में नीचे बताया गया है:

interface IFoo {
   ...
};

interface IBetterFoo extends IFoo {
   ...
};

विस्तृत इंटरफ़ेस से अवगत कॉलिंग कोड castFrom() Java का ऐसा तरीका जिससे बेस इंटरफ़ेस को सुरक्षित तरीके से कास्ट किया जा सके एक्सटेंडेड इंटरफ़ेस:

IFoo baseService = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
IBetterFoo extendedService = IBetterFoo.castFrom(baseService);
if (extendedService != null) {
  // The service implements the extended interface.
} else {
  // The service implements only the base interface.
}