Lớp học lập trình dành cho nhà phát triển Android

Bạn có thể giúp phát triển hệ điều hành được cài đặt rộng rãi nhất trong lịch sử Trái Đất. Vâng, bạn đang ở đây để bắt đầu hành trình trở thành kỹ sư nền tảng Android.

Mặc dù hành trình này đầy thách thức, nhưng nhóm Android luôn nỗ lực đơn giản hoá hành trình của bạn trong mỗi bản phát hành. Và nhóm cải tiến mỗi ngày thông qua tính năng trực tiếp hoạt động trong Dự án nguồn mở Android (AOSP).

Vì vậy, hãy ngồi lại, khởi động một cửa sổ dòng lệnh và cùng tạo nên lịch sử.

Mục tiêu

Sứ mệnh của lớp học lập trình này có 2 phần:

  1. Để giúp bạn hiểu sơ qua về quy trình làm việc của nhà phát triển giống như các kỹ sư Android làm việc trên nền tảng (hệ điều hành).
  2. Bạn nên cung cấp ý kiến phản hồi về các công cụ, tài liệu và quy trình làm việc của nhà phát triển trên Android.

Điều kiện tiên quyết

Danh sách các yêu cầu đối với lớp học lập trình này được lấy từ danh sách các yêu cầu chung phát triển nền tảng (AOSP). Để tham gia lớp học lập trình này, hãy thiết lập những nội dung sau:

Môi trường

Thông thường, người dùng xây dựng và phát triển trực tiếp trên máy trạm. Vì bạn có thể hoạt động trong nhiều thiết bị đầu cuối và nhiều lệnh được sử dụng là dành riêng cho thiết bị đầu cuối, bạn sẽ cần chạy lại chúng trong mỗi phiên hoạt động đầu cuối. Cụ thể, các lệnh này bao gồm lệnh source build/envsetup.shlunch.

Thiết lập máy trạm

  1. Cài đặt các gói cần thiết trên máy trạm.
  2. Khi vẫn ở trong thiết bị đầu cuối, hãy cài đặt Repo và lấy thông tin đăng nhập vào tất cả các kho lưu trữ Git.

Khởi chạy và đồng bộ hoá mã

  1. Chuyển đến thư mục gốc:

    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 tạo nhánh chính của mã nguồn kho lưu trữ AOSP (mặc định):

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

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

    repo sync -j8

Quá trình đồng bộ hoá ban đầu có thể mất một giờ hoặc lâu hơn.

Mỗi lượt thanh toán kho lưu trữ được biểu thị bằng một tệp kê khai. Bạn có thể cho phép thực hiện nhiều lần thanh toán repo cùng một lúc, miễn là tồn tại trong các thư mục riêng biệt. Tuy nhiên, lưu ý rằng mỗi lần kiểm tra và tạo bản dựng sẽ tiêu tốn khoảng 300 GB (và ngày càng tăng), vì vậy, hãy giới hạn ở 2 lần kiểm tra kho lưu trữ hoặc tăng cường hệ thống bằng một ổ đĩa phụ.

Tạo mã

Để tạo Android, bạn phải chọn 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 phép hoán vị thiết bị, chẳng hạn như kiểu máy hoặc kiểu dáng cụ thể.

Mục tiêu thiết bị aosp_cf_x86_64_phone-userdebug cho phép bạn để tạo thiết bị Android ảo Cuttlefish cho thử nghiệm mà không cần thiết bị thực.

Để tạo và cập nhật một thiết bị thực, hãy chọn một mục tiêu khác và làm theo hướng dẫn về cách cài đặt ROM cho thiết bị.

  1. Thiết lập môi trường để tạo thiết bị Android bằng cách chạy lệnh sau từ thư mục gốc của quy trình thanh toán mã nguồn:

    source build/envsetup.sh
  2. Truyền mục tiêu bản dựng đến lệnh lunch, như sau:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
  3. Tạo mã từ bất kỳ nơi nào trong thanh toán bằng:

    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ể.

