ลองพัฒนาแอป Android

บทแนะนำนี้จะช่วยให้คุณลองพัฒนาระบบปฏิบัติการ Android เป็นครั้งแรก

ตั้งค่าสําหรับการพัฒนา Android

ก่อนดาวน์โหลดและสร้างสาขา main ของซอร์สโค้ด Android โปรดตรวจสอบว่าฮาร์ดแวร์ของคุณเป็นไปตามข้อกำหนดที่จำเป็นและติดตั้งซอฟต์แวร์ที่จำเป็นอย่างถูกต้องแล้ว นอกจากนี้ คุณควรทำความคุ้นเคยกับคำศัพท์ต่อไปนี้ด้วย

Git
Git เป็นระบบควบคุมเวอร์ชันแบบกระจายโอเพนซอร์สที่ใช้งานฟรี Android ใช้ Git สำหรับการดำเนินการในเครื่อง เช่น การแยกสาขา การคอมมิต การเปรียบเทียบ และการแก้ไข หากต้องการความช่วยเหลือในการเรียนรู้ Git โปรดดูเอกสารประกอบของ Git
Repo
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

ติดตั้ง Repo

ทำตามขั้นตอนต่อไปนี้เพื่อติดตั้ง Repo

  1. ดาวน์โหลดข้อมูลแพ็กเกจปัจจุบัน

    sudo apt-get update
  2. เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งตัวเปิด Repo

    sudo apt-get install repo

    ตัวเปิด Repo มีสคริปต์ Python ที่เริ่มต้นการตรวจสอบและดาวน์โหลดเครื่องมือ Repo แบบสมบูรณ์

    หากสำเร็จ ให้ข้ามไปยังขั้นตอนที่ 4

  3. (ไม่บังคับ) ติดตั้ง 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 คำสั่งแรกจะสร้างไฟล์ชั่วคราว ดาวน์โหลด Repo ลงในไฟล์ และตรวจสอบว่าคีย์ที่ระบุตรงกับคีย์ที่จำเป็น หากคำสั่งเหล่านี้ทำงานได้สำเร็จ คำสั่งสุดท้ายจะติดตั้งตัวเปิด Repo

  4. ยืนยันเวอร์ชันของเครื่องมือเปิด Repo

    repo version

    เอาต์พุตควรระบุเวอร์ชัน 2.4 ขึ้นไป เช่น

    repo launcher version 2.45

ดาวน์โหลดซอร์สโค้ด Android

แหล่งที่มาของ Android อยู่ในคอลเล็กชันที่เก็บ Git ที่โฮสต์โดย Google ที่เก็บ Git แต่ละแห่งจะมีประวัติทั้งหมดของซอร์สโค้ด Android รวมถึงการเปลี่ยนแปลงในซอร์สโค้ดและเวลาที่ทําการเปลี่ยนแปลง วิธีดาวน์โหลดซอร์สโค้ด Android

  1. ไปที่ไดเรกทอรีบ้าน

    cd ~
  2. สร้างไดเรกทอรีย่อยสำหรับใช้งานในเครื่องภายในไดเรกทอรีหลัก ดังนี้

    mkdir aosp
  3. ไปยังไดเรกทอรีด้วยคำสั่งต่อไปนี้

    cd aosp
  4. เริ่มต้นสาขาหลักของซอร์สโค้ดที่เก็บ AOSP (ค่าเริ่มต้น)

    repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
  5. ป้อนหรือยอมรับข้อมูลเข้าสู่ระบบ Git (ชื่อ อีเมล)

  6. ซิงค์ซอร์สโค้ดโดยทำดังนี้

    repo sync -c -j8

    หากพบปัญหาระหว่างการดาวน์โหลด โปรดดูหัวข้อแก้ปัญหาการซิงค์

บิลด์โค้ด

วิธีสร้างโค้ด

  1. จากภายในไดเรกทอรีที่ทำงานอยู่ ให้เรียกใช้สคริปต์ envsetup.sh เพื่อตั้งค่าสภาพแวดล้อมการสร้าง

    source build/envsetup.sh
  2. ระบุประเภทอุปกรณ์เป้าหมายที่จะสร้างด้วยคำสั่ง 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
    ============================================
    
  3. สร้างเป้าหมาย

    m

การสร้างครั้งแรกอาจใช้เวลาหลายชั่วโมง บิลด์ที่ตามมาจะใช้เวลาน้อยลงอย่างมาก เอาต์พุตของบิลด์จะปรากฏใน $OUT_DIR

