Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Các gói OTA bên trong

Hệ thống xây dựng tệp nhị phân của trình cập nhật từ bootable/recovery/updater và sử dụng nó trong một gói OTA.

Bản thân gói là một tệp .zip ( ota_update.zip , incremental_ota_update.zip ) có chứa tệp nhị phân META-INF/com/google/android/update-binary có thể thực thi được.

Trình cập nhật chứa một số chức năng tích hợp và trình thông dịch cho một ngôn ngữ kịch bản có thể mở rộng ( edify ) hỗ trợ các lệnh cho các tác vụ điển hình liên quan đến cập nhật. Trình cập nhật tìm tập lệnh trong gói .zip để tìm tập lệnh trong tệp META-INF/com/google/android/updater-script .

Lưu ý: Sử dụng tập lệnh edify và / hoặc các hàm nội trang không phải là hoạt động phổ biến, nhưng có thể hữu ích nếu bạn cần gỡ lỗi tệp cập nhật.

Mã hóa cú pháp

Một tập lệnh edify là một biểu thức duy nhất trong đó tất cả các giá trị là chuỗi. Các chuỗi trống là sai trong ngữ cảnh Boolean và tất cả các chuỗi khác là đúng . Edify hỗ trợ các toán tử sau (với nghĩa thông thường):

(expr )
 expr + expr  # string concatenation, not integer addition
 expr == expr
 expr != expr
 expr && expr
 expr || expr
 ! expr
 if expr then expr endif
 if expr then expr else expr endif
 function_name(expr, expr,...)
 expr; expr

Bất kỳ chuỗi ký tự az, AZ, 0-9, _,:, / ,. mà không phải là một từ dành riêng được coi là một chuỗi ký tự. (Các từ dành riêng là if else then endif. ) Các ký tự chuỗi cũng có thể xuất hiện trong dấu ngoặc kép; đây là cách tạo các giá trị có khoảng trắng và các ký tự khác không có trong tập hợp trên. \ n, \ t, \ "và \\ đóng vai trò là các thoát trong các chuỗi được trích dẫn, cũng như \ x ## .

&& và || người vận hành bị đoản mạch; phía bên phải không được đánh giá nếu kết quả logic được xác định bởi phía bên trái. Sau đây là tương đương:

e1 && e2
if e1 then e2 endif

Các ; toán tử là một điểm trình tự; nó có nghĩa là đánh giá đầu tiên bên trái và sau đó là bên phải. Giá trị của nó là giá trị của biểu thức bên phải. Dấu chấm phẩy cũng có thể xuất hiện sau một biểu thức, do đó, hiệu ứng mô phỏng các câu lệnh kiểu C:

prepare();
do_other_thing("argument");
finish_up();

Chức năng tích hợp sẵn

Hầu hết chức năng cập nhật được chứa trong các chức năng có sẵn để thực thi bởi các tập lệnh. (Nói một cách chính xác, đây là các macro chứ không phải là các hàm theo nghĩa Lisp, vì chúng không cần đánh giá tất cả các đối số của chúng.) Trừ khi có ghi chú khác, các hàm trả về true nếu thành công và false khi lỗi. Nếu bạn muốn các lỗi hủy bỏ việc thực thi tập lệnh, hãy sử dụng các hàm abort() và / hoặc assert() . Tập hợp các chức năng có sẵn trong trình cập nhật cũng có thể được mở rộng để cung cấp chức năng dành riêng cho thiết bị .

abort([ msg ])
Hủy thực thi tập lệnh ngay lập tức, với tin nhắn tùy chọn . Nếu người dùng đã bật hiển thị văn bản, tin nhắn sẽ xuất hiện trong nhật ký khôi phục và trên màn hình.
assert( expr [, expr , ...])
Lần lượt đánh giá từng điểm. Nếu bất kỳ sai nào, ngay lập tức hủy thực thi với thông báo "khẳng định không thành công" và văn bản nguồn của biểu thức không thành công.
apply_patch( src_file , tgt_file , tgt_sha1 , tgt_size , patch1_sha1 , patch1_blob , [...])
Áp dụng một bản vá nhị phân cho src_file để tạo ra tgt_file . Nếu đích mong muốn giống với nguồn, hãy chuyển "-" cho tgt_file . tgt_sha1tgt_size là kích thước và băm SHA1 cuối cùng được mong đợi của tệp đích. Các đối số còn lại phải đi theo cặp: một băm SHA1 (một chuỗi hex gồm 40 ký tự) và một đốm màu. Blob là bản vá được áp dụng khi nội dung hiện tại của tệp nguồn có SHA1 đã cho.

