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 tệp 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ế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 tán, miễn phí và có 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, khác biệt 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.
- Kho lưu trữ
- Repo là một trình bao bọc Python xung quanh 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 quản lý phiên bản; Repo chỉ giúp bạn dễ dàng thực hiện các thao tác Git phức tạp. Repo sử dụng 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í của nhiều dự án Git trong nguồn Android trong cây nguồn AOSP.
Đáp ứng 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.
Dung lượng ổ đĩa trống tối thiểu là 400 GB để 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 máy 72 lõi có RAM 64 GB để 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 đầy đủ của Android 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 đủ bằng máy 6 nhân có RAM 64 GB sẽ mất khoảng 6 giờ.
Đáp ứng 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 fontconfigCài đặt phần mềm cần thiết
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 phát hành mới nhất của Android đi kèm với các phiên bản OpenJDK, Make và Python 3 tạo sẵn, 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 updateChạy lệnh sau để cài đặt trình chạy Repo:
sudo apt-get install repoTrình chạy Repo cung cấp một tập lệnh Python khởi chạy quy trình kiểm tra 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.
Không bắt buộc: Cài đặt Repo theo cách thủ công bằng chuỗi lệnh sau:
export REPO=$(mktemp /tmp/repo.XXXXXXXXX)curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repogpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repoBa 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 versionKết quả đầ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 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 mã nguồn Android xuống:
Chuyển đến thư mục gốc:
cd ~Tạo một thư mục con đang làm việc trên máy trong thư mục đó:
mkdir aospChuyển đến thư mục:
cd aospKhởi chạy 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/manifestNhập hoặc chấp nhận thông tin đăng nhập Git (tên, địa chỉ email).
Đồng bộ hoá mã nguồn:
repo sync -c -j8Nế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ố và giải quyết vấn đề đồng bộ hoá.
Tạo mã
Cách tạo bản dựng mã:
Trong thư mục đang hoạt động, hãy lấy tập lệnh
envsetup.shđể thiết lập môi trường tạo bản dựng:source build/envsetup.shChỉ đị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 kiểu máy hoặc kiểu dáng cụ thể. Chỉ định mục tiêu này:lunch aosp_cf_x86_64_only_phone-aosp_current-userdebugBạn sẽ thấy thông tin tóm tắt về mục tiêu và môi trường tạo bản 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 ============================================Tạo mục tiêu:
m
Quá trình tạo bản dựng đầu tiên có thể 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.
Khởi chạy Cuttlefish
Cuttlefish là trình mô phỏng Android dùng để kiểm thử các bản dựng của bạn.
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 curlgit clone https://github.com/google/android-cuttlefishcd android-cuttlefishtools/buildutils/build_packages.shsudo apt install -y ./cuttlefish-base_*.deb ./cuttlefish-user_*.debsudo usermod -aG kvm,cvdnetwork,render $USERsudo rebootThao tác khởi động lại sẽ kích hoạt quá trình cài đặt các mô-đun nhân bổ sung và áp dụng các quy tắc
udev.Sau khi máy trạm khởi động lại, hãy chuyển đến thư mục
aosp, thiết lập môi trường tạo bản dựng và chạy Cuttlefish:cd ~/aospsource build/envsetup.shlunch aosp_cf_x86_64_only_phone-aosp_current-userdebuglaunch_cvd --daemonKết nối với thiết bị Cuttlefish bằng cách chuyển đến
https://localhost:8443trong 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 mẫu này.
Từ thư mục gốc của quy trình thanh toán (thư mục
aosp/), hãy chuyển đến dự án Gitframeworks/native:cd frameworks/nativeBắt đầu một nhánh tạm thời bằng lệnh sau:
repo start BRANCH_NAME .Sử dụng trình chỉnh sửa để chỉnh sửa
SurfaceFlinger.cpptại vị trí sau:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cppTì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ã:
mCập nhật bản dựng trên thiết bị:
adb rootadb remount -Radb rootadb syncadb rebootXác minh rằng bạn thấy màu sắc thay đổi trên thiết bị đã chọn.
Sửa lỗi 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à không thành công. Để chạy, gỡ lỗi và khắc phục lỗi kiểm thử, hãy làm theo các hướng dẫn sau:
Chạy:
atest DevCodelabTestKiể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 chương trình kiểm thử không thành công (
testHelloWorld). Chương trình kiểm thử này nằm trong một tệp có tên làDevCodelabTest.java.Để xác định vị trí của kiểm thử cần khắc phục, 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 tên của tệp kiểm thử (bao gồm cả tên tệp). Vì vậy,android.test.example.devcodelab.DevCodelabTesttrở 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.javavà thay thếAssert.assertTrue(false)bằngAssert.assertTrue(true).Chạy lại chương trình kiểm thử để xác minh rằng bạn đã khắc phụ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 gộp 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ã chạy trên nền tảng 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/nativerepo start BRANCH_NAME .git add .git commitĐối với thông báo cam kết, hãy nhập nội dung sau:
Android BRANCH_NAME change Test: manual atestTải nội dung thay đổi lên:
repo uploadNế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 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
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 dòng lệnh. Đườ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 của bạn
Thông thường, sau khi kiểm thử, xem xét và phê duyệt, bạn sẽ gửi thay đổi của mình trong Gerrit và hợp nhất thay đổi đó 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 Abandon (Huỷ bỏ).
Huỷ 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 BRANCH_NAME .Huỷ bỏ các thay đổi bạn đã thực hiện đối với tệp kiểm thử. Vì bạn không chạy
repo start,git commitvàrepo uploadtrê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 thư mụcaosp/platform_testing, hãy dùng các lệnh sau để đặt lại tệp:git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javagit checkout .
Đến đây là 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 đường liên kết Trình 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 crosvm đang chạy, hãy nhập quy trình stop_cvd || true hoặc kill crosvm có PID quy trình.