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

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

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

ก่อนที่จะดาวน์โหลดและสร้างสาขาไฟล์ Manifest android-latest-release ของแหล่งที่มา 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 คอร์ที่มี RAM ขนาด 64 GB จะใช้เวลาประมาณ 6 ชั่วโมง

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

เวิร์กสเตชันการพัฒนาของคุณต้องใช้การแจกจ่าย 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

ติดตั้งซอฟต์แวร์ที่จำเป็น

ก่อนที่จะทำงานกับ AOSP ได้ คุณต้องติดตั้ง OpenJDK, Make, Python 3 และ Repo สาขาการเผยแพร่ล่าสุดของ Android มาพร้อมกับ OpenJDK, Make และ Python 3 เวอร์ชันที่สร้างไว้ล่วงหน้า คุณจึงไม่ต้องทำตามขั้นตอนการติดตั้งเพิ่มเติม ส่วนต่อไปนี้จะอธิบายวิธีติดตั้ง Repo

ติดตั้ง Repo

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

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

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

    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 Launcher

  4. ยืนยันเวอร์ชันของ Repo Launcher โดยทำดังนี้

    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
    tools/buildutils/build_packages.sh
    sudo apt install -y ./cuttlefish-base_*.deb ./cuttlefish-user_*.deb
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot

    การรีบูตจะทริกเกอร์การติดตั้งโมดูลเคอร์เนลเพิ่มเติมและใช้กฎ udev

  2. หลังจากเวิร์กสเตชันรีบูตแล้ว ให้ไปที่ไดเรกทอรี aosp ตั้งค่าสภาพแวดล้อมของบิลด์ แล้วเปิด Cuttlefish โดยทำดังนี้

    cd ~/aosp
    source build/envsetup.sh
    lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug
    launch_cvd --daemon
  3. เชื่อมต่อกับอุปกรณ์ Cuttlefish โดยไปที่ https://localhost:8443 ในเว็บเบราว์เซอร์ อุปกรณ์เสมือนที่ทำงานด้วยระบบ Android จะแสดงขึ้น

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

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

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

    cd frameworks/native
  2. เริ่ม Branch ชั่วคราวด้วยคำสั่งนี้

    repo start BRANCH_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. ตรวจสอบว่าคุณเห็นการเปลี่ยนสีในอุปกรณ์ที่เลือก

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

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

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

    repo upload

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

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

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

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

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

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

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

  1. ใน Gerrit ให้คลิก Abandon

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

    repo abandon BRANCH_NAME .
  3. เปลี่ยนกลับการเปลี่ยนแปลงที่คุณทำกับไฟล์ทดสอบ เนื่องจากคุณไม่ได้เรียกใช้ repo start, git commit และ repo upload ในการเปลี่ยนแปลงการทดสอบ คุณจึงรีเซ็ตไฟล์ได้ สมมติว่าคุณอยู่ในไดเรกทอรี aosp/platform_testing ให้ใช้คำสั่งต่อไปนี้เพื่อรีเซ็ตไฟล์

    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 ทำงานอยู่แล้วหรือไม่ หาก crosvm กำลังทำงานอยู่ ให้พิมพ์กระบวนการ stop_cvd || true หรือ kill crosvm พร้อม PID ของกระบวนการ