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 main
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ết và phần mềm cần thiết đượ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 phối nguồn mở và miễn phí. Android sử dụng Git cho các thao tác cục bộ như phân nhánh, xác nhận, so sánh và chỉnh sửa. Để được trợ giúp về cách tìm hiểu Git, hãy tham khảo tài liệu về Git.
- Kho lưu trữ
- Repo là một trình bao bọc Python dựa trên 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 thực hiện các thao tác phức tạp trong Git. Repo sử dụng các tệp kê khai để tổng hợp các dự án Git vào siêu dự án Android.
- tệp kê khai
- Tệp kê khai là một tệp XML chỉ định vị trí đặt nhiều dự án Git trong nguồn Android trong cây nguồn AOSP (Dự án nguồn mở Android).
Đáp ứng các yêu cầu về phần cứng
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 về phần cứng sau:
Hệ thống x86 64 bit.
Tối thiểu 400 GB dung lượng ổ đĩa trống để thanh toán và tạo mã (250 GB để thanh toán + 150 GB để tạo bản dựng).
RAM tối thiểu là 64 GB. Google sử dụng máy 72 nhân với 64 GB RAM để xây dựng Android. Với cấu hình phần cứng này, bạn sẽ mất khoảng 40 phút để tạo một bản dựng Android đầy đủ và chỉ mất vài phút để tạo một bản dựng Android tăng dần. Ngược lại, một bản dựng đầy đủ trên máy 6 nhân có 64 GB RAM sẽ mất khoảng 6 giờ.
Đá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ó Thư viện GNU C (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
Trước khi có thể làm việc với AOSP, bạn phải cài đặt OpenJDK, Make, Python 3 và Repo. Nhánh chính AOSP của Android đi kèm với các phiên bản tạo sẵn của OpenJDK, Make và Python 3, vì vậy, bạn không cần thực hiện thêm các bước cài đặt. Phần sau đây 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:
Tải thông tin gói hiện tại xuống:
sudo apt-get update
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 khởi chạy quy trình thanh toán và tải công cụ Repo đầy đủ xuống.
Nếu thành công, hãy chuyển sang bước 4.
(không bắt buộc) Cài đặt Repo theo cách thủ công bằng loạt 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.
Xác minh phiên bản trình chạy Repo:
repo version
Kết quả sẽ 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 bao gồm toàn bộ nhật ký của 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:
Chuyển đến thư mục gốc:
cd ~
Tạo một thư mục con cục bộ đang hoạt động trong đó:
mkdir aosp
Chuyển đến thư mục:
cd aosp
Khởi tạo nhánh chính của mã nguồn kho lưu trữ AOSP (mặc định):
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
Nhập hoặc chấp nhận thông tin xác thực Git (tên, địa chỉ email).
Đồ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 sự cố đồng bộ hoá.
Tạo mã
Cách tạo mã:
Từ trong thư mục đang làm việc, hãy tìm nguồn tập lệnh
envsetup.sh
để thiết lập môi trường bản dựng:source build/envsetup.sh
Chỉ định 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 mẫu hoặc hệ số hình dạng cụ thể. Chỉ định mục tiêu này:lunch aosp_cf_x86_64_phone-trunk_staging-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=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 ============================================
Tạo mục tiêu:
m
Quá trình tạo bản dựng đầu tiên sẽ mất vài giờ. Các bản dựng tiếp theo sẽ mất ít thời gian hơn đáng kể. Kết quả của bản dựng sẽ xuất hiện trong $OUT_DIR
.
Phóng to mực ống
Cuttlefish là trình mô phỏng Android dùng để kiểm thử bản dựng.
Chạy các lệnh sau để tải xuống, tạo và cài đặt các gói Debian của máy chủ lưu trữ:
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 việc cài đặt các mô-đun nhân bổ sung và áp dụng các quy tắc
udev
.Phóng to mực ống:
launch_cvd --daemon
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ị Android ảo của bạn sẽ xuất hiện.
Thực hiện thay đổi
Cập nhật mã nguồn theo danh sách thay đổi mẫu này.
Từ gốc của trang thanh toán (thư mục
aosp/
), hãy chuyển đến dự án Gitframeworks/native
:cd frameworks/native
Bắt đầu một dự án tạm thời bằng lệnh sau:
repo start <some-name> .
Sử dụng trình chỉnh sửa của bạn để chỉnh sửa
SurfaceFlinger.cpp
ở vị trí sau:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
Tìm dòng này:
void SurfaceFlinger::updateColorMatrixLocked() {
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});
Tạo mã:
m
Cập nhật bản dựng trên thiết bị:
adb root
adb remount -R
adb root
adb sync
adb reboot
Xác minh rằng bạn thấy sự thay đổi về màu sắc trên thiết bị đã chọn tương tự như trong Hình 1.
Hình 1. Giao diện màn hình sau khi thay đổi màu thành công
Khắc phục kiểm thử
Phần này của lớp học lập trình sử dụng một bài kiểm thử mẫu trong cây nguồn và đang không đạt.
Để chạy, gỡ lỗi và khắc phục kiểm thử, hãy làm theo các hướng dẫn sau:
Chạy:
atest DevCodelabTest
Kiểm thử không thành công.
Kiểm tra dấu vết ngăn xếp của 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 thành công (
testHelloWorld
). Kiểm thử này nằm trong tệp có tênDevCodelabTest.java
.Để xác định vị trí của kiểm thử cần khắc phục, hãy nối
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, bao gồm cả tên của tệp kiểm thử. Vì vậy,android.test.example.devcodelab.DevCodelabTest
sẽ trở thànhWORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
.Chỉnh sửa
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
và thay thếAssert.assertTrue(false)
bằngAssert.assertTrue(true)
Chạy lại kiểm thử để xác minh rằng bạn đã khắc phục được vấn đề:
atest DevCodelabTest
Tải mã lên để xem xét
Repo đơn giản hoá việc sử dụng Git bằng cách nhóm các lệnh như git clone
để hoạt động trên nhiều kho lưu trữ (hoặc dự án) Git 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.
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
Đối với thông báo cam kết của bạn, hãy nhập như sau:
Android codelab change Test: manual atest
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 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
Xem thay đổi của bạn trong Gerrit
Để xem thay đổi trong Gerrit, hãy chuyển đến dữ liệu đầu ra của đường liên kết trong dòng lệnh. Đường liên kết 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ử, xem xét và phê duyệt, bạn sẽ gửi nội dung thay đổi 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ỷ bỏ công việc của bạn:
Trong Gerrit, hãy nhấp vào Thoát.
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 đó):repo abandon codelab .
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 commit
vàrepo 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 ởaosp/platform_testing directory
, hãy sử 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 .
Như vậy là bạn đã hoàn tất 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 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 đến nhóm android-building.
Nhập ps -A | grep crosvm
để xem crosvm
có đang chạy hay không. Nếu crossvm
đang chạy, hãy nhập quy trình stop_cvd || true
hoặc kill crosvm
với PID của quy trình.