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

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

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

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

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

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

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

  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)

    บรรทัดสุดท้ายของ Stack Trace แสดงการทดสอบที่ไม่ผ่าน (testHelloWorld) การทดสอบนี้อยู่ในไฟล์ชื่อ DevCodelabTest.java

  3. หากต้องการระบุตำแหน่งของการทดสอบที่จะแก้ไข ให้ต่อท้าย WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/ ที่บรรทัดสุดท้ายของ Stack Trace จนถึงและรวมถึงชื่อของไฟล์ การทดสอบ ดังนั้น 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 android16-release:
     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/android16-release
    

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

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

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

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

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

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

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

    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 ของกระบวนการ