বাইন্ডার আইপিসি ব্যবহার করা হচ্ছে

এই পৃষ্ঠাটি অ্যান্ড্রয়েড 8 -তে বাইন্ডার ড্রাইভারের পরিবর্তনগুলি বর্ণনা করে, বাইন্ডার আইপিসি ব্যবহারের বিস্তারিত বিবরণ প্রদান করে এবং প্রয়োজনীয় SELinux নীতি তালিকা করে।

বাইন্ডার ড্রাইভার পরিবর্তন

অ্যান্ড্রয়েড 8 থেকে শুরু করে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং এইচএএল এখন বাইন্ডার ব্যবহার করে একে অপরের সাথে যোগাযোগ করে। যেহেতু এই যোগাযোগ নাটকীয়ভাবে বাইন্ডার ট্রাফিক বৃদ্ধি করে, অ্যান্ড্রয়েড 8 -তে বাইন্ডার আইপিসি দ্রুত রাখার জন্য ডিজাইন করা বেশ কিছু উন্নতি অন্তর্ভুক্ত রয়েছে। SoC ভেন্ডার ও OEM- দের অ্যান্ড্রয়েড-4.4 প্রাসঙ্গিক শাখা থেকে সরাসরি একত্রীকরণ উচিত, অ্যান্ড্রয়েড-4.9, এবং উচ্চতর কার্নেল / সাধারণ প্রকল্পের।

একাধিক বাইন্ডার ডোমেন (প্রসঙ্গ)

সাধারণ -4.4 এবং উচ্চতর, উজানে সহ

পরিচ্ছন্ন বিভক্ত করার জন্য (ডিভাইস-স্বাধীন) এবং বিক্রেতা (ডিভাইস নির্দিষ্ট) কোড কাঠামোর মধ্যে দপ্তরী ট্রাফিক, অ্যান্ড্রয়েড 8 একটি দপ্তরী প্রসঙ্গের ধারণা চালু। প্রতিটি বাইন্ডার প্রসঙ্গের নিজস্ব ডিভাইস নোড এবং নিজস্ব প্রসঙ্গ (পরিষেবা) ম্যানেজার রয়েছে। আপনি কনটেক্সট ম্যানেজারকে কেবল সেই ডিভাইস নোডের মাধ্যমে অ্যাক্সেস করতে পারেন যার সাথে এটি সম্পর্কিত এবং যখন একটি নির্দিষ্ট প্রসঙ্গের মাধ্যমে একটি বাইন্ডার নোড প্রেরণ করা হয়, তখন এটি একই প্রসঙ্গ থেকে শুধুমাত্র অন্য প্রক্রিয়া দ্বারা অ্যাক্সেসযোগ্য, এইভাবে একে অপরের থেকে ডোমেনগুলিকে সম্পূর্ণ বিচ্ছিন্ন করে। ব্যবহারের বিস্তারিত জানার জন্য দেখুন vndbinder এবং vndservicemanager

ছড়িয়ে-ছিটিয়ে থাকা

সাধারণ -4.4 এবং উচ্চতর, উজানে সহ

অ্যান্ড্রয়েডের পূর্ববর্তী রিলিজগুলিতে, একটি বাইন্ডার কলের প্রতিটি টুকরো তথ্য তিনবার অনুলিপি করা হয়েছিল:

  • একটি সেটিকে ধারাবাহিকভাবে একবার Parcel কলিং প্রক্রিয়ায়
  • কার্নেল ড্রাইভারের মধ্যে একবার কপি করতে Parcel লক্ষ্য প্রক্রিয়া
  • একবার unserialize করার Parcel লক্ষ্য প্রক্রিয়ায়

অ্যান্ড্রয়েড 8 ব্যবহারসমূহ ছিটান-জড়ো করা অপ্টিমাইজেশান পরিবর্তে একটি ডাটা serializing 1. 3 থেকে কপি সংখ্যা কমাতে Parcel প্রথম, তার মূল কাঠামো এবং মেমরি লেআউট ডাটা দেহাবশেষ এবং ড্রাইভার অবিলম্বে লক্ষ্য প্রক্রিয়া এটা কপি। ডেটা টার্গেট প্রক্রিয়ায় থাকার পর, স্ট্রাকচার এবং মেমরির লেআউট একই এবং অন্য কপির প্রয়োজন ছাড়াই ডেটা পড়া যায়।

