Thử phát triển Android

Hướng dẫn này giúp bạn thử phát triển hệ điều hành Android lần đầu tiên.

Thiết lập để phát triển Android

Trước khi tải xuống và tạo nhánh kê khai android-latest-release của nguồn Android, hãy đảm bảo rằng phần cứng của bạn đáp ứng các yêu cầu cần thiếtphần mềm bắt buộc được cài đặt đúng cách. Bạn cũng cần nắm rõ các thuật ngữ sau:

Git
Git là một hệ thống quản lý phiên bản phân tán, miễn phí và mã nguồn mở. Android sử dụng Git cho các thao tác cục bộ như phân nhánh, cam kết, chênh lệch và chỉnh sửa. Để được trợ giúp tìm hiểu về Git, hãy tham khảo tài liệu về Git.
Repo
Repo là một trình bao bọc Python cho Git, giúp đơn giản hoá việc thực hiện các thao tác phức tạp trên nhiều kho lưu trữ Git. Repo không thay thế Git cho tất cả các thao tác kiểm soát phiên bản, mà chỉ giúp bạn dễ dàng hoàn thành các thao tác Git phức tạp. Repo sử dụng các tệp kê khai để tổng hợp các dự án Git thành siêu dự án Android.
tệp kê khai
Tệp kê khai là một tệp XML chỉ định vị trí của nhiều dự án Git trong nguồn Android trong một cây nguồn AOSP.

Yêu cầu về thiết bị Meet

Máy trạm phát triển của bạn phải đáp ứng hoặc vượt quá các yêu cầu sau về phần cứng:

  • Hệ thống x86 64 bit.

  • Ổ đĩa cần có ít nhất 400 GB dung lượng trống để kiểm tra và tạo mã (250 GB để kiểm tra + 150 GB để tạo).

  • RAM tối thiểu 64 GB. Google sử dụng các máy có 72 lõi và RAM 64 GB để tạo Android. Với cấu hình phần cứng này, quá trình tạo bản dựng đầy đủ của Android mất khoảng 40 phút và chỉ mất vài phút để tạo bản dựng gia tăng của Android. Ngược lại, quá trình tạo bản dựng đầy đủ sẽ mất khoảng 6 giờ trên một máy 6 lõi có RAM 64 GB.

Đáp ứng các yêu cầu về hệ điều hành

Máy trạm phát triển của bạn phải chạy bất kỳ bản phân phối Linux 64 bit nào có GNU C Library (glibc) 2.17 trở lên.

Cài đặt các gói bắt buộc

Để cài đặt các gói bắt buộc cho Ubuntu 18.04 trở lên, hãy chạy lệnh sau:

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

Cài đặt phần mềm bắt buộc

Để có thể làm việc với AOSP, bạn phải cài đặt OpenJDK, Make, Python 3 và Repo. Nhánh phát hành mới nhất của Android đi kèm với các phiên bản dựng sẵn của OpenJDK, Make và Python 3, nên bạn không cần thực hiện các bước cài đặt bổ sung. Phần tiếp theo giải thích cách cài đặt Repo.

Cài đặt Repo

Làm theo các bước sau để cài đặt Repo:

  1. Tải thông tin gói hiện tại xuống:

    sudo apt-get update
  2. Chạy lệnh sau để cài đặt trình chạy Repo:

    sudo apt-get install repo

    Trình chạy Repo cung cấp một tập lệnh Python giúp khởi động quy trình thanh toán và tải toàn bộ công cụ Repo xuống.

    Nếu thành công, hãy chuyển sang bước 4.

  3. (không bắt buộc) Cài đặt Repo theo cách thủ công bằng cách dùng chuỗi lệnh sau:

    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

    Ba lệnh đầu tiên thiết lập một tệp tạm thời, tải Repo xuống tệp và xác minh rằng khoá được cung cấp khớp với khoá bắt buộc. Nếu các lệnh này thành công, lệnh cuối cùng sẽ cài đặt trình chạy Repo.

  4. Xác minh phiên bản Repo launcher:

    repo version

    Đầu ra phải cho biết phiên bản 2.4 trở lên, ví dụ:

    repo launcher version 2.45

