บทแนะนำนี้จะช่วยให้คุณลองพัฒนาระบบปฏิบัติการ Android เป็นครั้งแรก
ตั้งค่าสําหรับการพัฒนา Android
ก่อนดาวน์โหลดและสร้างสาขา main
ของแหล่งที่มา Android โปรดตรวจสอบว่าฮาร์ดแวร์เป็นไปตามข้อกำหนดที่จำเป็นและได้ติดตั้งซอฟต์แวร์ที่จำเป็นอย่างถูกต้องแล้ว นอกจากนี้ คุณควรทำความคุ้นเคยกับคำศัพท์ต่อไปนี้ด้วย
- Git
- Git เป็นระบบควบคุมเวอร์ชันแบบโอเพนซอร์สที่ใช้งานฟรีและเป็นโอเพนซอร์ส Android ใช้ Git สำหรับการดำเนินการในเครื่อง เช่น การแยกสาขา การคอมมิต การเปรียบเทียบ และการแก้ไข หากต้องการความช่วยเหลือในการเรียนรู้ Git โปรดดูเอกสารประกอบของ Git
- ที่เก็บ
- Repo คือ Wrapper ของ Python สำหรับ Git ที่ช่วยลดความซับซ้อนของการดำเนินการที่ซับซ้อนในที่เก็บ Git หลายแห่ง Repo ไม่ได้มาแทนที่ Git สำหรับการดำเนินการควบคุมเวอร์ชันทั้งหมด แต่ช่วยให้การดำเนินการที่ซับซ้อนของ Git ทำได้ง่ายขึ้นเท่านั้น Repo ใช้ไฟล์ Manifest เพื่อรวบรวมโปรเจ็กต์ Git ไว้ในโปรเจ็กต์ Android หลัก
- ไฟล์ Manifest
- ไฟล์ Manifest คือไฟล์ XML ที่ระบุตำแหน่งของโปรเจ็กต์ Git ต่างๆ ในซอร์สโค้ด Android ภายในลําดับชั้นซอร์สโค้ด AOSP
ข้อกำหนดของฮาร์ดแวร์ Meet
เวิร์กสเตชันสำหรับการพัฒนาควรเป็นไปตามข้อกำหนดด้านฮาร์ดแวร์ต่อไปนี้หรือมากกว่า
ระบบ x86 64 บิต
พื้นที่ว่างในดิสก์อย่างน้อย 400 GB สำหรับการชำระเงินและสร้างโค้ด (250 GB สำหรับการชำระเงิน + 150 GB สำหรับสร้าง)
RAM อย่างน้อย 64 GB Google ใช้เครื่อง 72 คอร์ที่มี RAM 64 GB เพื่อสร้าง Android เมื่อใช้การกำหนดค่าฮาร์ดแวร์นี้ การสร้าง Android แบบสมบูรณ์จะใช้เวลาประมาณ 40 นาที และการสร้าง Android แบบเพิ่มประสิทธิภาพจะใช้เวลาเพียงไม่กี่นาที ในทางตรงกันข้าม การสร้างแบบสมบูรณ์จะใช้เวลาประมาณ 6 ชั่วโมงโดยใช้เครื่อง 6 คอร์ที่มี RAM 64 GB
มีคุณสมบัติตรงตามข้อกำหนดของระบบปฏิบัติการ
เวิร์กสเตชันสำหรับการพัฒนาต้องใช้งานระบบปฏิบัติการ Linux 64 บิตที่มี GNU C Library (glibc) 2.17 ขึ้นไป
ติดตั้งแพ็กเกจที่จำเป็น
หากต้องการติดตั้งแพ็กเกจที่จำเป็นสำหรับ Ubuntu 18.04 หรือใหม่กว่า ให้เรียกใช้คำสั่งต่อไปนี้
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
ติดตั้งซอฟต์แวร์ที่จำเป็น
คุณต้องติดตั้ง OpenJDK, Make, Python 3 และ Repo ก่อนจึงจะทำงานกับ AOSP ได้ สาขาหลักของ AOSP ของ Android มาพร้อมกับ OpenJDK, Make และ Python 3 เวอร์ชันที่สร้างไว้ล่วงหน้า คุณจึงไม่ต้องดำเนินการติดตั้งเพิ่มเติม ส่วนต่อไปนี้จะอธิบายวิธีติดตั้งที่เก็บ
ติดตั้ง Repo
ทำตามขั้นตอนต่อไปนี้เพื่อติดตั้งที่เก็บ
ดาวน์โหลดข้อมูลแพ็กเกจปัจจุบัน
sudo apt-get update
เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งตัวเปิด Repo
sudo apt-get install repo
ตัวเปิด Repo มีสคริปต์ Python ที่จะเริ่มต้นการตรวจสอบและดาวน์โหลดเครื่องมือ Repo แบบสมบูรณ์
หากสำเร็จ ให้ข้ามไปยังขั้นตอนที่ 4
(ไม่บังคับ) ติดตั้ง Repo ด้วยตนเองโดยใช้ชุดคำสั่งต่อไปนี้
export REPO=$(mktemp /tmp/repo.XXXXXXXXX) curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo
คำสั่ง 3 รายการแรกจะตั้งค่าไฟล์ชั่วคราว ดาวน์โหลดที่เก็บไปยังไฟล์ และตรวจสอบว่าคีย์ที่ระบุตรงกับคีย์ที่ต้องใช้ หากคำสั่งเหล่านี้สำเร็จ คำสั่งสุดท้ายจะติดตั้ง Launcher ของที่เก็บ
ตรวจสอบเวอร์ชันของเครื่องมือเปิด Repo
repo version
เอาต์พุตควรระบุเวอร์ชัน 2.4 ขึ้นไป เช่น
repo launcher version 2.45
ดาวน์โหลดซอร์สโค้ด Android
แหล่งที่มาของ Android อยู่ในคอลเล็กชันที่เก็บ Git ที่โฮสต์โดย Google ที่เก็บ Git แต่ละรายการจะมีประวัติทั้งหมดของแหล่งที่มาของ Android ซึ่งรวมถึงการเปลี่ยนแปลงต้นทางและเวลาที่ทำการเปลี่ยนแปลง วิธีดาวน์โหลดซอร์สโค้ด Android
ไปที่ไดเรกทอรีบ้าน
cd ~
สร้างไดเรกทอรีย่อยที่ใช้งานอยู่ภายในเครื่อง โดยทำดังนี้
mkdir aosp
ไปที่ไดเรกทอรีโดยทำดังนี้
cd aosp
เริ่มต้นสาขาหลักของซอร์สโค้ดที่เก็บ AOSP (ค่าเริ่มต้น)
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
ป้อนหรือยอมรับข้อมูลเข้าสู่ระบบ Git ของคุณ (ชื่อ, อีเมล)
ซิงค์ซอร์สโค้ด
repo sync -c -j8
หากพบปัญหาระหว่างการดาวน์โหลด โปรดดูหัวข้อแก้ปัญหาและแก้ไขปัญหาการซิงค์
บิลด์โค้ด
วิธีสร้างโค้ดมีดังนี้
จากภายในไดเรกทอรีการทำงาน ให้ค้นหาสคริปต์
envsetup.sh
เพื่อตั้งค่าสภาพแวดล้อมของบิลด์source build/envsetup.sh
ระบุประเภทอุปกรณ์เป้าหมายที่จะสร้างด้วยคำสั่ง
lunch
เป้าหมายคือการเปลี่ยนรูปแบบอุปกรณ์ เช่น รุ่นหรือรูปแบบที่เฉพาะเจาะจง ระบุเป้าหมายนี้lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
คุณควรเห็นเรื่องย่อของเป้าหมายและสภาพแวดล้อมของบิลด์:
============================================ PLATFORM_VERSION_CODENAME=VanillaIceCream PLATFORM_VERSION=VanillaIceCream PRODUCT_INCLUDE_TAGS=com.android.mainline TARGET_PRODUCT=aosp_arm TARGET_BUILD_VARIANT=eng TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=generic HOST_OS=linux HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete HOST_CROSS_OS=windows BUILD_ID=AOSP.MAIN OUT_DIR=out ============================================
สร้างเป้าหมาย
m
การสร้างครั้งแรกอาจใช้เวลาหลายชั่วโมง บิลด์ที่ตามมาจะใช้เวลาน้อยลงอย่างมาก เอาต์พุตของบิลด์จะปรากฏใน
$OUT_DIR
เปิด Cuttlefish
Cuttlefish เป็นเครื่องจำลอง Android ที่ใช้ทดสอบบิลด์
เรียกใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลด บิลด์ และติดตั้งแพ็กเกจ Debian ของโฮสต์
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
for dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd done
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot
การรีบูตจะทริกเกอร์การติดตั้งโมดูลเคอร์เนลเพิ่มเติมและใช้
udev
กฎเปิด Cuttlefish
launch_cvd --daemon
เชื่อมต่อกับอุปกรณ์ Cuttlefish โดยไปที่
https://localhost:8443
ในเว็บเบราว์เซอร์ อุปกรณ์เสมือนที่ใช้ Android จะปรากฏขึ้น
ทำการเปลี่ยนแปลง
อัปเดตซอร์สโค้ดตาม changelist ตัวอย่างนี้
จากรูทของการชำระเงิน (ไดเรกทอรี
aosp/
) ให้ไปที่frameworks/native
โปรเจ็กต์ Git โดยทำดังนี้cd frameworks/native
เริ่มโปรเจ็กต์ชั่วคราวด้วยคำสั่งนี้
repo start <some-name> .
ใช้เครื่องมือแก้ไขเพื่อแก้ไข
SurfaceFlinger.cpp
ที่ตำแหน่งต่อไปนี้aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
ค้นหาบรรทัดนี้
void SurfaceFlinger::updateColorMatrixLocked() {
เพิ่มบรรทัดนี้ที่จุดเริ่มต้นของ
updateColorMatrixLocked()
mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f}, vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
สร้างโค้ดด้วยคำสั่งต่อไปนี้
m
อัปเดตบิลด์ในอุปกรณ์โดยทำดังนี้
adb root
adb remount -R
adb root
adb sync
adb reboot
ตรวจสอบว่าคุณเห็นการเปลี่ยนแปลงสีในอุปกรณ์ที่เลือกซึ่งคล้ายกับที่แสดงในรูปที่ 1
รูปที่ 1 ลักษณะของหน้าจอหลังจากเปลี่ยนสีเรียบร้อยแล้ว
แก้ไขการทดสอบ
ส่วนนี้ของ Codelab ใช้การทดสอบตัวอย่างที่อยู่ในสคีมาซอร์สโค้ดและดำเนินการไม่สำเร็จ
หากต้องการเรียกใช้ แก้ไขข้อบกพร่อง และแก้ไขการทดสอบ ให้ทำตามวิธีการต่อไปนี้
เรียกใช้
atest DevCodelabTest
การทดสอบไม่สำเร็จ
ตรวจสอบสแต็กเทรซของการทดสอบที่ไม่ผ่าน
STACKTRACE: java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)
บรรทัดสุดท้ายของสแต็กเทรซแสดงการทดสอบที่ไม่สําเร็จ (
testHelloWorld
) การทดสอบนี้อยู่ในไฟล์ชื่อDevCodelabTest.java
หากต้องการระบุตำแหน่งของการทดสอบที่จะแก้ไข ให้เพิ่ม
WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/
ต่อท้ายบรรทัดสุดท้ายของสแต็กเทรซจนถึงชื่อไฟล์ทดสอบ ดังนั้นandroid.test.example.devcodelab.DevCodelabTest
จะกลายเป็นWORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
แก้ไข
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
และแทนที่Assert.assertTrue(false)
ด้วยAssert.assertTrue(true)
ทำการทดสอบอีกครั้งเพื่อยืนยันว่าคุณได้แก้ไขปัญหาแล้ว
atest DevCodelabTest
อัปโหลดโค้ดเพื่อรับการตรวจสอบ
Repo ช่วยให้การใช้ Git ง่ายขึ้นด้วยการรวมคำสั่งต่างๆ เช่น git clone
เพื่อทำงานกับที่เก็บ Git (หรือโปรเจ็กต์) หลายรายการพร้อมกัน
สำหรับการตรวจสอบโค้ดของโปรเจ็กต์ใน Git ให้ใช้ระบบตรวจสอบโค้ดบนเว็บของ Gerrit
สมมติว่าคุณทำการเปลี่ยนแปลงในโปรเจ็กต์
frameworks/native
ให้เรียกใช้คำสั่งต่อไปนี้เพื่ออัปโหลดการเปลี่ยนแปลงcd frameworks/native
repo start codelab .
git add .
git commit
ป้อนข้อความต่อไปนี้สำหรับข้อความคอมมิต
Android codelab change Test: manual atest
อัปโหลดการเปลี่ยนแปลง
repo upload
หากดำเนินการสำเร็จ คุณจะเห็นข้อความที่คล้ายกับข้อความนี้
Upload project frameworks/native/ to remote branch main: branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android codelab change to https://android-review.googlesource.com/ (y/N)? y remote: Processing changes: refs: 1, new: 1, done remote: remote: SUCCESS remote: remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] codelab -> refs/for/main
ดูการเปลี่ยนแปลงใน Gerrit
หากต้องการดูการเปลี่ยนแปลงใน Gerrit ให้ไปที่เอาต์พุตลิงก์ในเทอร์มินัล โดยลิงก์จะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
เปลี่ยนกลับการเปลี่ยนแปลง
โดยปกติแล้ว หลังจากการทดสอบและการตรวจสอบและอนุมัติแล้ว คุณจะส่งการเปลี่ยนแปลงใน Gerrit และผสานเข้ากับที่เก็บข้อมูล ตามวัตถุประสงค์ของ Codelab นี้แทน ให้เปลี่ยนกลับงานของคุณ
ใน Gerrit ให้คลิกยกเลิก
ละทิ้ง Branch ชั่วคราวที่เกี่ยวข้องในไดเรกทอรีของโปรเจ็กต์
frameworks/native
(หรือไดเรกทอรีย่อย)repo abandon codelab .
เปลี่ยนการเปลี่ยนแปลงที่คุณทำในไฟล์ทดสอบกลับ เนื่องจากคุณไม่ได้เรียกใช้
repo start
,git commit
และrepo upload
ในการเปลี่ยนแปลงการทดสอบ คุณจึงรีเซ็ตไฟล์ได้ สมมติว่าคุณอยู่ในaosp/platform_testing directory
ให้ใช้คำสั่งต่อไปนี้เพื่อรีเซ็ตไฟล์git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .
ขั้นตอนนี้จะทำให้ Codelab สำหรับการพัฒนาแพลตฟอร์ม Android เสร็จสมบูรณ์
รับความช่วยเหลือ
หากพบข้อผิดพลาดระหว่างที่ใช้ Codelab นี้ โปรดรายงานโดยใช้ลิงก์เครื่องมือติดตามปัญหาที่ด้านล่างของหน้าใดก็ได้ ส่งคำถามไปยังกลุ่ม android-building
พิมพ์ ps -A | grep crosvm
เพื่อดูว่า crosvm
ทำงานอยู่หรือไม่ หาก crossvm
ทำงานอยู่ ให้พิมพ์กระบวนการ stop_cvd || true
หรือ kill crosvm
พร้อม PID ของกระบวนการ