সূক্ষ্ম দানা লকিং

সাধারণ -4.4 এবং উচ্চতর, উজানে সহ

পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলিতে, বাইন্ডার ড্রাইভার সমালোচনামূলক ডেটা স্ট্রাকচারগুলিতে একযোগে অ্যাক্সেস থেকে রক্ষা করার জন্য একটি গ্লোবাল লক ব্যবহার করেছিল। যদিও লকটির জন্য ন্যূনতম বিতর্ক ছিল, প্রধান সমস্যাটি হ'ল যদি নিম্ন-অগ্রাধিকার থ্রেডটি তালাটি পেয়ে থাকে এবং তারপরে ছাড় দেওয়া হয় তবে এটি একই তালা পাওয়ার জন্য উচ্চ-অগ্রাধিকার থ্রেডগুলিকে গুরুতরভাবে বিলম্ব করতে পারে। এর ফলে প্ল্যাটফর্মে জ্যাঙ্ক সৃষ্টি হয়।

এই সমস্যা সমাধানের প্রাথমিক প্রচেষ্টায় গ্লোবাল লক ধরে রাখার সময় প্রিমিপশন অক্ষম করা জড়িত। যাইহোক, এটি একটি সত্য সমাধানের চেয়ে একটি হ্যাক ছিল, এবং শেষ পর্যন্ত উজানের দ্বারা প্রত্যাখ্যান করা হয়েছিল এবং বাতিল করা হয়েছিল। পরবর্তী প্রচেষ্টা লকিংকে আরও সূক্ষ্ম শস্য তৈরির দিকে মনোনিবেশ করে, যার একটি সংস্করণ জানুয়ারী 2017 থেকে পিক্সেল ডিভাইসে চলছে। যদিও এই পরিবর্তনগুলির বেশিরভাগই সর্বজনীন করা হয়েছিল, পরবর্তী সংস্করণগুলিতে উল্লেখযোগ্য উন্নতি করা হয়েছিল।

সূক্ষ্ম লকিং বাস্তবায়নে ছোট সমস্যাগুলি চিহ্নিত করার পরে, আমরা একটি ভিন্ন লকিং আর্কিটেকচারের সাথে একটি উন্নত সমাধান তৈরি করেছি এবং সমস্ত সাধারণ কার্নেল শাখায় পরিবর্তনগুলি জমা দিয়েছি। আমরা বিভিন্ন ডিভাইসে বিপুল সংখ্যক এই বাস্তবায়ন পরীক্ষা চালিয়ে যাচ্ছি; যেহেতু আমরা কোন অসামান্য সমস্যা সম্পর্কে অবগত নই, এটি অ্যান্ড্রয়েড 8 সহ শিপিং ডিভাইসগুলির জন্য প্রস্তাবিত বাস্তবায়ন।

রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার

সাধারণ -4.4 এবং সাধারণ -4.9 (উজানে শীঘ্রই আসছে)

বাইন্ডার ড্রাইভার সবসময় ভাল অগ্রাধিকার উত্তরাধিকার সমর্থন করেছে। অ্যান্ড্রয়েডে ক্রমবর্ধমান সংখ্যক প্রক্রিয়ায় রিয়েল-টাইম অগ্রাধিকার অনুসারে চালানো হয়, কিছু ক্ষেত্রে এখন এটি বোধগম্য হয় যে যদি একটি রিয়েল-টাইম থ্রেড একটি বাইন্ডার কল করে, সেই প্রক্রিয়াটি যে কলটি পরিচালনা করে সেই থ্রেডটিও রিয়েল-টাইম অগ্রাধিকারে চলে । এই ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য, অ্যান্ড্রয়েড 8 এখন বাইন্ডার ড্রাইভারে রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার প্রয়োগ করে।