เปิด Cuttlefish

Cuttlefish เป็นเครื่องจำลอง Android ที่ใช้ทดสอบบิลด์

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลด บิลด์ และติดตั้งแพ็กเกจ 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 กฎ

  2. วิธีเปิด Cuttlefish

    launch_cvd --daemon
    
  3. เชื่อมต่อกับอุปกรณ์ Cuttlefish โดยไปที่ https://localhost:8443 ในเว็บเบราว์เซอร์ อุปกรณ์เสมือนที่ใช้ Android จะปรากฏขึ้น

ทำการเปลี่ยนแปลง

อัปเดตซอร์สโค้ดตามตัวอย่าง changelist นี้

  1. จากรูทของการชำระเงิน (ไดเรกทอรี aosp/) ให้ไปที่ frameworks/nativeโปรเจ็กต์ Git โดยทำดังนี้

    cd frameworks/native
  2. เริ่มโปรเจ็กต์ชั่วคราวด้วยคำสั่งนี้

    repo start <some-name> .
  3. ใช้เครื่องมือแก้ไขเพื่อแก้ไข SurfaceFlinger.cpp ในตำแหน่งต่อไปนี้

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. ค้นหาบรรทัดนี้

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. เพิ่มบรรทัดนี้ที่จุดเริ่มต้นของ 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});
    
  6. สร้างโค้ดโดยใช้คำสั่งต่อไปนี้

    m
  7. อัปเดตบิลด์ในอุปกรณ์โดยทำดังนี้

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. ตรวจสอบว่าคุณเห็นการเปลี่ยนแปลงสีในอุปกรณ์ที่เลือกซึ่งคล้ายกับที่แสดงในรูปที่ 1

    ตัวอย่างการเปลี่ยนสีที่สำเร็จ

    รูปที่ 1 ลักษณะที่ปรากฏของหน้าจอหลังจากเปลี่ยนสีสำเร็จ

แก้ไขการทดสอบ

ส่วนนี้ของ Codelab ใช้การทดสอบตัวอย่างที่อยู่ในสคีมาซอร์สโค้ดและดำเนินการไม่สำเร็จ

หากต้องการเรียกใช้ แก้ไขข้อบกพร่อง และแก้ไขการทดสอบ ให้ทําตามวิธีการต่อไปนี้

  1. เรียกใช้

    atest DevCodelabTest

    การทดสอบไม่สำเร็จ

  2. ตรวจสอบสแต็กเทรซของการทดสอบที่ไม่ผ่าน

    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

  3. หากต้องการระบุตำแหน่งของการทดสอบที่จะแก้ไข ให้เพิ่ม 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

  4. แก้ไข platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java และแทนที่ Assert.assertTrue(false) ด้วย Assert.assertTrue(true)

  5. เรียกใช้การทดสอบอีกครั้งเพื่อยืนยันว่าคุณแก้ไขปัญหาแล้ว

    atest DevCodelabTest

อัปโหลดโค้ดเพื่อรับการตรวจสอบ

Repo ช่วยให้การใช้ Git ง่ายขึ้นด้วยการรวมคำสั่งต่างๆ เช่น git clone เพื่อทำงานกับที่เก็บ Git (หรือโปรเจ็กต์) หลายรายการพร้อมกัน

สำหรับการตรวจสอบโค้ดของโปรเจ็กต์ใน Git ให้ใช้ระบบตรวจสอบโค้ดบนเว็บของ Gerrit

  1. สมมติว่าคุณทำการเปลี่ยนแปลงในโปรเจ็กต์ frameworks/native ให้เรียกใช้คำสั่งต่อไปนี้เพื่ออัปโหลดการเปลี่ยนแปลง

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. ป้อนข้อความต่อไปนี้สำหรับข้อความคอมมิต

    Android codelab change
    Test: manual atest
    
  3. อัปโหลดการเปลี่ยนแปลง

    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 นี้

  1. ใน Gerrit ให้คลิกยกเลิก

  2. ยกเลิกการใช้ Branch ชั่วคราวที่เกี่ยวข้องในไดเรกทอรี frameworks/native project (หรือไดเรกทอรีย่อย) โดยทำดังนี้

    repo abandon codelab .
  3. เปลี่ยนการเปลี่ยนแปลงที่คุณทำในไฟล์ทดสอบกลับ เนื่องจากคุณไม่ได้เรียกใช้ 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 ของกระบวนการ