सबसे पहले, मुझे यह स्वीकार करना चाहिए कि मैं आपके "मैं इस चौंकाने वाला कठिन" कथन से पूरी तरह सहमत हूं । Google ने एंड्रॉइड को मुख्य रूप से उपभोक्ता दृष्टिकोण से डिज़ाइन किया है, न कि बिजली उपयोगकर्ताओं के लिए। नतीजा यह है कि, जैसे ही आप नवीनतम फेसबुक ऐप का उपयोग करने या कैंडी क्रश के साथ खेलने के बाहर कुछ करना चाहते हैं, आप बहुत जल्दी अपने आप को 2000 के शुरुआती लिनक्स के दायरे में वापस पा लेंगे, जब एक डेवलपर की तरह ज्ञान को बदलना आवश्यक था सरल सेटिंग्स क्या होनी चाहिए। मेरा मानना है कि स्थिति तेजी से विकसित होगी क्योंकि एंड्रॉइड सिस्टम अधिक परिपक्व हो जाता है, लेकिन अभी के लिए हमें जो करना है, उसके साथ हमें करना होगा ...
जैसा कि आपने कहा, अपने स्वयं के SELinux टूलसेट को संकलित करने के दो कारण हैं:
- सिस्टम प्रदान करने वाला टूलसेट आमतौर पर एक संस्करण है। जबकि एंड्रॉइड का SELinux नीति DB संस्करण 30 पर निर्भर करता है, वर्तमान लिनक्स बॉक्स आमतौर पर केवल 29 तक का संस्करण संभालते हैं।
- यहां तक कि अगर यह अधिक हाल ही में होगा तो यह मदद नहीं करेगा, वास्तव में अपस्ट्रीम कोड से SELinux का निर्माण करना (जो कि आसान है, कम से कम फेडोरा मशीनों पर अपस्ट्रीम सिफारिशों का पालन करना) प्रभावी रूप से सिस्टम को नीति DB संस्करण 30 को संभालने की अनुमति देता है, हालांकि Android का SELinux है हैवीली संशोधित ( Google प्रलेखन कुछ संशोधनों पर प्रकाश डालता है) इसलिए सिंटैक्स और पार्सिंग त्रुटियों के कारण Android के SELinux को संभालने की कोशिश की जा रही है।
तो, Android के SELinux विश्लेषण खोज पर रखने के लिए, हमें अपने हाथों को गंदगी में डालना होगा ... सबसे साफ तरीके से संभव तरीके से:
- सबसे पहले हम एक समझदार वातावरण सेटअप करेंगे,
- यह हो जाने के बाद हम Android के SELinux लाइब्रेरी और पहले टूल्स को संकलित करेंगे,
- उनके ऊपर हम SELinux टूल्स बनाएंगे,
- हम कुछ पूरक उपयोगिताओं को जोड़कर पूरा करेंगे।
समुचित वातावरण सेट करें
पर्यावरण के गुण
सबसे स्वच्छ तरीके से अनुशंसित, संभवतः केवल मज़बूती से काम करने का तरीका अपने Android कार्य के लिए एक वातावरण समर्पित करना है:
एक आभासी मशीन पूरी तरह से ठीक है (यदि सबसे अच्छा विकल्प नहीं है)। VMware का उपयोग करना पसंद करें क्योंकि आपको अपने फोन को गेस्ट सिस्टम में USB के माध्यम से जोड़ना होगा। नि: शुल्क वैकल्पिक Qemu इस तरह के काम को बहुत अच्छी तरह से संभाल नहीं करता है। मैंने अन्य virualization सॉफ़्टवेयर के साथ प्रयास नहीं किया।
इसे 64 बिट सिस्टम की आवश्यकता होगी, अन्यथा पूर्णांक गलत आकार के होने के कारण कोड संकलित नहीं करेगा।
यह उबंटू प्रणाली का उपयोग करने के लिए, संभवतः अनिवार्य रूप से अनुशंसित है। यदि आप XFCE के लाइटर डेस्कटॉप वातावरण को पसंद करते हैं, तो इसके बजाय Xubuntu का उपयोग करने के लिए स्वतंत्र महसूस करें, यह सिस्टम के कोर और उपलब्ध पैकेज को नहीं बदलता है और आपके एंड्रॉइड संबंधित कार्य पर कोई प्रभाव नहीं पड़ेगा (जो भी मैं इस प्रक्रिया में उबंटू के बारे में कहता हूं, वह Xubuntu पर भी लागू होता है)। आपको एंड्रॉइड के SELinux सोर्स ट्री में कुछ रीडमी फ़ाइलें मिल सकती हैं, जो Fedora के उपयोग की अनुशंसा करती हैं, ये फाइलें NSA के SELinux प्रोजेक्ट से विरासत में मिली हैं और उनकी सामग्री Google के Android से मेल नहीं खाती है।
उपयोग करने के लिए अनबंटू का सटीक संस्करण उस Android के संस्करण पर निर्भर करता है जिसे आप बनाना चाहते हैं। Android 6.0 के लिए, Ubuntu 14.04 (भरोसेमंद) की सिफारिश की जाती है। चेक गूगल आवश्यकताओं पेज अधिक जानकारी के लिए।
आपको बहुत सारे डिस्क स्थान की आवश्यकता होगी (यदि आप केवल SELinux-related जांच की योजना बनाते हैं, तो कम से कम 100GB अगर आप Android के पूर्ण निर्माण के लिए योजना बनाते हैं)। सीपीयू और मेमोरी कम प्रासंगिक हैं, वे केवल एक पूर्ण निर्माण के लिए समय को प्रभावित करते हैं और SELinux संबंधित कार्यों के लिए कोई वास्तविक प्रभाव नहीं होगा।
Ubuntu का उपयोग करने के दो मुख्य लाभ हैं:
अनुशंसित प्रणाली का उपयोग करके, आप एक प्रसिद्ध और अच्छी तरह से परीक्षण किए गए वातावरण में काम कर रहे हैं: सिस्टम लाइब्रेरी, टूल और पैकेज प्रोजेक्ट द्वारा अपेक्षित संस्करण और स्थान पर हैं।
और विशेष रूप से हमारे वर्तमान मामले में: उबंटू खुद AppArmor पर निर्भर करता है जो एक SELinux विकल्प है, यह SELCux का उपयोग नहीं करता है। अच्छी खबर यह है कि इसलिए आप सिस्टम की विश्वसनीयता को बदलने के लिए एंड्रॉइड के SELinux टूल और बायनेरिज़ सिस्टम को बिना जोखिम के इंस्टॉल कर पाएंगे।
पर्यावरण स्थापना की प्रक्रिया
आप एक पूर्ण-लाइव लाइव-डीवीडी से शुरू करके उबंटू को पारंपरिक तरीके से स्थापित कर सकते हैं, लेकिन एक तेज विकल्प एक नेटबूट इंस्टॉल (टेक्स्टमोड इंस्टॉल) का उपयोग करना और उस डेस्कटॉप वातावरण का चयन करना है जिसे आप अंत में पसंद करते हैं। ऐसा करने से आप पहले अप्रचलित लोगों को स्थापित करने के बजाय अप-टू-डेट पैकेज संस्करण स्थापित करके प्रारंभिक अद्यतन समय को बचाएंगे, फिर पहले बूट पर 389 लंबित अपडेट लागू करने के लिए कहेंगे।
Ubuntu / Xubuntu 14.04 (एक ही आईएसओ) नेटबूट इंस्टॉलर के लिए आईएसओ यहां उपलब्ध है ।
VMware की परेशानी "आसान इंस्टॉल" सुविधा को छोड़ने के लिए, "मैं बाद में ऑपरेटिंग सिस्टम स्थापित करूंगा" विकल्प का चयन करके शुरू करना एक अच्छी आदत है ।
लिनक्स का चयन करना सुनिश्चित करें , फिर अतिथि ओएस के रूप में उबंटू 64 बिट्स ।
VM को निम्नलिखित स्रोतों की आवश्यकता होगी:
- अनिवार्य: डिस्क स्थान बहुत कम से कम 40 जीबी होना चाहिए (डिफ़ॉल्ट 20 जीबी पर्याप्त नहीं होगा, स्रोत कोड अकेले उस से अधिक स्थान लेता है), उच्च अनुशंसित है। एक पूर्ण बिल्ड के लिए न्यूनतम 100 जीबी डिस्क की आवश्यकता होती है, यह वह मूल्य है जो मैं आमतौर पर लेता हूं। यह मत भूलो कि यह सेटिंग केवल एक अधिकतम सीमा है: VM द्वारा लिया गया वास्तविक आकार मेहमान के अनुरोधों के साथ गतिशील रूप से बढ़ता है।
- परिणामी: RAM को 1024 से बढ़ाकर कम से कम 2048 या उससे अधिक (अपनी होस्ट क्षमता पर निर्भर करता है, मैं 4096 का उपयोग करता हूं),
- परिणामिक: प्रोसेसर कोर की संख्या को 1 से बढ़ाकर 2 या उससे अधिक करना (आपकी मेजबान क्षमता पर निर्भर करता है, मैं 3 का उपयोग करता हूं)।
- सीडी-रोम को इंस्टॉलेशन आईएसओ फाइल की ओर इशारा करना चाहिए।
- आप USB को डिफ़ॉल्ट 1.1 से 2.0 पर स्विच करना चाह सकते हैं क्योंकि जब आप अपना डिवाइस कनेक्ट करते हैं तो पूर्व चेतावनी दे सकता है। अपने उपयोग के आधार पर, आप "स्वचालित रूप से नए USB उपकरणों को कनेक्ट करें " और "ब्लूटूथ डिवाइस को वर्चुअल मशीन से साझा करें " को सुरक्षित रूप से अनचेक कर सकते हैं ।
- अपने वातावरण के आधार पर, आपको डिस्प्ले सेटिंग्स को भी बदलना पड़ सकता है (3D अक्षम करें, स्क्रीन आकार लागू करें)।
ध्यान:
- यदि आपने नेटबूट इंस्टॉल चुना है, तो सॉफ़्टवेयर चयन स्क्रीन तक पहुंचने पर अपने डेस्कटॉप वातावरण ( उबंटू डेस्कटॉप या ज़ुबांटो डेस्कटॉप ) का चयन करना न भूलें , या आप एक न्यूनतम पाठ-केवल वातावरण के साथ समाप्त हो जाएंगे!
- पहले बूट पर, नवीनतम रिलीज़ के लिए अपग्रेड करने से इंकार करें: यहाँ पर संपूर्ण बिंदु 14.04 में रहना है!
पहले बूट पर, सबसे पहले आप जो करना चाहते हैं, वह है लिनक्स गेस्ट टूल्स इंस्टॉल करना:
sudo apt-get install open-vm-tools
यह पैकेट बूट-टाइम ट्रिगर्स डालता है, इसलिए इसकी स्थापना अतिथि पुनरारंभ के बाद ही पूरी होगी।
Android स्रोत कोड लाएं
इसी तरह, प्रक्रिया विवरण चुने हुए ROM पर निर्भर करता है:
- CyanogenMod के लिए, अपने डिवाइस के लिए खोज करें (पहले विक्रेता का चयन करें) फिर अपने डिवाइस के लिए निर्देश प्राप्त करने के लिए "CyanogenMod का निर्माण कैसे करें" लिंक पर क्लिक करें ।
- एओएसपी के लिए, यहां शुरू होने वाली प्रक्रिया का पालन करें ।
यह ध्यान देने योग्य हो सकता है कि CyanogeMod अपने स्रोत के पेड़ में बंडल करता है जो आपको boot.img
फ़ाइलों को अनपैक करने की अनुमति देता है । इसे अलग तरीके से कहने के लिए, CyanogenMod आपको एक उपकरण प्रदान करता है जो आपको sepolicy
उपकरणों और रोम अभिलेखागार में संग्रहीत फ़ाइल तक पहुंचने की अनुमति देगा । Google का AOSP ऐसे उपकरण प्रदान नहीं करता है, इसलिए यदि आपके पास CyanogenMod के स्रोत वृक्ष का उपयोग करने की कोई अन्य अनिवार्यता नहीं है, तो यह सबसे सुविधाजनक विकल्प हो सकता है, अन्यथा आपको इसे ऐपार्ट (जो त्वरित और आसान है, स्थापित करना होगा), इसलिए यहाँ कोई चिंता नहीं है)।
यहाँ मैं CyanogenMod 13.0 (Android 6.0) प्रक्रिया का पालन कर रहा हूँ। उपयोग किए गए आदेशों पर स्पष्टीकरण ऊपर दिए गए पृष्ठों पर उपलब्ध है। कृपया उन्हें पढ़ें, नीचे दिए गए प्रकार केवल संदर्भ उद्देश्यों के लिए दिए गए हैं।
युक्ति: जब मैंapt-get
इस पोस्ट में सबसे कम आम भाजक से चिपके रहने और हर किसी को खुश रखने के लिए उपयोग करता हूं, तो आपaptitude
इसके बजायउपयोग करना पसंद कर सकते हैंक्योंकि यह निर्भरता का बेहतर तरीके से ध्यान रखेगा (पैकेज को हटाते समय जिसे कुछ निर्भरता की स्थापना की आवश्यकता होती है , ये निर्भरताएं भी दूर हो जाएँगी, जिससे आपका सिस्टम साफ हो जाएगा)। AFAIKaptitude
आदेश को Ubuntu में स्थापित किया जाना चाहिए, लेकिन Xubuntu पर डिफ़ॉल्ट रूप से उपलब्ध है।
sudo apt-get install bison build-essential curl flex git gnupg gperf \
libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 \
libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools \
xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev \
lib32readline-gplv2-dev lib32z1-dev
mkdir -p ~/bin
mkdir -p ~/android/system
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod u+x ~/bin/repo
cd ~/android/system/
git config --global user.name "Your Name"
git config --global user.email "you@example.com
repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0
repo sync
# Coffee time: around 20GB are being downloaded, this may take several hours.
source ./build/envsetup.sh
breakfast
अब आपके पास एक साफ और लगभग पूर्ण स्रोत का पेड़ है। मालिकाना बूँदें गायब हैं, लेकिन आपको SELinux संबंधित कार्यों के लिए इनकी आवश्यकता नहीं है।
युक्ति: स्रोतों को प्राप्त करना एक थकाऊ प्रक्रिया है, अब आपके वीएम का स्नैपशॉट या बैकअप करने के लिए लायक हो सकता है।
संकलन और Android के SELinux टूलसेट और लाइब्रेरी स्थापित करें
अब यात्रा का मज़ेदार हिस्सा शुरू होता है;)
अब तक यह प्रक्रिया बहुत सीधी होनी चाहिए थी। लक्ष्य मुख्य रूप से यह सुनिश्चित करना था कि आपके पास मेरे जैसा ही वातावरण हो। यदि आप करते हैं, तो अगली कड़ी भी सीधी रहनी चाहिए।
हुड के तहत Google संस्करणों के बीच एंड्रॉइड के स्रोत कोड में गहरे बदलाव लागू करने में संकोच नहीं करता है, इसलिए सटीक संकलन चरण निश्चित रूप से संस्करण पर निर्भर करेगा (उदाहरण के लिए AOSP मास्टर दिखाता है कि sepolicy/
निर्देशिका स्थानांतरित हो जाएगी )।
Android के SElinux लाइब्रेरी और टूलसेट को संकलित करने और स्थापित करने के लिए मैं पहले अपनी सटीक प्रक्रिया साझा करूंगा, लेकिन समय के साथ इस पोस्ट की प्रासंगिकता बनाए रखने के लिए मैं सबसे अधिक संकलन के मुद्दों को हल करने के लिए सामान्य दृष्टिकोण का पालन करने के लिए कुछ नोट्स जोड़ूंगा।
चरण-दर-चरण प्रक्रिया
एंड्रॉइड की SELinux लाइब्रेरीज़ एब्सट्रैक्शन लेयर प्रदान करती हैं जो ऊपरी-लेयर सॉफ़्टवेयर को Android- विशिष्ट SELinux पॉलिसी फ़ाइलों से निपटने की अनुमति देगा। इसलिए हमें उन्हें पहले संकलित करने और स्थापित करने की आवश्यकता होगी (जो, अपने आप में, वास्तव में मूल का प्रतिनिधित्व करता है यदि यहाँ कठिनाइयाँ हैं, जब तक कि आपको अपना रास्ता नहीं मिल जाता है)।
हम तब SELinux टूल्स का निर्माण और स्थापित करने में सक्षम होंगे। जैसा कि हम देखेंगे, सौभाग्य से इन्हें एंड्रॉइड विशिष्ट होने की आवश्यकता नहीं है, उन्हें केवल SELinux लाइब्रेरी संस्करण से मेल खाना चाहिए।
इस प्रक्रिया का परीक्षण CyanogenMod और AOSP स्रोत कोड पेड़ों दोनों का उपयोग करके किया गया है।
Android SELinux लाइब्रेरी और पहले टूल को संकलित और स्थापित करें
पहले स्थापित निर्भरता:
sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto
इस पोस्ट में वेरिएबल $ANDROID_BUILD_TOP
आपके सोर्स लोकेशन (डायरेक्टरी जहां आपने repo sync
कमांड जारी की है ) को स्टोर करता है । आप जैसा चाहें उसका नाम बदलने के लिए स्वतंत्र महसूस करें।
ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh
डिफ़ॉल्ट रूप से नीति के मूल संकलन संकलन restorecond
कुछ पुस्तकालयों का पता लगाने में असमर्थ होने के कारण विफल हो जाता है। आपको pkg-config
हार्डककोड वाले के बजाय गतिशील रूप से उत्पन्न पथ का उपयोग करने के लिए इस मेकफाइल को संपादित करना होगा (सिंगल कोट्स के साथ बैकटिक्स को भ्रमित न करें!)।
sed -i 's/^CFLAGS ?= -g -Werror -Wall -W$/& `pkg-config --cflags --libs dbus-1 gtk+-2.0`/' \
$ANDROID_BUILD_TOP/external/selinux/policycoreutils/restorecond/Makefile
कुछ पाठ संपादक के साथ मेकफाइल को खोलने के लिए स्वतंत्र महसूस करें ताकि यह सुनिश्चित हो सके कि संशोधन को सही तरीके से ध्यान में रखा गया है।
और अब संकलित करें और स्थापित करें:
cd $ANDROID_BUILD_TOP/external/bzip2/
make -f Makefile-libbz2_so
sudo make install
cd $ANDROID_BUILD_TOP/external/libcap-ng/libcap-ng-0.7/
./configure
make
sudo make install
cd $ANDROID_BUILD_TOP/external/selinux/
make -C ./libsepol/
sudo make -C /libsepol/ install
EMFLAGS=-fPIC make -C ./libselinux/
sudo make -C ./libselinux/ install
make -C ./libsemanage/
sudo make -C ./libsemanage/ install
make
sudo make install
make swigify
sudo make install-pywrap
sudo cp ./checkpolicy/test/{dispol,dismod} /usr/bin/
ध्यान दें:EMFLAGS=-fPIC
निर्माण करते समय पर्यावरण चर सेटिंग कोयाद न करेंlibselinux
। यह अभी तक कोई त्रुटि उत्पन्न नहीं करेगा, लेकिन अगले चरण में आप SETools का निर्माण करने में असमर्थ होंगे। यदि आपने इसे मिस कर दिया है या कुछ और गलत किया है, तो बस एक जारी करेंmake clean
और अपने संकलन को पुनरारंभ करें।
संकलन और SELinux उपकरण स्थापित करें
SELinux टूल प्रीबिल्ट फॉर्म में दिए गए हैं जिनमें शामिल हैं:
$ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/
निर्देशिका के भीतर पायथन स्क्रिप्ट (और उनके शेल स्क्रिप्ट रैपर)
- पायथन पैकेज (
*.o
संकलित फ़ाइलों सहित ) नीचे $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/
।
मुझे उम्मीद है कि इन उपकरणों का स्रोत कोड नीचे उपलब्ध होगा $ANDROID_BUILD_TOP/external
, लेकिन यह नहीं है। वास्तव में, मुझे ऐसी कोई जगह नहीं मिली जहां Google ने SETools का सटीक संस्करण साझा किया हो, जिसका उन्होंने उपयोग किया (FYI GPL केवल कोड को साझा करने के लिए अगर इसे संशोधित किया गया है), तो हमें अनुमान लगाना होगा और प्रयास करना होगा और जितना हम कर सकते हैं उतना ही बेहतर होगा ।
उपकरण स्वयं पायथन स्क्रिप्ट हैं, यह SETools 4 से एक नया विकास (SETools 3 में, कमांड जैसे sesearch
बाइनरी निष्पादन योग्य कोडेड थे)। हालाँकि, उपकरण अभी भी 3.3.8 का संस्करण दिखाते हैं:
$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8
इसलिए मेरा अनुमान है कि Google ने SETools 4. से कुछ शुरुआती विकास स्नैपशॉट लिए। 4.0.0 बीटा SETools libsepol
, 2.4 वर्जन पर निर्भर थे , 4.0.0 रिलीज के साथ उन्होंने लाइब्रेरी के 2.5 संस्करण पर भरोसा करना शुरू कर दिया, जो कि संस्करण के साथ संगत नहीं है एंड्रॉइड 6.0 में SELinux बंडल है (आप इसे संकलित करने का प्रयास कर सकते हैं, यह बस विफल हो जाएगा)।
तो समझदार विकल्प SETools 4.0.0 बीटा के साथ जाना लगता है।
पूरक निर्भरता स्थापित करें:
sudo apt-get install python-setuptools
स्रोत कोड डाउनलोड करें और निकालें:
cd ~/android/
wget https://github.com/TresysTechnology/setools/archive/4.0.0-beta.tar.gz
tar xzf 4.0.0-beta.tar.gz
cd ./setools-4.0.0-beta/
फ्लेक्स 2.5 को प्रभावित करने वाले बग के कारण , हमें -Wredundant-decls
संकलक के झंडे को हटाने की आवश्यकता है :
sed -i '/-Wredundant-decls/d' ./setup.py
और अंत में संकलित करें और स्थापित करें:
python ./setup.py build
sudo python ./setup.py install
सामान्य प्रक्रिया (या "अपने आप को कैसे अस्थिर करें")
यदि आपके मामले में ऊपर की प्रक्रिया काम नहीं करती है, तो यहां एक उच्च स्तरीय विचार है कि कैसे प्रगति करने की कोशिश की जाए।
दुख की बात है कि कोई जादू (और कोई सहायक नहीं है :() यहाँ के आसपास: संकलन करने के लिए इस कोड को प्राप्त करने का एकमात्र तरीका शास्त्रीय अभी तक खूंखार चक्रीय "कोशिश-और-देख" दृष्टिकोण है।
पहली बार संकलित करने का प्रयास करें, यह सबसे अधिक संभावना है कि कुछ *.h
फ़ाइल नहीं मिलने के कारण विफल हो जाएगी :
Android की external/
निर्देशिका में खोजें :
find $ANDROID_BUILD_TOP/external -name filename.h
यदि आपको अनुरोधित फ़ाइल मिल जाती है, तो इसका मतलब है कि एंड्रॉइड सोर्स कोड के भीतर संबंधित लाइब्रेरी या टूल का एक विशिष्ट संस्करण बंडल किया गया है। इसलिए आपको इसे उबंटू के पैकेज सिस्टम से इंस्टॉल करने का प्रयास नहीं करना चाहिए, बल्कि एंड्रॉइड सोर्स कोड में बंडल किए गए संस्करण को संकलित और स्थापित करना चाहिए।
ध्यान रखें कि यह सामान्य सलाह के खिलाफ जाता है जो आपको मंचों पर मिल सकता है: "इस लाइब्रेरी के गुम हो जाने के कारण आपका संकलन विफल हो जाता है; इस पैकेज को स्थापित करें तो यह ठीक रहेगा!" , ऐसा करने से आप शायद सबसे खराब मुद्दे पर चले जाएंगे: यदि कोई विशिष्ट संस्करण बंडल किया गया है, तो यह संभवतः सबसे अधिक है क्योंकि एक विशिष्ट संस्करण की आवश्यकता है (संगतता समस्याओं के कारण या क्योंकि इस संस्करण में Google से विशिष्ट परिवर्तन हैं)।
BTW, अगर आप सोच रहे हैं: निश्चित रूप से इस लाइब्रेरी या टूल में कुछ *.h
फ़ाइल नहीं मिलने के कारण निर्भरताएं हो सकती हैं , और हाँ आपको यह बहुत ही चक्रीय "कोशिश-और-देख" दृष्टिकोण लागू करना चाहिए।
खोज प्रणालीबद्ध:
find / -name filename.h 2>/dev/null
यदि आप फ़ाइल को कुछ मानक साझा लाइब्रेरी स्थान में आपके सिस्टम में पहले से मौजूद होने के लिए "गायब" पाते हैं, तो इसका मतलब है कि यह निर्भरता संभवतः आपके वातावरण में पहले से ही मिल गई है, लेकिन मेकफाइल जिसने त्रुटि को उठाया है वह इसे खोजने के लिए बहुत गूंगा है।
यदि आप मैन्युअल रूप से सीधे इस Makefile को कॉल करते हैं, तो आपके लिए यह संभव हो सकता है कि इसे ( LIBDIR=/usr/lib make
उदाहरण के लिए) फिक्स करने वाले कुछ वातावरण चर को सेट करें , अन्यथा आपको Makefile को संशोधित करने की आवश्यकता हो सकती है ( pkg-config
स्वचालित रूप से अनुपलब्ध बिल्ड पैरामीटर उत्पन्न करने के लिए आदेश कीमती मदद हो सकता है) ।
पैकेजिंग प्रणाली में खोजें:
apt-cache search filename-dev
जहां प्रत्यय द्वारा प्रतिस्थापित विस्तार के filename-dev
साथ लोअरकेस में गुम फ़ाइल का नाम दर्शाया गया है (उदाहरण के लिए, यदि नहीं मिला है, तो खोजें )। सही नाम खोजने के लिए कुछ सटीक नाम की जरूरत पड़ सकती है।.h
-dev
Python.h
python-dev
यदि आप अटके हुए हैं और इंटरनेट पर भी त्वरित खोज ने कोई स्पष्ट उत्तर नहीं दिया है, तो apt-file
आपका सबसे अच्छा दोस्त होगा। apt-file
डिफ़ॉल्ट रूप से स्थापित नहीं है, आपको इसे स्थापित करने और इसके डेटाबेस को उत्पन्न करने की आवश्यकता है:
sudo apt-get apt-file
sudo apt-file update
apt-file
आपको विशेष फ़ाइल प्रदान करने वाले पैकेज (यहां तक कि अनइंस्टॉल किए गए) की खोज करने की अनुमति देता है। बहुत अधिक परिणाम होने से बचने के लिए, मैं इसे grep
नीचे के साथ जोड़ने की सलाह देता हूं :
apt-file search filename.h | grep -w filename.h
यदि उबंटू के रिपॉजिटरी में एक पैकेज है जो इस फाइल को प्रदान करता है, तो apt-file
इसे खोजने में सक्षम होना चाहिए।
एक बार जब आप सही पैकेज मिल गया है, इसे का उपयोग स्थापित apt-get install packagename
जहां packagename
अपने पैकेज का नाम है।
युक्ति: यदि आपने अपने सिस्टम पर कुछ खराब कर दिया है, तो पैकेज को पुनः इंस्टॉल करने का आदेश यह हैapt-get reinstall pkg_name
:। यह तब भी काम करेगा, जब ब्रेकिंग निर्भरता (जो सिस्टम के पुस्तकालयों के लिए सबसे अधिक संभावना है) के कारण एक शास्त्रीय हटाने और स्थापित करना संभव नहीं होगा।
पूरक उपकरण
इस चरण में, अब आपके पास एक स्वच्छ वातावरण होना चाहिए जिससे आप संकलित और स्रोत स्वरूपों दोनों में Android के SELinux नियमों की जांच कर सकें।
हालांकि, अधिकांश संभावना यह है कि आपकी जांच के अंत में आप कुछ कार्रवाई करना चाहेंगे। अपने वर्तमान आकार में, आपका वातावरण आपको डिवाइस की sepolicy
फ़ाइल को संशोधित करने की अनुमति नहीं देगा । वास्तव में, इस फ़ाइल को आसानी से प्रतिस्थापित नहीं किया जा सकता है: यह डिवाइस रूट निर्देशिका का हिस्सा है, और रूट निर्देशिका की सामग्री रैम डिस्क फ़ाइल से बूट समय पर निकालने वाली है, जो बदले में डिवाइस की बूट छवि में संग्रहीत होती है।
तो आपके पर्यावरण के पूर्ण होने से पहले ही आपको दो चीजें याद आती हैं:
- डिवाइस की बूट छवि को एक्सेस और संशोधित करने का एक तरीका,
- अपनी
sepolicy
फ़ाइल को संशोधित करने का एक तरीका ।
सौभाग्य से, ये इस पोस्ट के अंतिम दो वर्गों के विषय हैं! :)
डिवाइस की बूट छवि प्राप्त करें और अपडेट करें
उपकरणों की बूट छवि को लाने और अद्यतन करने के लिए उपकरणों का उपयोग विभिन्न प्रकार की चीजों के अलावा SELinux नियमों से छेड़छाड़ के लिए किया जा सकता है। मैंने इसलिए एक समर्पित उत्तर तैयार किया है , कृपया इसे देखें।
डिवाइस के SELinux नियमों को संशोधित करें
आपके पास यहां दो मुख्य संभावनाएं हैं:
sepolicy
अपने स्रोत ट्री में नियमों से एक नई फ़ाइल बनाएँ ( .te
उन्हें खोजने के लिए फ़ाइलों की खोज करें:, find $ANDROID_BUILD_TOP -name \*.te
वे कई निर्देशिकाओं में फैले हुए हैं)।
sepolicy
वर्तमान में डिवाइस द्वारा उपयोग की गई फ़ाइल को संशोधित करें ।
जब तक आपको वास्तव में खरोंच से अपने नियमों का निर्माण करने की आवश्यकता नहीं होती है, जो कि विकास से संबंधित कार्य अधिक है और इसलिए यहां-से-बाहर की गुंजाइश है, दूसरी पसंद अब तक सबसे सुरक्षित लगती है क्योंकि आप सुनिश्चित हैं कि एकमात्र बदलाव आपका होगा आसानी से बनाया गया।
वहाँ एक उपकरण बनाने के लिए एक परियोजना है जो आपको एक sepolicy
फ़ाइल को पुन: प्रयोज्य रूप में विघटित करने की अनुमति देता है, बीच में नियमों को स्वतंत्र रूप से संपादित करने की अनुमति देता है। हालांकि इस परियोजना को प्रूफ-ऑफ-कॉन्सेप्ट राज्य में छोड़ दिया गया है। आपको इस ब्लॉग पोस्ट के अंत में सभी जानकारी मिल जाएगी , बाकी लेख में पर्याप्त विवरण हैं जो किसी और को रुचि लेने की अनुमति देता है।
sepolicy
नियमों को बदलने के लिए वर्तमान में अनुशंसित तरीका एक और मार्ग है: सीधे sepolicy
बाइनरी फ़ाइल को संशोधित करके । sepolicy- इंजेक्शन उपकरण बस की अनुमति देता है और सक्रिय रूप से बनाए रखा जाता है।
पूर्णता के लिए, ध्यान दें कि इस उपकरण का एक कांटा मौजूद है। इसमें कुछ विशेषताएं शामिल हैं, उनमें से कुछ मूल लेखक की टू-डू सूची (एक नियम को हटाने की संभावना) की तरह हैं, मुझसे मत पूछें कि उन्होंने योगदान देने के बजाय कांटा क्यों चुना ...
संकलित और स्थापित करने के लिए sepolicy-inject
, बस अनुसरण करें:
cd ~/android/
git clone https://bitbucket.org/joshua_brindle/sepolicy-inject.git
cd ./sepolicy-inject/
LIBDIR=/usr/lib make
sudo cp ./sepolicy-inject /usr/bin/
उपयोग के मामले उदाहरण
उदाहरण के लिए मान लें कि आप निम्नलिखित त्रुटि संदेश से मेल खाते हुए ऑटोराइजेशन जोड़ना चाहते हैं:
avc: denied { read } for pid=128 comm="file-storage"
path="/data/media/0/path/to/some/file"
dev="mmcblk0p28" ino=811035 scontext=u:r:kernel:s0
tcontext=u:object_r:media_rw_data_file:s0 tclass=file permissive=0
आपको डिवाइस की बूट छवि प्राप्त करने की आवश्यकता होगी, फिर इसे sepolicy
फ़ाइल तक पहुंच प्राप्त करने के लिए इसे अनपैक करें ।
एक त्वरित जांच से sesearch
पता चलता है कि वास्तव में कोई अनुमति नहीं है नियम (अभी तक!):
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$
कमांड का कोई आउटपुट नहीं है।
फिर, आवश्यक नियम जोड़ने के लिए नीचे दिए गए कमांड का उपयोग करें ( मापदंडों sesearch
और sepolicy-inject
मापदंडों के बीच समानता पर ध्यान दें ):
sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy
अब हम अपने sesearch
आदेश को वापस बुला सकते हैं :
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$
sesearch
आउटपुट से पता चलता है कि पॉलिसी को सही तरीके से अपडेट किया गया है।
अब आप डिवाइस की boot.img
फ़ाइल को वापस ला सकते हैं और इसे डिवाइस पर वापस फ्लैश कर सकते हैं । /sepolicy
फ़ाइल के अंतिम संशोधन समय की जांच करना यह सुनिश्चित करने का एक आसान तरीका है कि आपका डिवाइस अब नई अपडेट की गई sepolicy
फ़ाइल चला रहा है ।
निष्कर्ष
अब आपके पास एक पूर्ण वातावरण होना चाहिए जिससे आप एंड्रॉइड डिवाइस SELinux नीतियों का स्वतंत्र रूप से निरीक्षण और संशोधन कर सकें। का आनंद लें! :)
साइड नोट के रूप में, डिवाइस से सीधे SELinux नीति का विश्लेषण और संशोधन करने की अनुमति देने वाले उपकरण भी हैं ।