লেনদেন পর্যায়ের অগ্রাধিকার উত্তরাধিকার ছাড়াও, নোড অগ্রাধিকার উত্তরাধিকার একটি নোড (সার্ভিস বস্তুর দপ্তরী) একটি সর্বনিম্ন অগ্রাধিকার যা এই নোডের মধ্যে কল মৃত্যুদন্ড কার্যকর তা নির্দিষ্ট করতে আপনাকে অনুমতি দেয়। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলি ইতিমধ্যেই চমৎকার মান সহ নোড অগ্রাধিকার উত্তরাধিকার সমর্থিত, কিন্তু অ্যান্ড্রয়েড 8 রিয়েল-টাইম সময়সূচী নীতি নোড উত্তরাধিকার সমর্থন যোগ করে।

ব্যবহারকারীর স্থান পরিবর্তন

জন্য অক্ষম রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার মূল বাস্তবায়ন: Android এর 8 সব ইউজার-স্পেস এক ব্যতিক্রম সঙ্গে সাধারণ কার্নেল বর্তমান দপ্তরী ড্রাইভারের সাথে কাজ করা প্রয়োজন পরিবর্তন অন্তর্ভুক্ত /dev/binder একটি ব্যবহৃত ioctl । পরবর্তী বিকাশ অগ্রাধিকার উত্তরাধিকারের নিয়ন্ত্রণকে আরও সূক্ষ্ম শস্য পদ্ধতিতে পরিবর্তন করেছে যা প্রতি বাইন্ডার মোডে (এবং প্রতি প্রসঙ্গে নয়)। সুতরাং, ioctl অ্যান্ড্রয়েড সাধারণ শাখায় নয় এবং পরিবর্তে হয় আমাদের সাধারণ কার্নেলের জমা

এই পরিবর্তনের প্রভাব যে রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার প্রত্যেক নোডের জন্য ডিফল্টরূপে নিষ্ক্রিয় করা হয়। অ্যান্ড্রয়েড কর্মক্ষমতা টিম এটি সমস্ত নোড জন্য রিয়েল টাইম অগ্রাধিকার উত্তরাধিকার সক্ষম করতে উপকারী পাওয়া গেছে hwbinder ডোমেন। অর্জন যে একই প্রভাব, চেরি-বাছাই এই পরিবর্তন ইউজার-স্পেস হবে।

সাধারণ কার্নেলের জন্য SHAs

বাইন্ডার ড্রাইভারে প্রয়োজনীয় পরিবর্তন পেতে, উপযুক্ত SHA- এর সাথে সিঙ্ক করুন:

  • সাধারণ-3..১
    cc8b90c121de ANDROID: binder: পুনরুদ্ধারের ক্ষেত্রে প্রিও অনুমতি চেক করবেন না।
  • সাধারণ -4.4
    76b376eac7a2 ANDROID: বাইন্ডার: পুনরুদ্ধারের ক্ষেত্রে প্রিও অনুমতি চেক করবেন না।
  • সাধারণ-4..9
    ecd972d4f9b5 ANDROID: বাইন্ডার: পুনরুদ্ধারের ক্ষেত্রে প্রিও অনুমতি চেক করবেন না।

বাইন্ডার আইপিসি ব্যবহার করে

Orতিহাসিকভাবে, বিক্রেতা প্রক্রিয়া যোগাযোগের জন্য বাইন্ডার ইন্টারপ্রসেস কমিউনিকেশন (আইপিসি) ব্যবহার করেছে। অ্যান্ড্রয়েড 8-এ /dev/binder ডিভাইস নোড ফ্রেমওয়ার্ক প্রসেস একচেটিয়া হয়ে, যার অর্থ বিক্রেতা প্রসেস আর এটা এক্সেস আছে। বিক্রেতার প্রসেস অ্যাক্সেস করতে পারেন /dev/hwbinder কিন্তু ব্যবহারের HIDL তাদের AIDL ইন্টারফেসগুলি রূপান্তর আবশ্যক। বিক্রেতাদের জন্য যারা বিক্রেতা প্রক্রিয়ার মধ্যে AIDL ইন্টারফেস ব্যবহার চালিয়ে যেতে চান, অ্যান্ড্রয়েড নীচে বর্ণিত হিসাবে বাইন্ডার আইপিসি সমর্থন করে।

