ครั้งแรกของทั้งหมดผมต้องยอมรับว่าผมอย่างเห็นด้วยกับคุณ"ฉันพบนี้น่างงงวยยากที่จะทำ"คำสั่ง Google ได้ออกแบบ Android เป็นหลักจากมุมมองของผู้บริโภคไม่ใช่สำหรับผู้ใช้ระดับสูง ผลก็คือทันทีที่คุณต้องการทำอะไรบางอย่างนอกเหนือจากการใช้แอพ Facebook ล่าสุดหรือเล่นกับ Candy Crush คุณจะพบว่าตัวเองกลับมาอย่างรวดเร็วในช่วงต้นปี 2000 Linux เมื่อจำเป็นต้องเปลี่ยนความรู้เหมือนนักพัฒนา สิ่งที่ควรมีการตั้งค่าที่เรียบง่าย ฉันเชื่อว่าสถานการณ์จะพัฒนาอย่างรวดเร็วเมื่อระบบ Android โตขึ้น แต่ตอนนี้เราต้องทำในสิ่งที่เรามี ...
ดังที่คุณกล่าวมีสองเหตุผลว่าทำไมจึงจำเป็นต้องรวบรวมชุดเครื่องมือ SELinux ของคุณ:
- ชุดเครื่องมือที่ระบบจัดเตรียมมักเป็นรุ่นที่อยู่ด้านหลัง แม้ว่า SELinux ของ Android จะใช้นโยบาย DB เวอร์ชัน 30 แต่กล่อง Linux ปัจจุบันมักจะรองรับเฉพาะเวอร์ชั่นสูงสุด 29 เท่านั้น
- แม้ว่ามันจะไม่นานมานี้มันก็ไม่ได้ช่วยในความเป็นจริงการสร้าง SELinux จากรหัสต้นน้ำ (ซึ่งทำได้ง่าย ๆ อย่างน้อยบนเครื่อง Fedora ตามคำแนะนำต้นน้ำ) ช่วยให้ระบบจัดการนโยบาย DB เวอร์ชัน 30 ได้อย่างมีประสิทธิภาพอย่างไรก็ตาม SELinux ของ Android แก้ไขอย่างหนัก ( เอกสารของ Googleเน้นการแก้ไขเล็กน้อย) ดังนั้นการพยายามจัดการ SELinux ของ Android จึงล้มเหลวเนื่องจากข้อผิดพลาดทางไวยากรณ์และการแยกวิเคราะห์
ดังนั้นเพื่อที่จะคงไว้ซึ่งภารกิจการวิเคราะห์ SELinux ของ Android เราจะต้องจัดการกับสิ่งสกปรก ... ด้วยวิธีที่สะอาดที่สุดเท่าที่จะเป็นไปได้:
- ก่อนอื่นเราจะตั้งค่าสภาพแวดล้อมที่มีสติ
- เมื่อเสร็จแล้วเราจะรวบรวมไลบรารี SELinux และเครื่องมือแรกของ Android
- ด้านบนของพวกเราจะสร้างเครื่องมือของ SELinux
- เราจะดำเนินการให้เสร็จสิ้นโดยการเพิ่มยูทิลิตี้เสริมบางอย่าง
ตั้งค่าสภาพแวดล้อมที่เหมาะสม
คุณสมบัติด้านสิ่งแวดล้อม
คำแนะนำที่สะอาดที่สุดวิธีการที่ใช้งานได้น่าเชื่อถือเพียงอย่างเดียวคือการอุทิศสภาพแวดล้อมในการทำงาน Android ของคุณ:
เครื่องเสมือนนั้นใช้ได้อย่างสมบูรณ์แบบ (หากไม่ใช่ตัวเลือกที่ดีที่สุด) ต้องการใช้ VMware เนื่องจากคุณจะต้องเชื่อมต่อโทรศัพท์ของคุณผ่าน USB เข้ากับระบบของแขก Qemu ทางเลือกฟรีดูเหมือนจะไม่สามารถจัดการกับงานดังกล่าวได้เป็นอย่างดี ฉันไม่ได้ลองกับซอฟต์แวร์การทำให้เป็นแบบอื่น
จะต้องเป็นระบบ 64 บิตมิฉะนั้นรหัสจะไม่รวบรวมเนื่องจากจำนวนเต็มเป็นขนาดที่ไม่ถูกต้อง
มันเป็นอย่างยิ่งที่แนะนำอาจจะบังคับใช้ระบบอูบุนตู รู้สึกฟรีที่จะใช้ Xubuntu แทนถ้าคุณชอบสภาพแวดล้อมเดสก์ทอปที่เบากว่าของ XFCE นี่จะไม่เปลี่ยนแกนหลักของระบบและแพ็คเกจที่มีอยู่และจะไม่มีผลกระทบต่องานที่เกี่ยวข้องกับ Android ของคุณ (สิ่งที่ฉันพูดเกี่ยวกับ Ubuntu ในขั้นตอนนี้จะใช้กับ Xubuntu) คุณอาจพบไฟล์ต้นไม้ ReadMe บางไฟล์ของ ReadMe ที่แนะนำให้ใช้ Fedora แทนต้นไม้เหล่านี้ SELinux ใน Android ไฟล์เหล่านี้สืบทอดมาจากโครงการ SELinux ต้นน้ำของ NSA และเนื้อหาของไฟล์นั้นไม่ตรงกับ Android ของ Google
เวอร์ชันที่แน่นอนของ Unbuntu ที่จะใช้ขึ้นอยู่กับรุ่นของ Android ที่คุณต้องการสร้าง สำหรับ Android 6.0 แนะนำให้ใช้ Ubuntu 14.04 (Trusty) ตรวจสอบหน้าข้อกำหนดของ Googleสำหรับข้อมูลเพิ่มเติม
คุณจะต้องใช้พื้นที่ดิสก์มากมาย (อย่างน้อย 50GB หากคุณวางแผนเฉพาะการตรวจสอบที่เกี่ยวข้องกับ SELinux อย่างน้อย 100GB หากคุณวางแผนสำหรับการสร้าง Android ที่สมบูรณ์) CPU และหน่วยความจำมีความเกี่ยวข้องน้อยกว่าพวกเขาเพียงส่งผลกระทบต่อเวลาสำหรับการสร้างเต็มรูปแบบและจะไม่มีผลกระทบที่แท้จริงสำหรับงานที่เกี่ยวข้องกับ SELinux
การใช้ Ubuntu มีข้อดีสองประการ:
โดยการใช้ระบบที่แนะนำคุณกำลังทำงานในสภาพแวดล้อมที่รู้จักกันดีและผ่านการทดสอบอย่างดี: ไลบรารีระบบเครื่องมือและแพ็คเกจต่าง ๆ อยู่ในเวอร์ชันและตำแหน่งที่โครงการคาดหวัง
และโดยเฉพาะอย่างยิ่งในกรณีปัจจุบันของเรา: Ubuntu เองอาศัย AppArmor ซึ่งเป็นทางเลือกของ SELinux ไม่ได้ใช้ SELinux ข่าวดีก็คือคุณจะสามารถติดตั้งเครื่องมือ SELinux และระบบไบนารีของ Android ได้โดยไม่ต้องเสี่ยงที่จะเปลี่ยนความน่าเชื่อถือของระบบ
ขั้นตอนการติดตั้งสภาพแวดล้อม
คุณสามารถติดตั้ง Ubuntu แบบดั้งเดิมโดยเริ่มจาก live-DVD แบบเต็มเปี่ยม แต่ทางเลือกที่เร็วกว่าคือการใช้การติดตั้ง netboot (ติดตั้งโหมดข้อความ) และเลือกสภาพแวดล้อมเดสก์ท็อปที่คุณต้องการในตอนท้าย การทำเช่นนั้นจะช่วยให้คุณประหยัดเวลาในการอัพเดทครั้งแรกโดยการติดตั้งเวอร์ชั่นแพคเกจที่เป็นปัจจุบันแทนการติดตั้งโปรแกรมล้าสมัยครั้งแรก
มาตรฐาน ISO สำหรับอูบุนตู / Xubuntu 14.04 (ISO เดียวกัน) ติดตั้ง netboot เป็นอยู่ที่นี่
หากต้องการข้ามของ VMware ลำบาก "ง่ายติดตั้งคุณลักษณะ" มันเป็นนิสัยที่ดีในการเริ่มต้นด้วยการเลือก"ฉันจะติดตั้งระบบปฏิบัติการภายหลัง"ตัวเลือก
อย่าลืมเลือกLinuxจากนั้นUbuntu 64 บิตเป็น guest OS
VM จะต้องการ ressources ต่อไปนี้:
- จำเป็น: พื้นที่ดิสก์ต้องมีอย่างน้อย 40GB (ค่าเริ่มต้น 20 GB จะไม่เพียงพอรหัสแหล่งเดียวจะใช้พื้นที่มากกว่านั้น) ขอแนะนำให้สูงกว่า บิลด์เต็มต้องใช้ดิสก์อย่างน้อย 100 GB นี่เป็นค่าที่ฉันมักจะใช้ อย่าลืมว่าการตั้งค่านี้เป็นเพียงขีด จำกัด สูงสุด: ขนาดที่แท้จริงของ VM จะเพิ่มขึ้นตามการร้องขอของแขก
- Facultative: เพิ่ม RAM จาก 1024 เป็นอย่างน้อย 2048 หรือสูงกว่า (ขึ้นอยู่กับความจุโฮสต์ของคุณฉันใช้ 4096)
- Facultative: เพิ่มจำนวนแกนประมวลผลจาก 1 เป็น 2 หรือสูงกว่า (ขึ้นอยู่กับความจุโฮสต์ของคุณฉันใช้ 3)
- CD-Rom จะต้องชี้ไปที่ไฟล์ ISO การติดตั้ง
- คุณอาจต้องการเปลี่ยน USB จากค่าเริ่มต้น 1.1 เป็น 2.0 เหมือนเดิมอาจให้คำเตือนเมื่อคุณเชื่อมต่ออุปกรณ์ของคุณ ทั้งนี้ขึ้นอยู่กับการใช้งานของคุณคุณยังสามารถยกเลิกได้อย่างปลอดภัย"เชื่อมต่อโดยอัตโนมัติอุปกรณ์ USB ใหม่"และ"อุปกรณ์บลูทู ธ แบ่งปันกับเครื่องเสมือน"
- คุณอาจต้องปรับการตั้งค่าการแสดงผล (ปิดการใช้งาน 3 มิติบังคับใช้ขนาดหน้าจอ) ทั้งนี้ขึ้นอยู่กับสภาพแวดล้อมของคุณ
เรียน
- หากคุณเลือกที่จะติดตั้ง netboot อย่าลืมเลือกสภาพแวดล้อมเดสก์ท็อปของคุณ ( เดสก์ท็อป UbuntuหรือXubuntu เดสก์ท็อป ) เมื่อมาถึงหน้าจอการเลือกซอฟต์แวร์หรือคุณจะจบลงด้วยสภาพแวดล้อมแบบข้อความอย่างเดียว!
- เมื่อบู๊ตครั้งแรกปฏิเสธที่จะอัพเกรดเป็นรีลีสล่าสุด: จุดทั้งหมดที่นี่อยู่ที่ 14.04!
เมื่อทำการบูทครั้งแรกสิ่งแรกที่คุณอาจต้องทำคือติดตั้ง Linux guest tools:
sudo apt-get install open-vm-tools
แพ็คเก็ตนี้ใช้ทริกเกอร์เวลาบูตดังนั้นการติดตั้งจะเสร็จสมบูรณ์หลังจากแขกรีสตาร์ท
ดึงรหัสต้นฉบับของ Android
ในขณะที่คล้ายกันรายละเอียดของกระบวนการขึ้นอยู่กับ ROM ที่เลือก:
- สำหรับ CyanogenMod ให้ค้นหาอุปกรณ์ของคุณ (เลือกผู้ขายก่อน) จากนั้นคลิกที่ลิงก์"วิธีสร้าง CyanogenMod"เพื่อรับคำแนะนำที่ถูกดัดแปลงสำหรับอุปกรณ์ของคุณ
- สำหรับ AOSP ปฏิบัติตามขั้นตอนที่เริ่มต้นที่นี่
เป็นเรื่องที่น่าสังเกตว่า CyanogeMod รวมอยู่ในแผนผังต้นไม้เป็นเครื่องมือที่ช่วยให้คุณสามารถคลายboot.img
ไฟล์ได้ หากต้องการบอกว่าแตกต่าง CyanogenMod มีเครื่องมือที่จะช่วยให้คุณเข้าถึงsepolicy
ไฟล์ที่เก็บไว้ในอุปกรณ์และที่เก็บ ROM AOSP ของ Google ไม่ได้จัดเตรียมเครื่องมือดังกล่าวดังนั้นหากคุณไม่มีความจำเป็นอื่น ๆ ด้วยการใช้ซอร์สต้นไม้ของ CyanogenMod อาจเป็นทางเลือกที่สะดวกที่สุดมิฉะนั้นคุณจะต้องติดตั้ง appart (ซึ่งรวดเร็วและง่ายต่อการทำ
นี่ฉันกำลังทำตามขั้นตอน CyanogenMod 13.0 (Android 6.0) คำอธิบายเกี่ยวกับคำสั่งที่ใช้มีอยู่ในหน้าต่างๆที่ลิงก์ด้านบน โปรดอ่านพวกเขา typescript ด้านล่างจะได้รับเพียงเพื่อวัตถุประสงค์ในการอ้างอิง
เคล็ดลับ:ในขณะที่ฉันใช้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
ตอนนี้คุณมีต้นไม้ต้นกำเนิดที่สะอาดและเกือบจะสมบูรณ์ Blob ที่เป็นกรรมสิทธิ์ขาดหายไป แต่คุณไม่ต้องการใช้งานที่เกี่ยวข้องกับ SELinux
คำแนะนำ: การดึงข้อมูลแหล่งที่มานั้นเป็นกระบวนการที่น่าเบื่ออาจเป็นไปได้ที่จะทำสแน็ปช็อตหรือสำรองข้อมูล VM ของคุณในตอนนี้
รวบรวมและติดตั้งชุดเครื่องมือและไลบรารี SELinux ของ Android
ตอนนี้ส่วนที่ตลกของการเดินทางจะเริ่มขึ้น;)!
จนถึงตอนนี้ขั้นตอนควรจะตรงไปตรงมาสวย เป้าหมายส่วนใหญ่คือเพื่อให้แน่ใจว่าคุณมีสภาพแวดล้อมเดียวกันกับฉัน ถ้าคุณทำภาคต่อควรตรงไปตรงมาเช่นกัน
ภายใต้ประทุนของ Google อย่าลังเลที่จะใช้การเปลี่ยนแปลงที่ลึกกับซอร์สโค้ดของ Android ระหว่างรุ่นดังนั้นขั้นตอนการรวบรวมที่แน่นอนจะขึ้นอยู่กับรุ่นแน่นอน (เช่น AOSP ต้นแบบแสดงให้เห็นว่าsepolicy/
ไดเรกทอรีจะถูกย้าย )
ฉันจะแชร์ขั้นตอนที่แน่นอนของฉันในการรวบรวมและติดตั้งไลบรารีและชุดเครื่องมือ SElinux ของ Android แต่เพื่อให้ความเกี่ยวข้องของโพสต์นี้เมื่อเวลาผ่านไปฉันจะเพิ่มบันทึกเกี่ยวกับวิธีทั่วไปในการติดตามเพื่อแก้ไขปัญหาการรวบรวมส่วนใหญ่
ขั้นตอนทีละขั้นตอน
ไลบรารี SELinux ของ Android จัดเตรียมเลเยอร์ abstraction ซึ่งจะอนุญาตให้ซอฟต์แวร์เลเยอร์ชั้นบนจัดการกับไฟล์นโยบาย SELinux เฉพาะสำหรับ Android ดังนั้นเราจะต้องรวบรวมและติดตั้งมันก่อน (ซึ่งจริงๆแล้วมันหมายถึงแกนกลางหากเกิดความยากลำบากที่นี่จนกว่าคุณจะพบทางของคุณ)
จากนั้นเราจะสามารถสร้างและติดตั้งเครื่องมือ SELinux ได้ อย่างที่เราจะเห็นว่าโชคดีที่สิ่งเหล่านี้ไม่จำเป็นต้องเป็น Android โดยเฉพาะพวกเขาจำเป็นต้องจับคู่กับเวอร์ชันไลบรารี 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
Makefile ไม่สามารถค้นหาบางไลบรารีได้ คุณต้องแก้ไข Makefile นี้เพื่อใช้เส้นทางที่สร้างขึ้นแบบไดนามิกโดยpkg-config
แทนที่ฮาร์ดโค้ด (อย่าสับสน backticks ด้วยเครื่องหมายคำพูดเดียว!):
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
อย่าลังเลที่จะเปิด 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 มีให้ในรูปแบบที่สร้างไว้ล่วงหน้าซึ่งประกอบด้วย:
- สคริปต์ Python (และตัวห่อสคริปต์เชลล์) ภายใน
$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 สั่งเท่านั้นที่จะแชร์รหัสหากมีการแก้ไข) ดังนั้นเราจะต้องเดาและพยายามทำอย่างดีที่สุดเท่าที่จะทำได้ .
เครื่องมือเหล่านี้คือสคริปต์ Python นี่เป็นวิวัฒนาการใหม่จาก SETools 4 (ใน SETools 3 คำสั่งเช่นsesearch
นั้นเป็นรหัสปฏิบัติการไบนารีใน C) อย่างไรก็ตามเครื่องมือเองยังคงแสดงรุ่น 3.3.8:
$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8
ดังนั้นฉันเดาว่า Google เอาภาพรวมการพัฒนาจาก SETools 4 ไปก่อนจนถึง 4.0.0 beta SETools อาศัยlibsepol
เวอร์ชัน 2.4 โดยมีการเปิดตัว 4.0.0 พวกเขาเริ่มพึ่งพาไลบรารีเวอร์ชัน 2.5 ซึ่งไม่เข้ากันกับเวอร์ชันของ SELinux ที่รวมอยู่ใน Android 6.0 (คุณสามารถลองรวบรวมได้มันจะล้มเหลว)
ตัวเลือกที่ฉลาดที่สุดน่าจะเป็นไปได้กับ SETools 4.0.0 Beta
ติดตั้งการพึ่งพาเพิ่มเติม:
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/
เนื่องจากข้อผิดพลาดที่มีผลต่อ Flex 2.5 เราจำเป็นต้องลบออก-Wredundant-decls
จากแฟล็กของคอมไพเลอร์:
sed -i '/-Wredundant-decls/d' ./setup.py
และในที่สุดก็รวบรวมและติดตั้ง:
python ./setup.py build
sudo python ./setup.py install
ขั้นตอนทั่วไป (หรือ "วิธีถอดตัวเอง")
ในกรณีที่ขั้นตอนข้างต้นไม่ได้ผลในกรณีของคุณนี่คือมุมมองระดับที่สูงขึ้นเกี่ยวกับวิธีการพยายามดำเนินการ
ไม่มีเวทมนตร์ที่น่าเศร้า (และไม่มีผู้ช่วย :() ที่นี่: วิธีเดียวที่จะได้รหัสนี้เพื่อคอมไพล์คือวิธี "ลองแล้วดู" แบบคลาสสิคที่น่าสะพรึงกลัว
ลองรวบรวมครั้งแรกมันอาจจะล้มเหลวมากที่สุดเนื่องจาก*.h
ไม่พบไฟล์บางไฟล์:
ค้นหาในexternal/
ไดเรกทอรีของ Android :
find $ANDROID_BUILD_TOP/external -name filename.h
หากคุณพบไฟล์ที่ร้องขอหมายความว่ามีการรวมไลบรารีหรือเครื่องมือรุ่นที่ระบุไว้ในซอร์สโค้ด Android ดังนั้นคุณไม่ควรลองติดตั้งจากระบบแพ็คเกจของ Ubuntu แต่ให้คอมไพล์และติดตั้งเวอร์ชั่นที่รวมอยู่ในซอร์สโค้ด Android แทน
โปรดทราบว่าสิ่งนี้ขัดกับคำแนะนำทั่วไปที่คุณอาจพบในฟอรัม: "การรวบรวมของคุณล้มเหลวเนื่องจากห้องสมุดนี้หายไปหรือไม่ติดตั้งแพคเกจนี้แล้วมันจะไม่เป็นไร!" โดยการทำเช่นนี้คุณอาจจะพบปัญหาที่แย่กว่านี้: หากมีการรวมรุ่นที่เฉพาะเจาะจงอาจเป็นเพราะต้องการรุ่นที่เฉพาะเจาะจง (เนื่องจากปัญหาความเข้ากันได้หรือเนื่องจากรุ่นนี้มีการเปลี่ยนแปลงเฉพาะจาก Google)
BTW หากคุณสงสัย: แน่นอนว่าไลบรารีหรือเครื่องมือนี้อาจมีการอ้างอิงเพิ่มข้อผิดพลาดเนื่องจาก*.h
ไม่พบไฟล์บางไฟล์และใช่คุณควรใช้วิธีการ "ลองและดู" แบบวนรอบเดียวกันนี้
ค้นหา systemwide:
find / -name filename.h 2>/dev/null
หากคุณพบว่า "หายไป" ไฟล์ที่จะมีอยู่ในระบบของคุณในบางตำแหน่งของไลบรารีแบบแบ่งใช้มาตรฐานหมายความว่าการพึ่งพานี้อาจพบได้ในสภาพแวดล้อมของคุณแล้ว แต่ Makefile ที่ยกข้อผิดพลาดนั้นเป็นใบ้เกินไป
หากคุณเรียกใช้ 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
หากมีแพ็คเกจในที่เก็บของ Ubuntu ที่ให้ไฟล์นี้apt-file
ควรจะสามารถค้นหาได้
เมื่อคุณได้พบแพคเกจที่เหมาะสมติดตั้งโดยใช้apt-get install packagename
ที่packagename
เป็นชื่อแพคเกจของคุณ
เคล็ดลับ:apt-get reinstall pkg_name
หากคุณเมาบางสิ่งบางอย่างในระบบของคุณคำสั่งเพื่อติดตั้งแพคเกจนี้เป็นหนึ่ง: มันจะทำงานได้แม้ว่าจะไม่สามารถลบและติดตั้งแบบคลาสสิกได้เนื่องจากการทำลายการพึ่งพา (ซึ่งเป็นไปได้มากที่สุดสำหรับไลบรารีของระบบ)
เครื่องมือเสริม
ในขั้นตอนนี้คุณควรมีสภาพแวดล้อมที่สะอาดช่วยให้คุณสามารถตรวจสอบกฎ SELinux ของ Android ทั้งในรูปแบบที่คอมไพล์และแหล่งที่มา
อย่างไรก็ตามโอกาสส่วนใหญ่คือเมื่อสิ้นสุดการสอบสวนคุณจะต้องดำเนินการบางอย่าง ในรูปร่างปัจจุบันสภาพแวดล้อมของคุณจะไม่อนุญาตให้คุณแก้ไขsepolicy
ไฟล์ของอุปกรณ์ อันที่จริงแล้วไฟล์นี้ไม่สามารถแทนที่ได้ง่าย: มันเป็นส่วนหนึ่งของไดเรกทอรีรากของอุปกรณ์และเนื้อหาของไดเรกทอรีรากนั้นเป็นตัวแยกไฟล์ในเวลาบูตจากไฟล์ดิสก์ RAM ซึ่งจะถูกเก็บไว้ในอิมเมจสำหรับบูตของอุปกรณ์
ดังนั้นคุณยังคงพลาดสองสิ่งก่อนที่สภาพแวดล้อมของคุณจะเสร็จสมบูรณ์:
- วิธีเข้าถึงและแก้ไขอิมเมจสำหรับบูตของอุปกรณ์
- วิธีแก้ไข
sepolicy
ไฟล์
โชคดีที่สิ่งเหล่านี้เป็นหัวข้อสองส่วนสุดท้ายของโพสต์นี้อย่างแม่นยำ! :)
ดึงและอัปเดตอิมเมจสำหรับบูตของอุปกรณ์
เครื่องมือในการดึงและอัปเดตอิมเมจสำหรับบูตของอุปกรณ์สามารถนำไปใช้กับสิ่งต่าง ๆ ได้หลากหลายนอกเหนือจากกฎของ SELinux ที่ดัดแปลง ฉันได้สร้างคำตอบเฉพาะโปรดอ้างอิง
แก้ไขกฎ SELinux ของอุปกรณ์
คุณมีความเป็นไปได้หลักสองประการที่นี่:
- สร้าง
sepolicy
ไฟล์ใหม่จากกฎในแผนผังแหล่งที่มาของคุณ (ค้นหา.te
ไฟล์เพื่อค้นหา: ไฟล์เหล่านั้นfind $ANDROID_BUILD_TOP -name \*.te
จะถูกกระจายไปยังหลายไดเรกทอรี)
- แก้ไข
sepolicy
ไฟล์ที่อุปกรณ์ใช้ในปัจจุบัน
เว้นแต่คุณจะต้องสร้างกฎตั้งแต่เริ่มต้นซึ่งเป็นงานที่เกี่ยวข้องกับการพัฒนามากกว่าและอยู่นอกขอบเขตที่นี่ตัวเลือกที่สองดูเหมือนจะไกลที่สุดเท่าที่ปลอดภัยที่สุดเนื่องจากคุณแน่ใจว่าการเปลี่ยนแปลงเพียงอย่างเดียวจะเป็นของคุณ ทำอย่างชัดเจน
มีโครงการที่สร้างเครื่องมือที่ช่วยให้คุณสามารถถอดรหัสsepolicy
ไฟล์เป็นรูปแบบที่สามารถคอมไพล์ได้อีกครั้งซึ่งช่วยให้สามารถแก้ไขกฎได้อย่างอิสระ อย่างไรก็ตามโครงการนี้ถูกละทิ้งในสถานะการพิสูจน์แนวคิด คุณจะพบข้อมูลทั้งหมดที่ส่วนท้ายของโพสต์บล็อกส่วนที่เหลือของบทความนี้มีรายละเอียดเพียงพอที่จะอนุญาตให้ใครก็ตามที่สนใจเข้ามาครอบครอง
วิธีที่แนะนำในการเปลี่ยนsepolicy
กฎไปในเส้นทางอื่น: โดยการแก้ไขsepolicy
ไบนารีไฟล์โดยตรง เครื่องมือsepolicy-injectอนุญาตเพียงแค่นั้นและได้รับการบำรุงรักษาอย่างแข็งขัน
เพื่อความสมบูรณ์โปรดทราบว่ามีส้อมของเครื่องมือนี้อยู่ มันเพิ่มคุณสมบัติบางอย่างบางอย่างอยู่ในรายการที่ต้องทำของผู้เขียนดั้งเดิม (เช่นความเป็นไปได้ที่จะลบกฎ) อย่าถามฉันว่าทำไมพวกเขาเลือกที่จะแยกแทนการบริจาค ...
ในการรวบรวมและติดตั้ง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
ไฟล์ที่อัพเดตใหม่
ข้อสรุป
ตอนนี้คุณควรมีสภาพแวดล้อมที่สมบูรณ์ช่วยให้คุณสามารถตรวจสอบและปรับเปลี่ยนอุปกรณ์ Android SELinux ได้อย่างอิสระ สนุก! :)
ตามบันทึกข้างนอกจากนี้ยังมีเครื่องมือที่ช่วยให้การวิเคราะห์และปรับเปลี่ยนนโยบาย SELinux จากเครื่องได้โดยตรง