এই পৃষ্ঠাটি বিদ্যমান সিস্টেম বৈশিষ্ট্যগুলিকে রিফ্যাক্টর করার জন্য নির্দেশিকা সহ Android-এ সিস্টেম বৈশিষ্ট্যগুলি যোগ বা সংজ্ঞায়িত করার জন্য একটি আদর্শ পদ্ধতি প্রদান করে। নিশ্চিত করুন যে আপনি রিফ্যাক্টর করার সময় নির্দেশিকা ব্যবহার করেন, যদি না আপনার কাছে একটি শক্তিশালী সামঞ্জস্যের সমস্যা থাকে যা অন্যথায় নির্দেশ করে।
ধাপ 1: সিস্টেম সম্পত্তি সংজ্ঞায়িত করুন
যখন আপনি একটি সিস্টেম সম্পত্তি যোগ করেন, সম্পত্তির জন্য একটি নাম স্থির করুন এবং এটিকে একটি SELinux সম্পত্তি প্রসঙ্গে যুক্ত করুন। যদি কোনও উপযুক্ত বিদ্যমান প্রসঙ্গ না থাকে তবে একটি নতুন তৈরি করুন৷ সম্পত্তি অ্যাক্সেস করার সময় নাম ব্যবহার করা হয়; SELinux-এর পরিপ্রেক্ষিতে অ্যাক্সেসিবিলিটি নিয়ন্ত্রণ করতে সম্পত্তি প্রসঙ্গ ব্যবহার করা হয়। নামগুলি যে কোনও স্ট্রিং হতে পারে, তবে AOSP সুপারিশ করে যে আপনি তাদের পরিষ্কার করার জন্য একটি কাঠামোগত বিন্যাস অনুসরণ করুন৷
সম্পত্তির নাম
snake_case casing সহ এই বিন্যাসটি ব্যবহার করুন:
[{prefix}.]{group}[.{subgroup}]*.{name}[.{type}]
উপাদান prefix
জন্য হয় "" (বাদ দেওয়া), ro
(প্রপার্টিগুলির জন্য শুধুমাত্র একবার সেট করার জন্য), অথবা persist
(রিবুট জুড়ে থাকা বৈশিষ্ট্যগুলির জন্য) ব্যবহার করুন।
সতর্কতা
ro
ব্যবহার করুন শুধুমাত্র যখন আপনি নিশ্চিত হন যে ভবিষ্যতে লেখার জন্য আপনার prefix
প্রয়োজন নেই। ** ro
উপসর্গটি নির্দিষ্ট করবেন না। ** পরিবর্তে, prefix
শুধুমাত্র পঠনযোগ্য করার জন্য সেপলিসির উপর নির্ভর করুন (অন্য কথায়, শুধুমাত্র init
দ্বারা লেখার যোগ্য)।
শুধুমাত্র যখন আপনি নিশ্চিত হন যে মানটি রিবুট জুড়ে persist
থাকবে এবং সিস্টেম বৈশিষ্ট্যগুলি ব্যবহার করাই আপনার একমাত্র বিকল্প।
Google কঠোরভাবে সিস্টেমের বৈশিষ্ট্যগুলি পর্যালোচনা করে যেগুলির হয় ro
বা persist
বৈশিষ্ট্য রয়েছে৷
group
শব্দটি সমষ্টি সম্পর্কিত বৈশিষ্ট্য ব্যবহার করা হয়। এটি audio
বা telephony
মতো একটি সাবসিস্টেম নাম হওয়ার উদ্দেশ্যে করা হয়েছে৷ sys
, system
, dev
, default
, বা config
এর মত অস্পষ্ট বা ওভারলোড করা পদ ব্যবহার করবেন না ৷
সিস্টেমের বৈশিষ্ট্যগুলিতে একচেটিয়া পড়ার বা লেখার অ্যাক্সেস রয়েছে এমন একটি প্রক্রিয়ার ডোমেন প্রকারের নাম ব্যবহার করা সাধারণ অভ্যাস। উদাহরণস্বরূপ, যে সিস্টেমের বৈশিষ্ট্যগুলিতে vold
প্রক্রিয়ার লেখার অ্যাক্সেস রয়েছে, সেখানে গোষ্ঠীর নাম হিসাবে vold
(প্রক্রিয়াটির জন্য ডোমেনের প্রকারের নাম) ব্যবহার করা সাধারণ।
প্রয়োজনে, বৈশিষ্ট্যগুলিকে আরও শ্রেণীবদ্ধ করতে subgroup
যোগ করুন, তবে এই উপাদানটি বর্ণনা করতে অস্পষ্ট বা ওভারলোড করা পদগুলি এড়িয়ে চলুন। (আপনার একাধিক subgroup
থাকতে পারে।)
অনেক দলের নাম ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে. system/sepolicy/private/property_contexts
ফাইলটি চেক করুন এবং যেখানে সম্ভব সেখানে বিদ্যমান গ্রুপের নাম ব্যবহার করুন, নতুন নাম না করে। নিম্নলিখিত টেবিলটি প্রায়শই ব্যবহৃত গ্রুপ নামের উদাহরণ প্রদান করে।
ডোমেইন | গ্রুপ (এবং উপগোষ্ঠী) |
---|---|
ব্লুটুথ সম্পর্কিত | bluetooth |
কার্নেল cmdline থেকে sysprops | boot |
sysprops যে একটি বিল্ড সনাক্ত | build |
টেলিফোনি সম্পর্কিত | telephony |
অডিও সম্পর্কিত | audio |
গ্রাফিক্স সম্পর্কিত | graphics |
vold সম্পর্কিত | vold |
নিম্নলিখিত পূর্ববর্তী regex উদাহরণে name
এবং type
ব্যবহার সংজ্ঞায়িত করে।
[{prefix}.]{group}[.{subgroup}]*.{name}[.{type}]
name
একটি গ্রুপের মধ্যে একটি সিস্টেম সম্পত্তি চিহ্নিত করে।type
একটি ঐচ্ছিক উপাদান যা সিস্টেম সম্পত্তির ধরন বা অভিপ্রায়কে স্পষ্ট করে। উদাহরণস্বরূপ, একটি sysprop কেaudio.awesome_feature_enabled
বা শুধুaudio.awesome_feature
হিসাবে নামকরণের পরিবর্তে, সিস্টেমের সম্পত্তির ধরন এবং অভিপ্রায় প্রতিফলিত করতেaudio.awesome_feature.enabled
হিসাবে এটির নাম পরিবর্তন করুন৷
টাইপ কি হতে হবে সে সম্পর্কে কোন নির্দিষ্ট নিয়ম নেই; এইগুলি ব্যবহারের সুপারিশ:
-
enabled
: ব্যবহার করুন যদি টাইপটি একটি বুলিয়ান সিস্টেম বৈশিষ্ট্য হয় যা একটি বৈশিষ্ট্য চালু বা বন্ধ করতে ব্যবহৃত হয়। -
config
: যদি উদ্দেশ্যটি স্পষ্ট করা হয় যে সিস্টেমের সম্পত্তি সিস্টেমের গতিশীল অবস্থার প্রতিনিধিত্ব করে না তা ব্যবহার করুন; এটি একটি পূর্ব-কনফিগার করা মান প্রতিনিধিত্ব করে (উদাহরণস্বরূপ, একটি পঠনযোগ্য জিনিস)। -
List
: এটি একটি সিস্টেম সম্পত্তি যার মান একটি তালিকা হলে ব্যবহার করুন। -
Timeoutmillis
: ms এর ইউনিটে টাইমআউট মানের জন্য এটি একটি সিস্টেম সম্পত্তি হলে ব্যবহার করুন।
উদাহরণ:
-
persist.radio.multisim.config
-
drm.service.enabled
সম্পত্তি প্রসঙ্গ
নতুন SELinux সম্পত্তি প্রসঙ্গ স্কিম সূক্ষ্ম কণিকা এবং আরও বর্ণনামূলক নামের জন্য অনুমতি দেয়। সম্পত্তির নামের জন্য যা ব্যবহার করা হয় তার অনুরূপ, AOSP নিম্নলিখিত বিন্যাসের সুপারিশ করে:
{group}[_{subgroup}]*_prop
শর্তাবলী নিম্নরূপ সংজ্ঞায়িত করা হয়:
group
এবং subgroup
একই অর্থ রয়েছে যা পূর্ববর্তী নমুনা রেজেক্সের জন্য সংজ্ঞায়িত করা হয়েছিল। উদাহরণস্বরূপ, vold_config_prop
বৈশিষ্ট্যগুলিকে বোঝায় যা একটি বিক্রেতার কনফিগারেশন এবং vendor_init
দ্বারা সেট করা হয়, যখন vold_status_prop
বা শুধু vold_prop
বৈশিষ্ট্যগুলিকে বোঝায় যা vold
এর বর্তমান অবস্থা প্রকাশ করে।
একটি সম্পত্তি প্রসঙ্গে নামকরণ করার সময়, বৈশিষ্ট্যগুলির সাধারণ ব্যবহার প্রতিফলিত করে এমন নামগুলি চয়ন করুন৷ বিশেষ করে, নিম্নলিখিত ধরনের পদগুলি এড়িয়ে চলুন:
- যে পদগুলি খুব সাধারণ এবং অস্পষ্ট দেখায়, যেমন
sys
,system
,default
৷ - শর্তাবলী যা সরাসরি অ্যাক্সেসযোগ্যতা এনকোড করে: যেমন
exported
,apponly
,ro
,public
,private
৷
vold_config_prop
মত নাম ব্যবহার করতে পছন্দ করুন exported_vold_prop
, অথবা vold_vendor_writable_prop
।
টাইপ
সারণীতে তালিকাভুক্ত একটি সম্পত্তির ধরন নিম্নলিখিতগুলির মধ্যে একটি হতে পারে।
টাইপ | সংজ্ঞা |
---|---|
বুলিয়ান | true বা সত্যের জন্য 1 , false বা মিথ্যার জন্য 0 |
পূর্ণসংখ্যা | স্বাক্ষরিত 64-বিট পূর্ণসংখ্যা |
স্বাক্ষরবিহীন পূর্ণসংখ্যা | স্বাক্ষরবিহীন 64-বিট পূর্ণসংখ্যা |
ডাবল | ডবল নির্ভুল ভাসমান পয়েন্ট |
স্ট্রিং | যেকোনো বৈধ UTF-8 স্ট্রিং |
enum | মান হোয়াইটস্পেস ছাড়া যেকোন বৈধ UTF-8 স্ট্রিং হতে পারে |
উপরের তালিকা | একটি কমা ( , ) ডিলিমিটার হিসাবে ব্যবহৃত হয়পূর্ণসংখ্যা তালিকা [1, 2, 3] 1,2,3 হিসাবে সংরক্ষণ করা হয় |
অভ্যন্তরীণভাবে, সমস্ত বৈশিষ্ট্য স্ট্রিং হিসাবে সংরক্ষণ করা হয়। আপনি এটিকে একটি property_contexts
ফাইল হিসাবে নির্দিষ্ট করে টাইপ প্রয়োগ করতে পারেন। আরও তথ্যের জন্য, ধাপ 3 -এ property_contexts
দেখুন।
ধাপ 2: প্রয়োজনীয় অ্যাক্সেসিবিলিটি স্তর নির্ধারণ করুন
চারটি সাহায্যকারী ম্যাক্রো আছে যা একটি সম্পত্তি সংজ্ঞায়িত করে।
অ্যাক্সেসিবিলিটি প্রকার | অর্থ |
---|---|
system_internal_prop | বৈশিষ্ট্য যা শুধুমাত্র /system ব্যবহৃত হয় |
system_restricted_prop | বৈশিষ্ট্য যা /system বাইরে পড়া হয়, কিন্তু লেখা হয় না |
system_vendor_config_prop | প্রপার্টি যা /system বাইরে পড়া হয় এবং শুধুমাত্র vendor_init দ্বারা লেখা হয় |
system_public_prop | বৈশিষ্ট্য যা পড়া এবং লেখা হয় /system বাইরে |
যতটা সম্ভব সংকীর্ণভাবে সিস্টেম বৈশিষ্ট্য অ্যাক্সেস সুযোগ. অতীতে, বিস্তৃত অ্যাক্সেসের ফলে অ্যাপ ভাঙ্গা এবং নিরাপত্তা দুর্বলতা দেখা দিয়েছে। স্কোপ করার সময় নিম্নলিখিত প্রশ্নগুলি বিবেচনা করুন:
- এই সিস্টেম সম্পত্তি অবিরত করা প্রয়োজন? (যদি তাই হয়, কেন?)
- কোন প্রক্রিয়া এই সম্পত্তি পড়ার অ্যাক্সেস থাকা উচিত?
- কোন প্রক্রিয়া এই সম্পত্তি লিখতে অ্যাক্সেস থাকা উচিত?
অ্যাক্সেসের জন্য উপযুক্ত সুযোগ নির্ধারণের জন্য পূর্ববর্তী প্রশ্ন এবং নিম্নলিখিত সিদ্ধান্ত ট্রি ব্যবহার করুন।
চিত্র 1. সিস্টেম বৈশিষ্ট্য অ্যাক্সেস সুযোগ নির্ধারণের জন্য সিদ্ধান্ত গাছ
ধাপ 3: সিস্টেম/সিপলিসিতে যোগ করুন
sysprop অ্যাক্সেস করার সময়, SELinux প্রক্রিয়াগুলির অ্যাক্সেসযোগ্যতা নিয়ন্ত্রণ করে। আপনি কোন স্তরের অ্যাক্সেসিবিলিটি প্রয়োজন তা নির্ধারণ করার পরে, system/sepolicy
অধীনে সম্পত্তির প্রসঙ্গ সংজ্ঞায়িত করুন, সাথে অতিরিক্ত অনুমতি দিন এবং কোন প্রক্রিয়াগুলি পড়তে বা লেখার অনুমতি দেওয়া হয় (এবং এটি নেই ) সে সম্পর্কে নিয়মাবলীর সাথে।
প্রথমে, system/sepolicy/public/property.te
ফাইলে সম্পত্তি প্রসঙ্গ সংজ্ঞায়িত করুন। প্রপার্টি সিস্টেম-অভ্যন্তরীণ হলে, system/sepolicy/private/property.te
ফাইলে এটি সংজ্ঞায়িত করুন। system_[accessibility]_prop([context])
ম্যাক্রোগুলির একটি ব্যবহার করুন যা আপনার সিস্টেম সম্পত্তির প্রয়োজনীয় অ্যাক্সেসিবিলিটি প্রদান করে। এটি system/sepolicy/public/property.te
ফাইলের একটি উদাহরণ:
system_public_prop(audio_foo_prop)
system_vendor_config_prop(audio_bar_prop)
system/sepolicy/private/property.te
ফাইলে যোগ করার উদাহরণ:
system_internal_prop(audio_baz_prop)
দ্বিতীয়ত, সম্পত্তি প্রসঙ্গে পড়তে এবং (বা) লেখার অনুমতি দিন। system/sepolicy/public/{domain}.te
বা system/sepolicy/private/{domain}.te
ফাইলে অ্যাক্সেস দেওয়ার জন্য set_prop
এবং get_prop
ম্যাক্রো ব্যবহার করুন। যখনই সম্ভব private
ব্যবহার করুন; যদি set_prop
বা get_prop
ম্যাক্রো মূল ডোমেনের বাইরের কোনো ডোমেনকে প্রভাবিত করে তবেই public
উপযুক্ত।
উদাহরণ, system/sepolicy/private/audio.te
ফাইলে:
set_prop(audio, audio_foo_prop)
set_prop(audio, audio_bar_prop)
উদাহরণ, system/sepolicy/public/domain.te
ফাইলে:
get_prop(domain, audio_bar_prop)
তৃতীয়ত, ম্যাক্রো দ্বারা স্কোপ করা অ্যাক্সেসযোগ্যতাকে আরও কমাতে কিছু কখনও অনুমতি না দেওয়ার নিয়ম যোগ করুন। উদাহরণস্বরূপ, অনুমান করুন যে আপনি system_restricted_prop
ব্যবহার করেছেন কারণ আপনার সিস্টেমের বৈশিষ্ট্য অবশ্যই বিক্রেতা প্রক্রিয়া দ্বারা পড়তে হবে। যদি সমস্ত বিক্রেতা প্রক্রিয়াগুলির দ্বারা পঠন অ্যাক্সেসের প্রয়োজন না হয়, এবং এটি শুধুমাত্র একটি নির্দিষ্ট সেট প্রক্রিয়ার (যেমন vendor_init
) দ্বারা প্রয়োজন হয়, তাহলে সেই বিক্রেতা প্রক্রিয়াগুলিকে নিষিদ্ধ করুন যেগুলির পড়ার অ্যাক্সেসের প্রয়োজন নেই৷
লেখা এবং পড়ার অ্যাক্সেস সীমাবদ্ধ করার জন্য নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন:
লেখার অ্যাক্সেস সীমাবদ্ধ করতে:
neverallow [domain] [context]:property_service set;
পড়ার অ্যাক্সেস সীমাবদ্ধ করতে:
neverallow [domain] [context]:file no_rw_file_perms;
system/sepolicy/private/{domain}.te
ফাইলে neverallow নিয়মগুলি রাখুন যদি neverallow নিয়মটি একটি নির্দিষ্ট ডোমেনে আবদ্ধ থাকে। বৃহত্তর কখনই অনুমতি না দেওয়া নিয়মগুলির জন্য, যেখানে উপযুক্ত সেখানে সাধারণ ডোমেনগুলি ব্যবহার করুন:
-
system/sepolicy/private/property.te
-
system/sepolicy/private/coredomain.te
-
system/sepolicy/private/domain.te
system/sepolicy/private/audio.te
ফাইলে, নিম্নলিখিতগুলি রাখুন:
neverallow {
domain -init -audio
} {audio_foo_prop audio_bar_prop}:property_service set;
system/sepolicy/private/property.te
ফাইলে, নিম্নলিখিতগুলি রাখুন:
neverallow {
domain -coredomain -vendor_init
} audio_prop:file no_rw_file_perms;
মনে রাখবেন যে {domain -coredomain}
সমস্ত বিক্রেতা প্রক্রিয়া ক্যাপচার করে। সুতরাং {domain -coredomain -vendor_init}
মানে " vendor_init
ছাড়া সমস্ত বিক্রেতা প্রক্রিয়া।"
অবশেষে, সম্পত্তি প্রসঙ্গের সাথে একটি সিস্টেম সম্পত্তি সংযুক্ত করুন। এটি নিশ্চিত করে যে যে অ্যাক্সেস মঞ্জুর করা হয়েছে এবং প্রপার্টি প্রসঙ্গে প্রয়োগ করা হয় এমন নিয়মগুলি প্রকৃত বৈশিষ্ট্যগুলিতে প্রয়োগ করা হয়। এটি করার জন্য, property_contexts
ফাইলে একটি এন্ট্রি যোগ করুন, একটি ফাইল যা সিস্টেমের বৈশিষ্ট্য এবং সম্পত্তি প্রসঙ্গগুলির মধ্যে ম্যাপিং বর্ণনা করে। এই ফাইলটিতে, আপনি হয় একটি একক প্রপার্টি বা প্রেফিক্সের জন্য একটি প্রেফিক্স উল্লেখ করতে পারেন যা একটি প্রসঙ্গে ম্যাপ করা হবে।
এটি একটি একক সম্পত্তি ম্যাপ করার জন্য সিনট্যাক্স:
[property_name] u:object_r:[context_name]:s0 exact [type]
এটি একটি উপসর্গ ম্যাপ করার জন্য সিনট্যাক্স:
[property_name_prefix] u:object_r:[context_name]:s0 prefix [type]
আপনি ঐচ্ছিকভাবে সম্পত্তির ধরন নির্দিষ্ট করতে পারেন, যা নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:
-
bool
-
int
-
uint
-
double
-
enum [list of possible values...]
-
string
(তালিকা বৈশিষ্ট্যের জন্যstring
ব্যবহার করুন।)
নিশ্চিত করুন যে প্রতিটি এন্ট্রিতে যখনই সম্ভব তার মনোনীত টাইপ আছে, যেমন property
সেট করার সময় type
প্রয়োগ করা হয়। নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি ম্যাপিং লিখতে হয়:
# binds a boolean property "ro.audio.status.enabled"
# to the context "audio_foo_prop"
ro.audio.status.enabled u:object_r:audio_foo_prop:s0 exact bool
# binds a boolean property "vold.decrypt.status"
# to the context "vold_foo_prop"
# The property can only be set to one of these: on, off, unknown
vold.decrypt.status u:object_r:vold_foo_prop:s0 exact enum on off unknown
# binds any properties starting with "ro.audio.status."
# to the context "audio_bar_prop", such as
# "ro.audio.status.foo", or "ro.audio.status.bar.baz", and so on.
ro.audio.status. u:object_r:audio_bar_prop:s0 prefix
যখন একটি সঠিক এন্ট্রি এবং একটি প্রিফিক্স এন্ট্রি বিরোধ, সঠিক এন্ট্রি অগ্রাধিকার নেয়। আরও উদাহরণের জন্য, দেখুন system/sepolicy/private/property_contexts
।
ধাপ 4: স্থিতিশীলতার প্রয়োজনীয়তা নির্ধারণ করুন
স্থিতিশীলতা সিস্টেম বৈশিষ্ট্যের আরেকটি দিক, এবং এটি অ্যাক্সেসযোগ্যতার থেকে পৃথক। স্থিতিশীলতা হল ভবিষ্যতে সিস্টেমের সম্পত্তি পরিবর্তন করা যাবে কি না (উদাহরণস্বরূপ নাম পরিবর্তন করা, বা এমনকি সরানো)। Android OS মডুলার হয়ে যাওয়ার কারণে এটি বিশেষভাবে গুরুত্বপূর্ণ। ট্রেবলের মাধ্যমে, সিস্টেম, বিক্রেতা এবং পণ্য পার্টিশন একে অপরের থেকে স্বাধীনভাবে আপডেট করা যেতে পারে। মেইনলাইনের সাথে, OS এর কিছু অংশ আপডেটযোগ্য মডিউল হিসাবে মডুলারাইজ করা হয় (APEXes বা APKগুলিতে)।
যদি একটি সিস্টেম সম্পত্তি সফ্টওয়্যারের আপডেটযোগ্য টুকরো জুড়ে ব্যবহারের জন্য হয়, উদাহরণস্বরূপ সিস্টেম এবং ভেন্ডর পার্টিশন জুড়ে, এটি অবশ্যই স্থিতিশীল হতে হবে। যাইহোক, যদি এটি শুধুমাত্র একটি নির্দিষ্ট মেইনলাইন মডিউলের মধ্যে ব্যবহার করা হয়, তাহলে আপনি এর নাম, প্রকার বা সম্পত্তির প্রসঙ্গ পরিবর্তন করতে পারেন এবং এমনকি এটিকে সরিয়ে দিতে পারেন।
একটি সিস্টেম সম্পত্তির স্থায়িত্ব নির্ধারণ করতে নিম্নলিখিত প্রশ্ন জিজ্ঞাসা করুন:
- এই সিস্টেম সম্পত্তি কি অংশীদারদের দ্বারা কনফিগার করার উদ্দেশ্যে (বা ডিভাইস প্রতি আলাদাভাবে কনফিগার করা হয়েছে)? যদি হ্যাঁ, এটি অবশ্যই স্থিতিশীল হতে হবে।
- এই AOSP-সংজ্ঞায়িত সিস্টেম প্রপার্টিটি কি
vendor.img
বাproduct.img
মতো নন-সিস্টেম পার্টিশনে বিদ্যমান কোড (প্রক্রিয়া নয়) থেকে লেখা বা পড়ার উদ্দেশ্যে? যদি হ্যাঁ, এটি অবশ্যই স্থিতিশীল হতে হবে। - এই সিস্টেম সম্পত্তি কি মেইনলাইন মডিউল জুড়ে বা একটি মেইনলাইন মডিউল এবং প্ল্যাটফর্মের অ-আপডেটযোগ্য অংশ জুড়ে অ্যাক্সেস করা হয়েছে? যদি হ্যাঁ, এটি অবশ্যই স্থিতিশীল হতে হবে।
স্থিতিশীল সিস্টেম বৈশিষ্ট্যের জন্য, প্রতিটিকে একটি API হিসাবে আনুষ্ঠানিকভাবে সংজ্ঞায়িত করুন এবং সিস্টেম সম্পত্তি অ্যাক্সেস করতে API ব্যবহার করুন, যেমন ধাপ 6 এ ব্যাখ্যা করা হয়েছে।
ধাপ 5: নির্মাণের সময় বৈশিষ্ট্য সেট করুন
মেকফাইল ভেরিয়েবল সহ বিল্ড টাইমে বৈশিষ্ট্য সেট করুন। টেকনিক্যালি, মানগুলি {partition}/build.prop
এ তৈরি করা হয়। তারপর বৈশিষ্ট্য সেট করতে init
{partition}/build.prop
পড়ে। এই ধরনের ভেরিয়েবলের দুটি সেট আছে: PRODUCT_{PARTITION}_PROPERTIES
এবং TARGET_{PARTITION}_PROP
।
PRODUCT_{PARTITION}_PROPERTIES
সম্পত্তির মানগুলির একটি তালিকা রয়েছে৷ সিনট্যাক্স হল {prop}={value}
বা {prop}?={value}
।
{prop}={value}
হল একটি সাধারণ অ্যাসাইনমেন্ট যা নিশ্চিত করে যে {prop}
সেট করা আছে {value}
; একটি একক সম্পত্তি প্রতি শুধুমাত্র একটি এসাইনমেন্ট সম্ভব.
{prop}?={value}
একটি ঐচ্ছিক অ্যাসাইনমেন্ট; যদি কোনো {prop}={value}
অ্যাসাইনমেন্ট না থাকে তবেই {prop}
{value}
এ সেট করে। একাধিক ঐচ্ছিক অ্যাসাইনমেন্ট বিদ্যমান থাকলে, প্রথমটি জিতবে।
# sets persist.traced.enable to 1 with system/build.prop
PRODUCT_SYSTEM_PROPERTIES += persist.traced.enable=1
# sets ro.zygote to zygote32 with system/build.prop
# but only when there are no other assignments to ro.zygote
# optional are useful when giving a default value to a property
PRODUCT_SYSTEM_PROPERTIES += ro.zygote?=zygote32
# sets ro.config.low_ram to true with vendor/build.prop
PRODUCT_VENDOR_PROPERTIES += ro.config.low_ram=true
TARGET_{PARTITION}_PROP
ফাইলগুলির একটি তালিকা রয়েছে, যা সরাসরি {partition}/build.prop
এ নির্গত হয়। প্রতিটি ফাইলে {prop}={value}
জোড়ার একটি তালিকা রয়েছে।
# example.prop
ro.cp_system_other_odex=0
ro.adb.secure=0
ro.control_privapp_permissions=disable
# emits example.prop to system/build.prop
TARGET_SYSTEM_PROP += example.prop
আরও বিস্তারিত জানার জন্য, build/make/core/sysprop.mk
দেখুন।
ধাপ 6: রানটাইমে বৈশিষ্ট্য অ্যাক্সেস করুন
বৈশিষ্ট্যগুলি রানটাইমে পড়া এবং লেখা যেতে পারে।
Init স্ক্রিপ্ট
Init স্ক্রিপ্ট ফাইলগুলি (সাধারণত *.rc ফাইলগুলি) ${prop}
বা ${prop:-default}
দ্বারা একটি প্রপার্টি পড়তে পারে, একটি অ্যাকশন সেট করতে পারে যা চলে যখনই একটি প্রপার্টি একটি নির্দিষ্ট মান হয়ে যায়, এবং setprop
ব্যবহার করে বৈশিষ্ট্যগুলি লিখতে পারে আদেশ
# when persist.device_config.global_settings.sys_traced becomes 1,
# set persist.traced.enable to 1
on property:persist.device_config.global_settings.sys_traced=1
setprop persist.traced.enable 1
# when security.perf_harden becomes 0,
# write /proc/sys/kernel/sample_rate to the value of
# debug.sample_rate. If it's empty, write -100000 instead
on property:security.perf_harden=0
write /proc/sys/kernel/sample_rate ${debug.sample_rate:-100000}
getprop এবং setprop শেল কমান্ড
বৈশিষ্ট্যগুলি পড়তে বা লিখতে আপনি যথাক্রমে getprop
বা setprop
শেল কমান্ড ব্যবহার করতে পারেন। আরও বিশদ বিবরণের জন্য, getprop --help
অথবা setprop --help
আহ্বান করুন।
$ adb shell getprop ro.vndk.version
$
$ adb shell setprop security.perf_harden 0
C++/Java/Rust-এর জন্য API হিসেবে Sysprop
sysprop-কে API হিসাবে, আপনি সিস্টেমের বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করতে পারেন এবং স্বয়ংক্রিয়-উত্পন্ন API ব্যবহার করতে পারেন যা কংক্রিট এবং টাইপ করা হয়। Public
সাথে scope
সেট করাও সীমানা জুড়ে মডিউলগুলিতে জেনারেট করা APIগুলিকে উপলব্ধ করে এবং API স্থিতিশীলতা নিশ্চিত করে। এখানে একটি .sysprop
ফাইলের একটি নমুনা, একটি Android.bp
মডিউল এবং C++, জাভা এবং রাস্ট কোড সেগুলি ব্যবহার করে৷
# AudioProps.sysprop
# module becomes static class (Java) / namespace (C++) for serving API
module: "android.sysprop.AudioProps"
# owner can be Platform or Vendor or Odm
owner: Platform
# one prop defines one property
prop {
prop_name: "ro.audio.volume.level"
type: Integer
scope: Public
access: ReadWrite
api_name: "volume_level"
}
…
// Android.bp
sysprop_library {
name: "AudioProps",
srcs: ["android/sysprop/AudioProps.sysprop"],
property_owner: "Platform",
}
// Rust, Java and C++ modules can link against the sysprop_library
rust_binary {
rustlibs: ["libaudioprops_rust"],
…
}
java_library {
static_libs: ["AudioProps"],
…
}
cc_binary {
static_libs: ["libAudioProps"],
…
}
// Rust code accessing generated API.
// Get volume. Use 50 as the default value.
let vol = audioprops::volume_level()?.unwrap_or_else(50);
// Java codes accessing generated API
// get volume. use 50 as the default value.
int vol = android.sysprop.AudioProps.volume_level().orElse(50);
// add 10 to the volume level.
android.sysprop.AudioProps.volume_level(vol + 10);
// C++ codes accessing generated API
// get volume. use 50 as the default value.
int vol = android::sysprop::AudioProps::volume_level().value_or(50);
// add 10 to the volume level.
android::sysprop::AudioProps::volume_level(vol + 10);
আরও তথ্যের জন্য, APIs হিসাবে সিস্টেম বৈশিষ্ট্য প্রয়োগ করুন দেখুন।
C/C++, Java, এবং Rust নিম্ন-স্তরের সম্পত্তি ফাংশন এবং পদ্ধতি
যখন সম্ভব হয়, নিম্ন-স্তরের C/C++ বা মরিচা ফাংশন বা নিম্ন-স্তরের জাভা পদ্ধতিগুলি আপনার কাছে উপলব্ধ থাকলেও API হিসাবে Sysprop ব্যবহার করুন।
libc
, libbase
, এবং libcutils
C++ সিস্টেম প্রপার্টি ফাংশন অফার করে। libc
অন্তর্নিহিত API রয়েছে, যখন libbase
এবং libcutils
ফাংশনগুলি হল wrappers। যদি সম্ভব হয়, libbase
sysprop ফাংশন ব্যবহার করুন; তারা সবচেয়ে সুবিধাজনক, এবং হোস্ট বাইনারি libbase
ফাংশন ব্যবহার করতে পারে। আরো বিস্তারিত জানার জন্য, sys/system_properties.h
( libc
), android-base/properties.h
( libbase
), এবং cutils/properties.h
( libcutils
) দেখুন।
android.os.SystemProperties
ক্লাস জাভা সিস্টেম সম্পত্তি পদ্ধতি অফার করে।
rustutils::system_properties
মডিউল মরিচা সিস্টেম সম্পত্তি ফাংশন এবং প্রকার অফার করে।
পরিশিষ্ট: বিক্রেতা-নির্দিষ্ট বৈশিষ্ট্য যোগ করুন
অংশীদাররা (Pixel ডেভেলপমেন্টের প্রেক্ষাপটে কাজ করা Googlers সহ) হার্ডওয়্যার-নির্দিষ্ট (বা ডিভাইস-নির্দিষ্ট) সিস্টেম বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে চায়। বিক্রেতা-নির্দিষ্ট বৈশিষ্ট্য হল অংশীদার-মালিকানাধীন বৈশিষ্ট্য যা তাদের নিজস্ব হার্ডওয়্যার বা ডিভাইসের জন্য অনন্য, প্ল্যাটফর্মের জন্য নয়। যেহেতু এগুলি হার্ডওয়্যার বা ডিভাইস নির্ভর, তাই এগুলিকে /vendor
বা /odm
পার্টিশনের মধ্যে ব্যবহার করতে হবে।
প্রজেক্ট ট্রেবলের পর থেকে, প্ল্যাটফর্মের বৈশিষ্ট্য এবং বিক্রেতার বৈশিষ্ট্যগুলিকে সম্পূর্ণরূপে বিভক্ত করা হয়েছে যাতে সেগুলিকে পরস্পরবিরোধী না করা যায়৷ নিম্নলিখিত বর্ণনা করে কিভাবে বিক্রেতার বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করতে হয় এবং কোন বিক্রেতার বৈশিষ্ট্যগুলি সর্বদা ব্যবহার করা উচিত তা বলে৷
সম্পত্তি এবং প্রসঙ্গ নামের নেমস্পেস
সমস্ত বিক্রেতার বৈশিষ্ট্যগুলিকে নিম্নলিখিত উপসর্গগুলির মধ্যে একটি দিয়ে শুরু করতে হবে যাতে তাদের এবং অন্যান্য পার্টিশনের বৈশিষ্ট্যগুলির মধ্যে সংঘর্ষ রোধ করা যায়।
-
ctl.odm.
-
ctl.vendor.
-
ctl.start$odm.
-
ctl.start$vendor.
-
ctl.stop$odm.
-
ctl.stop$vendor.
-
init.svc.odm.
-
init.svc.vendor.
-
ro.odm.
-
ro.vendor.
-
odm.
-
persist.odm.
-
persist.vendor.
-
vendor.
নোট করুন যে ro.hardware.
একটি উপসর্গ হিসাবে অনুমোদিত, কিন্তু শুধুমাত্র সামঞ্জস্যের জন্য। সাধারণ বৈশিষ্ট্যের জন্য এটি ব্যবহার করবেন না।
নিম্নলিখিত উদাহরণগুলি পূর্ববর্তী তালিকাভুক্ত উপসর্গগুলির একটি ব্যবহার করে:
-
vendor.display.primary_red
-
persist.vendor.faceauth.use_disk_cache
-
ro.odm.hardware.platform
সমস্ত বিক্রেতার সম্পত্তি প্রসঙ্গে অবশ্যই vendor_
দিয়ে শুরু করতে হবে। এটি সামঞ্জস্যের জন্যও। নিম্নলিখিত উদাহরণ:
-
vendor_radio_prop
-
vendor_faceauth_prop
. -
vendor_usb_prop
।
সম্পত্তির নামকরণ এবং রক্ষণাবেক্ষণ করা বিক্রেতার দায়িত্ব, তাই বিক্রেতার নেমস্পেসের প্রয়োজনীয়তা ছাড়াও ধাপ 2 এ প্রস্তাবিত বিন্যাসটি অনুসরণ করুন।
বিক্রেতা-নির্দিষ্ট এসইপলিসি নিয়ম এবং সম্পত্তি_প্রসঙ্গ
বিক্রেতার বৈশিষ্ট্য vendor_internal_prop
ম্যাক্রো দ্বারা সংজ্ঞায়িত করা যেতে পারে। BOARD_VENDOR_SEPOLICY_DIRS
ডিরেক্টরিতে আপনার সংজ্ঞায়িত বিক্রেতা-নির্দিষ্ট নিয়মগুলি রাখুন৷ উদাহরণস্বরূপ, ধরুন আপনি প্রবালের মধ্যে একটি বিক্রেতা faceauth সম্পত্তি সংজ্ঞায়িত করছেন৷
BoardConfig.mk
ফাইলে (অথবা যেকোনো BoardConfig.mk
অন্তর্ভুক্ত), নিম্নলিখিতগুলি রাখুন:
BOARD_VENDOR_SEPOLICY_DIRS := device/google/coral-sepolicy
device/google/coral-sepolicy/private/property.te
ফাইলে, নিম্নলিখিতগুলি রাখুন:
vendor_internal_prop(vendor_faceauth_prop)
device/google/coral-sepolicy/private/property_contexts
ফাইলে, নিম্নলিখিতগুলি রাখুন:
vendor.faceauth.trace u:object_r:vendor_faceauth_prop:s0 exact bool
বিক্রেতার বৈশিষ্ট্যের সীমাবদ্ধতা
যেহেতু সিস্টেম এবং পণ্য পার্টিশনগুলি বিক্রেতার উপর নির্ভর করতে পারে না, তাই কখনই বিক্রেতার বৈশিষ্ট্যগুলিকে system
, system-ext
বা product
পার্টিশন থেকে অ্যাক্সেস করার অনুমতি দেবেন না।
পরিশিষ্ট: বিদ্যমান বৈশিষ্ট্যের নাম পরিবর্তন করুন
যখন আপনাকে অবশ্যই একটি সম্পত্তির অবমূল্যায়ন করতে হবে এবং একটি নতুনটিতে যেতে হবে, তখন আপনার বিদ্যমান বৈশিষ্ট্যের নাম পরিবর্তন করতে API হিসাবে Sysprop ব্যবহার করুন৷ এটি উত্তরাধিকার নাম এবং নতুন সম্পত্তি নাম উভয় নির্দিষ্ট করে পশ্চাদপদ সামঞ্জস্য বজায় রাখে। বিশেষভাবে, আপনি .sysprop
ফাইলে legacy_prop_name
ক্ষেত্র দ্বারা উত্তরাধিকার নাম সেট করতে পারেন। জেনারেট করা API prop_name
পড়ার চেষ্টা করে এবং যদি prop_name
বিদ্যমান না থাকে তাহলে legacy_prop_name
ব্যবহার করে।
উদাহরণ স্বরূপ, নিম্নলিখিত ধাপগুলি awesome_feature_foo_enabled
নাম পরিবর্তন করে foo.awesome_feature.enabled
করুন।
foo.sysprop
ফাইলে
module: "android.sysprop.foo"
owner: Platform
prop {
api_name: "is_awesome_feature_enabled"
type: Boolean
scope: Public
access: Readonly
prop_name: "foo.awesome_feature.enabled"
legacy_prop_name: "awesome_feature_foo_enabled"
}
C++ কোডে
// is_awesome_feature_enabled() reads "foo.awesome_feature.enabled".
// If it doesn't exist, reads "awesome_feature_foo_enabled" instead
using android::sysprop::foo;
bool enabled = foo::is_awesome_feature_enabled().value_or(false);
নিম্নলিখিত সতর্কতা নোট করুন:
প্রথমত, আপনি sysprop এর ধরন পরিবর্তন করতে পারবেন না। উদাহরণস্বরূপ, আপনি একটি
string
প্রপ মধ্যে একটিint
প্রপ করতে পারবেন না. আপনি শুধুমাত্র নাম পরিবর্তন করতে পারেন.দ্বিতীয়ত, শুধুমাত্র পঠিত API উত্তরাধিকার নামে ফিরে আসে। লেখার API ফিরে আসে না। যদি sysprop একটি লেখার যোগ্য হয় তবে আপনি এটির নাম পরিবর্তন করতে পারবেন না।