vndbinder

অ্যান্ড্রয়েড বিক্রেতা পরিষেবাগুলির দ্বারা ব্যবহারের জন্য 8 সমর্থন একটি নতুন দপ্তরী ডোমেন, দিয়ে অ্যাক্সেস করা /dev/vndbinder পরিবর্তে /dev/binder । করার সাথে সাথে /dev/vndbinder , অ্যান্ড্রয়েড এখন নিম্নলিখিত তিনটি আইপিসি ডোমেইনের আছে:

আইপিসি ডোমেন বর্ণনা
/dev/binder AIDL ইন্টারফেস সহ ফ্রেমওয়ার্ক/অ্যাপ প্রসেসের মধ্যে IPC
/dev/hwbinder HIDL ইন্টারফেস সহ ফ্রেমওয়ার্ক/বিক্রেতা প্রসেসের মধ্যে IPC
HIDL ইন্টারফেস সহ বিক্রেতা প্রক্রিয়ার মধ্যে IPC
/dev/vndbinder AIDL ইন্টারফেস সহ বিক্রেতা/বিক্রেতার প্রসেসের মধ্যে IPC

জন্য /dev/vndbinder প্রদর্শিত নিশ্চিত কার্নেল কনফিগারেশন আইটেমটি CONFIG_ANDROID_BINDER_DEVICES সেট করা হয় "binder,hwbinder,vndbinder" (এই Android এর সাধারণ কার্নেল গাছ ডিফল্ট যায়)।

সাধারণত, বিক্রেতা প্রসেস সরাসরি দপ্তরী চালক খুলবেন না এবং এর পরিবর্তে বিরুদ্ধে লিঙ্ক libbinder ইউজার-স্পেস গ্রন্থাগার, যা দপ্তরী চালক প্রর্দশিত হবে। জন্য একটি পদ্ধতি যোগ করার পদ্ধতি ::android::ProcessState() জন্য দপ্তরী চালক নির্বাচন libbinder । বিক্রেতার প্রসেস মধ্যে কল করার আগে এই পদ্ধতি কল করা উচিত ProcessState, IPCThreadState , বা সাধারণ যে কোন দপ্তরী কল করা হয়। ব্যবহার করার জন্য, পরে নিম্নলিখিত কল main() বিক্রেতা প্রক্রিয়া (ক্লায়েন্ট এবং সার্ভার) -এর:

ProcessState::initWithDriver("/dev/vndbinder");

vndservicemanager

পূর্বে, দপ্তরী পরিষেবার সাথে নিবন্ধিত হয়েছে servicemanager , যেখানে তারা অন্যান্য প্রক্রিয়ার মাধ্যমে উদ্ধার করা যেতে পারে। অ্যান্ড্রয়েড 8-এ servicemanager এখন ফ্রেমওয়ার্ক এবং অ্যাপ্লিকেশান প্রক্রিয়া এবং বিক্রেতা প্রসেস অ্যাক্সেস আর এটা করতে পারেন দ্বারা একচেটিয়াভাবে ব্যবহার করা হয়।

যাইহোক, বিক্রেতা পরিষেবাগুলি এখন ব্যবহার করতে পারেন vndservicemanager , একটি নতুন দৃষ্টান্ত servicemanager যে ব্যবহারসমূহ /dev/vndbinder পরিবর্তে /dev/binder এবং যা কাঠামো হিসেবে একই উত্স থেকে নির্মিত হয় servicemanager । বিক্রেতার প্রসেস সাথে কথা বলতে কিছু পরিবর্তন করতে প্রয়োজন হবে না vndservicemanager ; যখন বিক্রেতা প্রক্রিয়া প্রর্দশিত / dev/vndbinder , সেবা লুক-স্বয়ংক্রিয়ভাবে যেতে vndservicemanager

vndservicemanager বাইনারি অ্যান্ড্রয়েড এর ডিফল্ট ডিভাইস ফাইল তৈরী অন্তর্ভুক্ত হয়।

