HIDL জাভা

অ্যান্ড্রয়েড 8.0-এ অ্যান্ড্রয়েড ওএসকে ডিভাইস-স্বাধীন অ্যান্ড্রয়েড প্ল্যাটফর্ম এবং ডিভাইস- এবং বিক্রেতা-নির্দিষ্ট কোডের মধ্যে স্পষ্ট ইন্টারফেস সংজ্ঞায়িত করার জন্য পুনরায় স্থাপত্য করা হয়েছিল। অ্যান্ড্রয়েড ইতিমধ্যেই HAL ইন্টারফেসের আকারে এরকম অনেক ইন্টারফেস সংজ্ঞায়িত করেছে, hardware/libhardware সি হেডার হিসাবে সংজ্ঞায়িত করা হয়েছে। HIDL এই HAL ইন্টারফেসগুলিকে স্থিতিশীল, সংস্করণযুক্ত ইন্টারফেসগুলির সাথে প্রতিস্থাপন করেছে, যা হয় জাভাতে হতে পারে (নীচে বর্ণনা করা হয়েছে) অথবা C++ এ ক্লায়েন্ট- এবং সার্ভার-সাইড HIDL ইন্টারফেস হতে পারে।

HIDL ইন্টারফেসগুলি প্রাথমিকভাবে নেটিভ কোড থেকে ব্যবহার করার উদ্দেশ্যে করা হয়েছে, এবং ফলস্বরূপ HIDL C++ এ দক্ষ কোডের স্বয়ংক্রিয়-প্রজন্মের উপর দৃষ্টি নিবদ্ধ করে। যাইহোক, HIDL ইন্টারফেসগুলি সরাসরি জাভা থেকে ব্যবহারের জন্য উপলব্ধ হতে হবে, কারণ কিছু অ্যান্ড্রয়েড সাবসিস্টেমের (যেমন টেলিফোনি) জাভা HIDL ইন্টারফেস রয়েছে।

এই বিভাগের পৃষ্ঠাগুলি এইচআইডিএল ইন্টারফেসের জন্য জাভা ফ্রন্টএন্ড বর্ণনা করে, কীভাবে পরিষেবাগুলি তৈরি, নিবন্ধন এবং ব্যবহার করতে হয় এবং জাভাতে লেখা HAL এবং HAL ক্লায়েন্ট কীভাবে HIDL RPC সিস্টেমের সাথে ইন্টারঅ্যাক্ট করে তা ব্যাখ্যা করে।

ক্লায়েন্ট হচ্ছে

এটি android.hardware.foo@1.0 প্যাকেজে একটি ইন্টারফেস IFoo এর জন্য একটি ক্লায়েন্টের উদাহরণ যা পরিষেবার নাম 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 বা তার বেশির দিকে লক্ষ্য করে এমন একটি সিস্টেম বা ভেন্ডর অ্যাপ থাকে, তাহলে আপনি স্ট্যাটিকভাবে এই লাইব্রেরিগুলিকে অন্তর্ভুক্ত করতে পারেন। আপনি সিস্টেম অ্যাপের জন্য বিদ্যমান uses-library মেকানিজম ব্যবহার করে উপলব্ধ স্থিতিশীল Java API সহ ডিভাইসে ইনস্টল করা কাস্টম JAR থেকে (কেবল) HIDL ক্লাসগুলি ব্যবহার করতে পারেন। পরবর্তী পদ্ধতিটি ডিভাইসে স্থান সংরক্ষণ করে। আরো বিস্তারিত জানার জন্য, Java SDK লাইব্রেরি বাস্তবায়ন দেখুন। পুরানো অ্যাপগুলির জন্য, পুরানো আচরণ সংরক্ষিত হয়।

অ্যান্ড্রয়েড 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

এইচআইডিএল বেস এবং ম্যানেজার লাইব্রেরিগুলিও অ্যাপগুলির জন্য বুট ক্লাসপাথে আর উপলব্ধ নেই (আগে, অ্যান্ড্রয়েডের ডেলিগেট-ফার্স্ট ক্লাসলোডারের কারণে এগুলি কখনও কখনও লুকানো API হিসাবে ব্যবহৃত হত)৷ পরিবর্তে, এগুলিকে jarjar সহ একটি নতুন নামস্থানে স্থানান্তরিত করা হয়েছে, এবং যে অ্যাপগুলি এইগুলি ব্যবহার করে (অগত্যা ব্যক্তিগত অ্যাপস) তাদের নিজস্ব আলাদা কপি থাকতে হবে৷ HIDL ব্যবহার করে বুট ক্লাসপাথের মডিউলগুলিকে অবশ্যই এই জাভা লাইব্রেরির অগভীর রূপগুলি ব্যবহার করতে হবে এবং বুট ক্লাসপাথে বিদ্যমান এই লাইব্রেরিগুলির সংস্করণ ব্যবহার করতে তাদের Android.bpjarjar_rules: ":framework-jarjar-rules" যোগ করতে হবে।

আপনার জাভা উৎস পরিবর্তন করা হচ্ছে

এই পরিষেবাটির শুধুমাত্র একটি সংস্করণ ( @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(…);

একটি সেবা প্রদান

HALs থেকে অ্যাসিঙ্ক্রোনাস কলব্যাক পেতে জাভাতে ফ্রেমওয়ার্ক কোড ইন্টারফেস পরিবেশন করতে হতে পারে।

android.hardware.foo প্যাকেজের 1.0 সংস্করণে IFooCallback ইন্টারফেসের জন্য, আপনি নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করে জাভাতে আপনার ইন্টারফেস বাস্তবায়ন করতে পারেন:

  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 এ পাওয়া যাবে। এই উদাহরণের পথগুলি আপেক্ষিক; হার্ডওয়্যার/ইন্টারফেস আপনার কোড ট্রির নীচে একটি অস্থায়ী ডিরেক্টরি হতে পারে যাতে আপনি এটি প্রকাশ করার আগে একটি HAL বিকাশ করতে সক্ষম হন।

একটি সেবা চালানো

HAL IFoo ইন্টারফেস প্রদান করে, যা অবশ্যই IFooCallback ইন্টারফেসের মাধ্যমে ফ্রেমওয়ার্কের সাথে অ্যাসিঙ্ক্রোনাস কলব্যাক করতে হবে। IFooCallback ইন্টারফেস একটি আবিষ্কারযোগ্য পরিষেবা হিসাবে নাম দ্বারা নিবন্ধিত নয়; পরিবর্তে, IFoo অবশ্যই একটি পদ্ধতি থাকতে হবে যেমন setFooCallback(IFooCallback x)

android.hardware.foo প্যাকেজের সংস্করণ 1.0 থেকে IFooCallback সেট আপ করতে, Android.mkandroid.hardware.foo-V1.0-java যোগ করুন। পরিষেবা চালানোর কোড হল:

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