Chạy Cuttlefish

Cuttlefish là trình mô phỏng Android dùng để kiểm thử bản dựng.

  1. Nếu chưa từng cài đặt Cuttlefish, bạn phải cài đặt các phần phụ thuộc Cuttlefish cần thiết. Trong cửa sổ dòng lệnh, hãy chạy các lệnh sau để tải xuống, tạo và cài đặt các gói Debian 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.

  2. Chạy Cuttlefish:

    launch_cvd --daemon
    
  3. Kết nối với thiết bị Mực nang bằng cách di chuyển đến https://localhost:8443 trong trình duyệt web của bạn. Bạn sẽ được chào đón bằng một luồng video về ứng dụng Android mà bạn vừa tạo.

Thực hiện thay đổi

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

  1. 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 Git frameworks/native:

    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. Chỉnh sửa SurfaceFlinger.cpp để đưa các nội dung cập nhật từ danh sách thay đổi vào vị trí sau:

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

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. Thêm hai dòng sau vào đầu updateColorMatrixlock():

    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 bản dựng mã:

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

    adb root
    adb remount
    adb sync
    adb reboot

Xác minh rằng bạn thấy sự thay đổi màu sắc trên thiết bị đã chọn giống với màu hiển thị trong Hình 1.

Ví dụ về trường hợp thay đổi màu thành công

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

Kiểm thử mã

Phần này của lớp học lập trình sử dụng một chương trình kiểm thử mẫu trong cây nguồn và không thành công. Thao tác này sử dụng Atest cho chạy kiểm thử cục bộ và kiểm thử mã.

Để sử dụng bài kiểm tra, hãy làm theo các hướng dẫn sau:

  1. Chạy:

    atest DevCodelabTest
  2. Thử nghiệm sẽ không thành công. Kiểm tra dấu vết ngăn xếp của lượt kiểm thử không đạt:

    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)
  3. Rồi xem tại đây

    platform_testing/tests/example/devcodelab
    
  4. Để lấy tệp cần chỉnh sửa, hãy lấy tên của kiểm thử trong android.test.example.devcodelab.DevCodelabTest và thay thế . bằng / để có kết quả sau:

    src/android/test/example/devcodelab/DevCodelabTest.java
    
  5. Sau đó chỉnh sửa

    platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    

    để thay thế

    Assert.assertTrue(false)
    

    với

    Assert.assertTrue(true)
    
  6. 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 Công cụ kiểm soát nguồn để biết tổng quan về Git và Repo, với đường liên kết đến tài liệu đầy đủ về cách làm việc với mã nguồn Android. Hãy xem kho lưu trữ AOSP để biết danh sách đầy đủ các dự án Git và các dự án riêng lẻ (đường dẫn) cho các nhánh liên kết với từng dự án.

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

  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. Nhập nội dung sau đây cho thông báo cam kết:

    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 giống 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

Truy cập vào đường liên kết được in trong thiết bị đầu cuối, tương tự như đường liên kết sau:

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

Đến đây, bạn đã hoàn thành lớp học lập trình khởi đầu để phát triển nền tảng Android. Hãy xem phần Gửi bản vá để biết các bước tiếp theo. Để biết toàn bộ thông tin chi tiết về cách phát triển Android, hãy xem phần còn lại của trang web này.

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 đó, cho mục đích của lớp học lập trình này, hãy huỷ bỏ danh sách thay đổi bằng cách nhấp vào Thoát trong Gerrit.

Sau đó, hãy 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 .

Ngoài ra, hãy nhớ 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 repo start, git commitrepo upload thay đổi, nên bạn có thể đặt lại tệp. Giả sử bạn đang ở aosp/platform_testing directory, hãy sử dụng sau đây để đặt lại tệp:

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

Đến đây, bạn đã hoàn tất! Làm tốt lắm!

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.