SELinux নীতি

বিক্রেতা প্রক্রিয়াগুলি যা একে অপরের সাথে যোগাযোগ করতে বাইন্ডার কার্যকারিতা ব্যবহার করতে চায় তাদের নিম্নলিখিতগুলির প্রয়োজন:

  1. অ্যাক্সেস /dev/vndbinder
  2. দপ্তরী {transfer, call} মধ্যে আঙ্গুলসমূহ vndservicemanager
  3. binder_call(A, B) কোন বিক্রেতা ডোমেইন বিক্রেতা দপ্তরী ইন্টারফেসের মাধ্যমে বিক্রেতা ডোমেইন বি মধ্যে কল করতে চান জন্য।
  4. অনুমতি {add, find} পরিষেবা vndservicemanager

প্রয়োজনীয়তা 1 এবং 2 মেটান করতে, vndbinder_use() ম্যাক্রো:

vndbinder_use(some_vendor_process_domain);

প্রয়োজন 3, সংসাধন binder_call(A, B) বিক্রেতা জন্য একটি প্রক্রিয়া এবং B যে দপ্তরী আলোচনা করার প্রয়োজনীয়তা জায়গায় থাকতে পারেন, এবং পুনঃনামকরনের দরকার নেই।

প্রয়োজনীয়তা 4 পূরণ করার জন্য, আপনাকে অবশ্যই পরিষেবার নাম, পরিষেবা লেবেল এবং নিয়মগুলি পরিচালনা করার পদ্ধতিতে পরিবর্তন করতে হবে।

SELinux- র বিশদে জানার জন্য, দেখুন অ্যান্ড্রয়েড লিনাক্স Security-Enhanced । অ্যান্ড্রয়েড 8.0 মধ্যে SELinux- র বিশদে জানার জন্য, দেখুন অ্যানড্রইড 8.0 জন্য SELinux

সেবার নাম

পূর্বে, বিক্রেতা প্রসেস একটি পরিষেবা নাম নিবন্ধিত service_contexts ফাইল এবং সংশ্লিষ্ট যে ফাইল ব্যবহার করার জন্য নিয়ম যোগ করা হয়েছে। উদাহরণ service_contexts থেকে ফাইল device/google/marlin/sepolicy :

AtCmdFwd                              u:object_r:atfwd_service:s0
cneservice                            u:object_r:cne_service:s0
qti.ims.connectionmanagerservice      u:object_r:imscm_service:s0
rcs                                   u:object_r:radio_service:s0
uce                                   u:object_r:uce_service:s0
vendor.qcom.PeripheralManager         u:object_r:per_mgr_service:s0

অ্যান্ড্রয়েড 8-এ vndservicemanager লোড vndservice_contexts পরিবর্তে দায়ের। বিক্রেতার পরিষেবাগুলিতে মাইগ্রেট vndservicemanager (এবং যা ইতিমধ্যে পুরাতন হয় service_contexts ফাইল) নতুন যোগ করা উচিত vndservice_contexts ফাইল।

পরিষেবা লেবেল

পূর্বে, সেবা যেমন লেবেল u:object_r:atfwd_service:s0 একটি সংজ্ঞায়িত করা হয়েছে service.te ফাইল। উদাহরণ:

type atfwd_service,      service_manager_type;

অ্যান্ড্রয়েড 8, আপনি টাইপ পরিবর্তন আবশ্যক vndservice_manager_type এবং নিয়ম সরাতে vndservice.te ফাইল। উদাহরণ:

type atfwd_service,      vndservice_manager_type;

সার্ভিস ম্যানেজার নিয়ম

পূর্বে, ডোমেন থেকে যোগ বা সেবা খুঁজে নিয়ন্ত্রণের অধিকার প্রদান নিয়ম servicemanager । উদাহরণ:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;

অ্যান্ড্রয়েড 8 এ, এই ধরনের নিয়মগুলি একই জায়গায় থাকতে পারে এবং একই ক্লাস ব্যবহার করতে পারে। উদাহরণ:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;