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

एंड्रॉइड 8.0 में डिवाइस-स्वतंत्र एंड्रॉइड प्लेटफॉर्म और डिवाइस- और विक्रेता-विशिष्ट कोड के बीच स्पष्ट इंटरफेस को परिभाषित करने के लिए एंड्रॉइड ओएस को फिर से आर्किटेक्ट किया गया था। एंड्रॉयड पहले से ही एचएएल इंटरफेस, सी में हेडर के रूप में परिभाषित के रूप में इस तरह के कई इंटरफेस परिभाषित hardware/libhardware । HIDL स्थिर, संस्करणीकृत इंटरफेस, के साथ इन एचएएल इंटरफेस बदल दिया है जो या तो जावा (नीचे वर्णित) में हो या में ग्राहक और सर्वर साइड HIDL इंटरफेस हो सकता है सी ++

एचआईडीएल इंटरफेस मुख्य रूप से मूल कोड से उपयोग किए जाने का इरादा है, और परिणामस्वरूप एचआईडीएल सी ++ में कुशल कोड के स्वत: पीढ़ी पर केंद्रित है। हालांकि, एचआईडीएल इंटरफेस सीधे जावा से उपयोग के लिए भी उपलब्ध होना चाहिए, क्योंकि कुछ एंड्रॉइड सबसिस्टम (जैसे टेलीफोनी) में जावा एचआईडीएल इंटरफेस हैं।

इस खंड के पृष्ठ एचआईडीएल इंटरफेस के लिए जावा फ्रंटएंड का वर्णन करते हैं, सेवाओं को बनाने, पंजीकृत करने और उपयोग करने का विवरण देते हैं, और बताते हैं कि जावा में लिखे गए एचएएल और एचएएल क्लाइंट एचआईडीएल आरपीसी सिस्टम के साथ कैसे इंटरैक्ट करते हैं।

एक ग्राहक होने के नाते

यह एक अंतरफलक के लिए एक ग्राहक का एक उदाहरण है 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 या उच्चतर को लक्षित करता है, तो आप इन पुस्तकालयों को स्थिर रूप से शामिल कर सकते हैं। तुम भी (केवल) स्थिर जावा APIs के साथ डिवाइस पर स्थापित कस्टम जार से HIDL कक्षाओं का उपयोग कर सकते मौजूदा का उपयोग कर उपलब्ध कराया uses-library प्रणाली क्षुधा के लिए तंत्र। बाद वाला तरीका डिवाइस पर जगह बचाता है। अधिक जानकारी के लिए, कार्यान्वयन जावा एसडीके पुस्तकालय । पुराने ऐप्स के लिए, पुराना व्यवहार सुरक्षित रहता है।

एंड्रॉइड 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

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

अपने जावा स्रोत को संशोधित करना

केवल एक संस्करण (नहीं है @1.0 इस सेवा का), तो यह कोड retrieves केवल उस संस्करण। देखें इंटरफ़ेस एक्सटेंशन कैसे सेवा के कई विभिन्न संस्करणों को संभालने के लिए के लिए।

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(…);

सेवा प्रदान करना

जावा में फ्रेमवर्क कोड को एचएएल से एसिंक्रोनस कॉलबैक प्राप्त करने के लिए इंटरफेस की आवश्यकता हो सकती है।

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

  1. HIDL में अपने इंटरफ़ेस को परिभाषित करें।
  2. ओपन /tmp/android/hardware/foo/IFooCallback.java एक संदर्भ के रूप।
  3. अपने जावा कार्यान्वयन के लिए एक नया मॉड्यूल बनाएं।
  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 , जो जावा इंटरफ़ेस समाहित, प्रॉक्सी कोड, और स्टब्स (दोनों प्रॉक्सी और स्टब्स इंटरफेस के अनुरूप हैं)।

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

सेवा चलाना

एचएएल प्रदान करता है IFoo इंटरफ़ेस है, जो खत्म हो गया ढांचे के लिए अतुल्यकालिक कॉलबैक करना चाहिए IFooCallback इंटरफ़ेस। IFooCallback इंटरफ़ेस एक खोज योग्य सेवा के रूप में नाम से पंजीकृत नहीं है; इसके बजाय, IFoo जैसे एक विधि शामिल होना चाहिए setFooCallback(IFooCallback x)

सेट करने के लिए IFooCallback के संस्करण 1.0 से 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() के लिए सुरक्षित रूप से बढ़ाया इंटरफ़ेस के आधार इंटरफेस डाली जावा विधि:

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.
}