Tải nguồn Android xuống

Nguồn Android nằm trong một tập hợp các kho lưu trữ Git do Google lưu trữ. Mỗi kho lưu trữ Git đều bao gồm toàn bộ nhật ký nguồn Android, bao gồm cả các thay đổi đối với nguồn và thời điểm thực hiện các thay đổi. Cách tải nguồn Android xuống:

  1. Chuyển đến thư mục chính:

    cd ~
  2. Tạo một thư mục con đang hoạt động trên máy trong thư mục đó:

    mkdir aosp
  3. Chuyển đến thư mục:

    cd aosp
  4. Khởi động nhánh phát hành mới nhất của mã nguồn kho lưu trữ AOSP (android-latest-release):

    repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest
  5. Nhập hoặc chấp nhận thông tin đăng nhập Git (tên, địa chỉ email).

  6. Đồng bộ hoá mã nguồn:

    repo sync -c -j8

    Nếu bạn gặp vấn đề trong quá trình tải xuống, hãy tham khảo bài viết Khắc phục vấn đề về đồng bộ hoá.

Tạo mã

Cách tạo mã:

  1. Trong thư mục làm việc, hãy tìm tập lệnh envsetup.sh để thiết lập môi trường xây dựng:

    source build/envsetup.sh
  2. Chỉ định một loại thiết bị mục tiêu để tạo bằng lệnh lunch. Mục tiêu là một hoán vị thiết bị, chẳng hạn như một kiểu máy hoặc hệ số hình dạng cụ thể. Chỉ định mục tiêu này:

    lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug

    Bạn sẽ thấy bản tóm tắt về mục tiêu và môi trường xây dựng:

    ============================================
    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. Tạo mục tiêu:

    m

Theo dự kiến, bản dựng đầu tiên sẽ mất nhiều giờ. Các bản dựng tiếp theo sẽ mất ít thời gian hơn đáng kể. Đầu ra của bản dựng sẽ xuất hiện trong $OUT_DIR.

Khởi chạy Cuttlefish

Cuttlefish là trình mô phỏng Android được dùng để kiểm thử các bản dựng của bạn.

  1. Chạy các lệnh sau để tải xuống, tạo và cài đặt các gói Debian trên máy chủ:

    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

    Thao tác khởi động lại sẽ kích hoạt quá trình cài đặt các mô-đun kernel bổ sung và áp dụng các quy tắc udev.

  2. Khởi chạy Cuttlefish:

    launch_cvd --daemon
    
  3. Kết nối với thiết bị Cuttlefish bằng cách chuyển đến https://localhost:8443 trong trình duyệt web. Thiết bị ảo chạy Android sẽ xuất hiện.

Thực hiện thay đổi

Cập nhật mã nguồn theo danh sách thay đổi này.

  1. Từ gốc của quá trình kiểm xuất (thư mục aosp/), hãy chuyển đến dự án frameworks/native Git:

    cd frameworks/native
  2. Bắt đầu một dự án tạm thời bằng lệnh sau:

    repo start <some-name> .
  3. Sử dụng trình chỉnh sửa để chỉnh sửa SurfaceFlinger.cpp tại vị trí sau:

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. Tìm dòng này:

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. Thêm dòng này vào đầu 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. Tạo mã:

    m
  7. Cập nhật bản dựng trên thiết bị:

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. Xác minh rằng bạn thấy màu sắc thay đổi trên thiết bị đã chọn, tương tự như những gì xuất hiện trong Hình 1.

    Ví dụ về một lần thay đổi màu thành công

    Hình 1. Giao diện màn hình sau khi đổi màu thành công

Khắc phục một bài kiểm tra