Việc vá lỗi được thực hiện theo cách an toàn đảm bảo tệp đích có hàm băm và kích thước SHA1 mong muốn hoặc không bị ảnh hưởng - nó sẽ không bị để ở trạng thái trung gian không thể khôi phục. Nếu quá trình bị gián đoạn trong quá trình vá, tệp đích có thể ở trạng thái trung gian; một bản sao tồn tại trong phân vùng bộ nhớ cache để khởi động lại bản cập nhật có thể cập nhật tệp thành công.

Cú pháp đặc biệt được hỗ trợ để coi nội dung của phân vùng Thiết bị Công nghệ Bộ nhớ (MTD) là tệp, cho phép vá các phân vùng thô chẳng hạn như khởi động. Để đọc một phân vùng MTD, bạn phải biết bạn muốn đọc bao nhiêu dữ liệu vì phân vùng không có khái niệm cuối tệp. Bạn có thể sử dụng chuỗi "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " làm tên tệp để đọc phân vùng đã cho. Bạn phải chỉ định ít nhất một cặp (size, sha-1) ; bạn có thể chỉ định nhiều hơn một nếu có nhiều khả năng cho những gì bạn muốn đọc.

apply_patch_check( filename , sha1 [, sha1 , ...])
Trả về true nếu nội dung của tên tệp hoặc bản sao tạm thời trong phân vùng bộ nhớ cache (nếu có) có tổng kiểm tra SHA1 bằng một trong các giá trị sha1 đã cho. Giá trị sha1 được chỉ định dưới dạng 40 chữ số hex. Hàm này khác với hàm sha1_check(read_file( filename ), sha1 [, ...]) ở chỗ nó biết kiểm tra bản sao phân vùng bộ nhớ cache, vì vậy apply_patch_check() sẽ thành công ngay cả khi tệp bị hỏng do apply_patch() update bị gián đoạn.
apply_patch_space( bytes )
Trả về true nếu có ít nhất byte trống để áp dụng các bản vá nhị phân.
concat( expr [, expr , ...])
Đánh giá từng biểu thức và nối chúng. Toán tử + là đường cú pháp cho hàm này trong trường hợp đặc biệt của hai đối số (nhưng dạng hàm có thể nhận bất kỳ số biểu thức nào). Các biểu thức phải là chuỗi; nó không thể nối các đốm màu.
file_getprop( filename , key )
Đọc tên tệp đã cho, diễn giải nó dưới dạng tệp thuộc tính (ví dụ: /system/build.prop ) và trả về giá trị của khóa đã cho hoặc chuỗi trống nếu khóa không có.
format( fs_type , partition_type , location , fs_size , mount_point )
Định dạng lại một phân vùng nhất định. Các loại phân vùng được hỗ trợ:
  • fs_type = "yaffs2" và partition_type = "MTD". Vị trí phải là tên của phân vùng MTD; một hệ thống tệp yaffs2 trống được xây dựng ở đó. Các đối số còn lại không được sử dụng.
  • fs_type = "ext4" và partition_type = "EMMC". Vị trí phải là tệp thiết bị cho phân vùng. Một hệ thống tệp ext4 trống được xây dựng ở đó. Nếu fs_size bằng 0, hệ thống tệp sẽ chiếm toàn bộ phân vùng. Nếu fs_size là một số dương, hệ thống tập tin sẽ lấy byte fs_size đầu tiên của phân vùng. Nếu fs_size là một số âm, hệ thống tệp sẽ nhận tất cả ngoại trừ | fs_size | byte của phân vùng.
  • fs_type = "f2fs" và partition_type = "EMMC". Vị trí phải là tệp thiết bị cho phân vùng. fs_size phải là một số không âm. Nếu fs_size bằng 0, hệ thống tệp sẽ chiếm toàn bộ phân vùng. Nếu fs_size là một số dương, hệ thống tập tin sẽ lấy byte fs_size đầu tiên của phân vùng.
  • mount_point phải là điểm gắn kết trong tương lai cho hệ thống tệp.
