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

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

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

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

Git
Git เป็นระบบควบคุมเวอร์ชันแบบกระจายที่ใช้งานได้ฟรีและเป็นโอเพนซอร์ส Android ใช้ Git สำหรับการดำเนินการในเครื่อง เช่น การแยกสาขา การคอมมิต การเปรียบเทียบ และการแก้ไข หากต้องการความช่วยเหลือในการเรียนรู้ Git โปรดดูที่เอกสารประกอบของ Git
Repo
Repo เป็น Wrapper ของ Git ที่เขียนด้วย Python ซึ่งช่วยลดความซับซ้อนในการดำเนินการที่ซับซ้อนในที่เก็บ Git หลายรายการ Repo ไม่ได้มาแทนที่ Git สำหรับการดำเนินการควบคุมเวอร์ชันทั้งหมด แต่จะช่วยให้การดำเนินการ Git ที่ซับซ้อนทำได้ง่ายขึ้น Repo ใช้ไฟล์ Manifest เพื่อรวมโปรเจ็กต์ Git ไว้ในโปรเจ็กต์หลักของ Android
ไฟล์ Manifest
ไฟล์ Manifest เป็นไฟล์ XML ที่ระบุตำแหน่งของโปรเจ็กต์ Git ต่างๆ ในซอร์สโค้ดของ Android ภายในโครงสร้างซอร์สโค้ดของ AOSP

มีคุณสมบัติตรงตามข้อกำหนดของฮาร์ดแวร์

เวิร์กสเตชันสำหรับการพัฒนาควรมีคุณสมบัติตรงตามหรือสูงกว่าข้อกำหนดของฮาร์ดแวร์ต่อไปนี้

  • ระบบ x86 64 บิต

  • พื้นที่ว่างในดิสก์อย่างน้อย 400 GB สำหรับเช็กเอาต์และสร้างโค้ด (250 GB สำหรับเช็กเอาต์ + 150 GB สำหรับสร้าง)

  • RAM อย่างน้อย 64 GB Google ใช้เครื่อง 72 คอร์ที่มี RAM 64 GB เพื่อสร้าง Android การกำหนดค่าฮาร์ดแวร์นี้จะใช้เวลาประมาณ 40 นาทีในการสร้าง Android แบบเต็ม และใช้เวลาเพียงไม่กี่นาทีในการสร้าง Android แบบเพิ่ม ในทางตรงกันข้าม การสร้างแบบเต็มด้วยเครื่อง 6 คอร์ที่มี RAM 64 GB จะใช้เวลาประมาณ 6 ชั่วโมง

มีคุณสมบัติตรงตามข้อกำหนดของระบบปฏิบัติการ

เวิร์กสเตชันสำหรับการพัฒนาต้องใช้ Linux Distribution 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 ได้ สาขาเวอร์ชันล่าสุดของ 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 (android-latest-release)

    repo init --partial-clone -b android-latest-release -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_only_phone-aosp_current-userdebug

    คุณควรเห็นข้อมูลสรุปของเป้าหมายและสภาพแวดล้อมของบิลด์

    ============================================
    PLATFORM_VERSION_CODENAME=Baklava
    PLATFORM_VERSION=Baklava
    TARGET_PRODUCT=aosp_cf_x86_64_only_phone
    TARGET_BUILD_VARIANT=userdebug
    TARGET_ARCH=x86_64
    TARGET_ARCH_VARIANT=silvermont
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.10.11-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=BP1A.250305.020
    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/) ให้ไปที่โปรเจ็กต์ Git frameworks/native

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

    repo start PROJECT_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 PROJECT_NAME.
    git add .
    git commit
  2. สำหรับข้อความคอมมิต ให้ป้อนข้อความต่อไปนี้

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

    repo upload

    หากดำเนินการสำเร็จ คุณจะเห็นข้อความที่คล้ายกับข้อความต่อไปนี้

    Upload project frameworks/native/ to remote branch android17-release:
     branch PROJECT_NAME. ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android PROJECT_NAME. 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 PROJECT_NAME. change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          PROJECT_NAME. -> refs/for/android17-release
    

ดูการเปลี่ยนแปลงใน Gerrit

หากต้องการดูการเปลี่ยนแปลงใน Gerrit ให้ไปที่ลิงก์เอาต์พุตในเทอร์มินัล ลิงก์จะมีลักษณะคล้ายกับลิงก์ต่อไปนี้

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

เปลี่ยนกลับการเปลี่ยนแปลง

โดยปกติแล้ว หลังจากการทดสอบและเมื่อได้รับการตรวจสอบและอนุมัติ คุณจะส่งการเปลี่ยนแปลงใน Gerrit และผสานการเปลี่ยนแปลงนั้นลงในที่เก็บ แต่สำหรับ Codelab นี้ ให้เปลี่ยนกลับงานของคุณโดยทำดังนี้

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

  2. ยกเลิกสาขาชั่วคราวที่เชื่อมโยงในไดเรกทอรีโปรเจ็กต์ frameworks/native (หรือไดเรกทอรีย่อย)

    repo abandon PROJECT_NAME.
  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 นี้ โปรดรายงานข้อผิดพลาดโดยใช้ ลิงก์ Issue Tracker ที่ด้านล่างของหน้าใดก็ได้ ส่งคำถามไปยังกลุ่ม android-building

พิมพ์ ps -A | grep crosvm เพื่อดูว่า crosvm ทำงานอยู่หรือไม่ หาก crossvm กำลัง ทำงานอยู่ ให้พิมพ์ stop_cvd || true หรือ kill crosvm กระบวนการด้วย PID ของกระบวนการ