Phần này của lớp học lập trình sử dụng một ví dụ về kiểm thử nằm trong cây nguồn và đang không thành công.

Để chạy, gỡ lỗi và khắc phục vấn đề trong kiểm thử, hãy làm theo các hướng dẫn sau:

  1. Chạy:

    atest DevCodelabTest

    Thử nghiệm không thành công.

  2. Kiểm tra dấu vết ngăn xếp của chương trình kiểm thử không thành công:

    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)

    Dòng cuối cùng của dấu vết ngăn xếp cho thấy kiểm thử không đạt (testHelloWorld). Kiểm thử này nằm trong một tệp có tên là DevCodelabTest.java.

  3. Để xác định vị trí của kiểm thử cần sửa, hãy thêm WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/ vào dòng cuối cùng của dấu vết ngăn xếp cho đến khi bao gồm tên của tệp kiểm thử. Vì vậy, android.test.example.devcodelab.DevCodelabTest trở thành WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java.

  4. Chỉnh sửa platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java và thay thế Assert.assertTrue(false) bằng Assert.assertTrue(true)

  5. Chạy lại bài kiểm thử để xác minh rằng bạn đã khắc phục vấn đề:

    atest DevCodelabTest

Tải mã của bạn lên để xem xét

Repo đơn giản hoá việc sử dụng Git bằng cách kết hợp các lệnh như git clone để hoạt động trên nhiều kho lưu trữ Git (hoặc dự án) cùng một lúc.

Để xem xét mã của các dự án trong Git, hãy sử dụng hệ thống xem xét mã dựa trên web Gerrit.

  1. Giả sử bạn đã thực hiện các thay đổi trong dự án frameworks/native, hãy chạy các lệnh sau để tải các thay đổi lên:

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. Đối với thông báo cam kết, hãy nhập nội dung sau:

    Android codelab change
    Test: manual atest
    
  3. Tải nội dung thay đổi lên:

    repo upload

    Nếu thành công, bạn sẽ thấy một thông báo tương tự như sau:

    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
    

Xem thay đổi của bạn trong Gerrit

Để xem thay đổi của bạn trong Gerrit, hãy chuyển đến đường liên kết đầu ra trong thiết bị đầu cuối. Đường liên kết này tương tự như sau:

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

Huỷ bỏ thay đổi

Thông thường, sau khi kiểm thử và được xem xét cũng như phê duyệt, bạn sẽ gửi nội dung thay đổi của mình trong Gerrit và hợp nhất nội dung đó vào kho lưu trữ. Thay vào đó, trong phạm vi của lớp học lập trình này, hãy huỷ các thay đổi của bạn:

  1. Trong Gerrit, hãy nhấp vào Huỷ.

  2. Huỷ bỏ nhánh tạm thời được liên kết trong thư mục dự án frameworks/native (hoặc các thư mục con của thư mục này):

    repo abandon codelab .
  3. Huỷ bỏ các thay đổi mà bạn đã thực hiện đối với tệp kiểm thử. Vì bạn không chạy repo start, git commitrepo upload trên thay đổi kiểm thử, nên bạn có thể đặt lại chính tệp đó. Giả sử bạn đang ở trong aosp/platform_testing directory, hãy dùng lệnh sau để đặt lại tệp:

    git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .

Đến đây là kết thúc lớp học lập trình về phát triển nền tảng Android.

Nhận trợ giúp

Nếu bạn gặp lỗi trong quá trình thực hiện lớp học lập trình này, hãy báo cáo lỗi bằng cách sử dụng đường liên kết Công cụ theo dõi lỗi ở cuối trang bất kỳ. Gửi câu hỏi cho nhóm android-building.

Nhập ps -A | grep crosvm để xem crosvm đã chạy hay chưa. Nếu crossvm đang chạy, hãy nhập quy trình stop_cvd || true hoặc kill crosvm có PID quy trình.