getprop( key )
Trả về giá trị của khóa thuộc tính hệ thống (hoặc chuỗi trống, nếu nó không được xác định). Các giá trị thuộc tính hệ thống được xác định bởi phân vùng khôi phục không nhất thiết phải giống với giá trị của hệ thống chính. Hàm này trả về giá trị trong khôi phục.
greater_than_int( a , b )
Trả về true nếu và chỉ khi (iff) a (được hiểu là số nguyên) lớn hơn b (được hiểu là số nguyên).
ifelse( cond , e1 [, e2 ])
Đánh giá cond , và nếu nó đúng thì đánh giá và trả về giá trị của e1 , nếu không nó sẽ đánh giá và trả về e2 (nếu có). Cấu trúc "if ... else ... then ... endif" chỉ là đường cú pháp cho hàm này.
is_mounted( mount_point )
Trả về true iff có một hệ thống tệp được gắn tại mount_point .
is_substring( needle , haystack )
Trả về kim iff true là một chuỗi con của đống cỏ khô .
less_than_int( a , b )
Trả về true iff a (được hiểu là số nguyên) nhỏ hơn b (được hiểu là số nguyên).
mount( fs_type , partition_type , name , mount_point )
Gắn hệ thống tệp fs_type tại mount_point . partition_type phải là một trong những:
  • MTD . Tên là tên của một phân vùng MTD (ví dụ: hệ thống, dữ liệu người dùng; xem /proc/mtd trên thiết bị để biết danh sách đầy đủ).
  • EMMC.

Phục hồi không gắn kết bất kỳ hệ thống tệp nào theo mặc định (ngoại trừ thẻ SD nếu người dùng đang thực hiện cài đặt thủ công một gói từ thẻ SD); script của bạn phải gắn kết bất kỳ phân vùng nào mà nó cần sửa đổi.

package_extract_dir( package_dir , dest_dir )
Giải nén tất cả các tệp từ gói bên dưới package_dir và ghi chúng vào cây tương ứng bên dưới dest_dir . Mọi tệp hiện có đều bị ghi đè.
package_extract_file( package_file [, dest_file ])
Trích xuất một package_file duy nhất từ ​​gói cập nhật và ghi nó vào dest_file , ghi đè các tệp hiện có nếu cần. Không có đối số tệp đích , trả về nội dung của tệp gói dưới dạng một đốm màu nhị phân.
read_file( filename )
Đọc tên tệp và trả về nội dung của nó dưới dạng một đốm màu nhị phân.
run_program( path [, arg , ...])
Thực thi nhị phân tại đường dẫn , truyền arg s. Trả về trạng thái thoát của chương trình.
set_progress( frac )
Đặt vị trí của đồng hồ đo tiến trình trong đoạn được xác định bởi lệnh gọi show_progress() gần đây nhất. frac phải nằm trong khoảng [0,0, 1,0]. Đồng hồ đo tiến trình không bao giờ di chuyển ngược lại; nỗ lực để làm cho nó làm như vậy bị bỏ qua.
sha1_check( blob [, sha1 ])
Đối số blob là một blob kiểu được trả về bởi read_file() hoặc dạng một đối số của package_extract_file() . Không có đối số sha1 , hàm này trả về băm SHA1 của blob (dưới dạng chuỗi hex gồm 40 chữ số). Với một hoặc nhiều đối số sha1 , hàm này trả về hàm băm SHA1 nếu nó bằng một trong các đối số hoặc chuỗi trống nếu nó không bằng bất kỳ đối số nào.
show_progress( frac , secs )
Nâng cao đồng hồ đo tiến trình trong phần tiếp theo của độ dài của nó trên giây giây (phải là một số nguyên). giây có thể bằng 0, trong trường hợp đó đồng hồ không tự động nâng cao mà bằng cách sử dụng hàm set_progress() được định nghĩa ở trên.
sleep( secs )
Ngủ trong giây giây (phải là một số nguyên).
stdout( expr [, expr , ...])
Đánh giá từng biểu thức và chuyển giá trị của nó sang stdout. Hữu ích cho việc gỡ lỗi.
tune2fs( device [, arg , …])
Điều chỉnh các thông số có thể điều chỉnh được trên thiết bị .
ui_print([ text , ...])
Nối tất cả các đối số văn bản và in kết quả ra giao diện người dùng (nơi nó sẽ hiển thị nếu người dùng đã bật hiển thị văn bản).
unmount( mount_point )
Ngắt kết nối hệ thống tệp được gắn tại mount_point .
wipe_block_device( block_dev , len )
Xóa các byte len của block_dev thiết bị khối đã cho.
wipe_cache()
Làm cho phân vùng bộ nhớ cache bị xóa khi kết thúc quá trình cài đặt thành công.
write_raw_image( filename_or_blob , partition )
Ghi hình ảnh trong filename_or_blob vào phân vùng MTD. filename_or_blob có thể là một chuỗi đặt tên cho một tệp cục bộ hoặc một đối số có giá trị blob chứa dữ liệu cần ghi. Để sao chép tệp từ gói OTA vào một phân vùng, hãy sử dụng: write_raw_image(package_extract_file("zip_filename"), "partition_name");

Lưu ý: Trước Android 4.1, chỉ những tên tệp mới được chấp nhận, do đó, để thực hiện điều này, trước tiên dữ liệu phải được giải nén thành một tệp cục bộ tạm thời.