Bên trong các gói OTA

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 gói OTA.

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

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

Lưu ý: Việc sử dụng tập lệnh chỉnh sửa và/hoặc các hàm dựng sẵn 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.

Chỉnh sửa cú pháp

Tập lệnh chỉnh sửa là một biểu thức duy nhất trong đó tất cả các giá trị đều 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 đều đú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, _, :, /, . đó 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 thì endif. ) Các chuỗi ký tự 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à lối thoát trong 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 thứ 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 đều có trong các hàm có sẵn để thực thi bằng tập lệnh. (Nói đúng ra đây là các macro chứ không phải 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à sai nếu có lỗi. Nếu bạn muốn xảy ra lỗi hủy bỏ quá trình 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 bỏ việc thực thi tập lệnh ngay lập tức với thông điệp tùy chọn . Nếu người dùng đã bật hiển thị văn bản, thông báo sẽ xuất hiện trong nhật ký khôi phục và trên màn hình.
assert( expr [, expr , ...])
Đánh giá lần lượt từng expr . Nếu bất kỳ giá trị nào sai, ngay lập tức hủy bỏ việc thực thi kèm theo thông báo "xác nhận 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 bản vá nhị phân cho src_file để tạo ra tgt_file . Nếu mục tiêu mong muốn giống với nguồn, hãy chuyển "-" cho tgt_file . tgt_sha1tgt_size là hàm băm SHA1 cuối cùng dự kiến ​​và kích thước của tệp mục tiêu. Các đối số còn lại phải đi theo cặp: hàm băm SHA1 (chuỗi hex 40 ký tự) và blob. 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 nhất định.

Việc vá lỗi được thực hiện theo cách an toàn để đảm bảo tệp mục tiêu có hàm băm và kích thước SHA1 mong muốn hoặc không bị ảnh hưởng—tệp sẽ không ở trạng thái trung gian không thể phục hồi. Nếu quá trình bị gián đoạn trong quá trình vá lỗi, 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ộ đệm nên việc 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ợ để xử lý nội dung của các phân vùng Thiết bị Công nghệ Bộ nhớ (MTD) dưới dạng tệp, cho phép vá các phân vùng thô như boot. Để đọc một phân vùng MTD, bạn phải biết mình 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 tin. Bạn có thể sử dụng chuỗi "MTD: phân vùng : 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ộ đệm (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 là 40 chữ số hex. Hàm này khác với sha1_check(read_file( filename ), sha1 [, ...]) ở chỗ nó biết kiểm tra bản sao phân vùng bộ đệm, do đó, 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 dung lượng 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à cú pháp cho hàm này trong trường hợp đặc biệt có hai đối số (nhưng dạng hàm có thể nhận bất kỳ số lượng 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ông có khóa .
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à phân vùng_type="MTD". Vị trí phải là tên của phân vùng MTD; một hệ thống tập tin 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à phân vùng_type="EMMC". Vị trí phải là tệp thiết bị cho phân vùng. Một hệ thống tập tin ext4 trống được xây dựng ở đó. Nếu fs_size bằng 0, hệ thống tập tin sẽ chiếm toàn bộ phân vùng. Nếu fs_size là 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à số âm, hệ thống tập tin sẽ lấy tất cả ngoại trừ |fs_size| cuối cùng byte của phân vùng.
  • fs_type="f2fs" và phân vùng_type="EMMC". Vị trí phải là tệp thiết bị cho phân vùng. fs_size phải là số không âm. Nếu fs_size bằng 0, hệ thống tập tin sẽ chiếm toàn bộ phân vùng. Nếu fs_size là 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 sẽ là điểm gắn kết trong tương lai cho hệ thống tập tin.
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 recovery.
greater_than_int( a , b )
Trả về true khi 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 đúng thì đánh giá và trả về giá trị của e1 , nếu không thì đánh giá và trả về e2 (nếu có). Cấu trúc "if ... else ... then ... endif" chỉ là cú pháp cho hàm này.
is_mounted( mount_point )
Trả về true nếu có hệ thống tập tin được gắn tại mount_point .
is_substring( needle , haystack )
Trả về đúng iff kim là một chuỗi con của haystack .
less_than_int( a , b )
Trả về true nếu 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 tin fs_type tại mount_point . phân vùng_type phải là một trong:
  • MTD . Tên là tên của 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.

Theo mặc định, Recovery không gắn kết bất kỳ hệ thống tệp nào (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); tập lệnh của bạn phải gắn kết bất kỳ phân vùng nào nó cần sửa đổi.

package_extract_dir( package_dir , dest_dir )
Trích xuất 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 tin hiện có đều bị ghi đè.
package_extract_file( package_file [, dest_file ])
Trích xuất một package_file 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ố dest_file , trả về nội dung của tệp gói dưới dạng blob nhị phân.
read_file( filename )
Đọc tên tệp và trả về nội dung của nó dưới dạng blob nhị phân.
run_program( path [, arg , ...])
Thực thi nhị phân tại path , chuyể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 độ không bao giờ di chuyển lùi; những nỗ lực để làm như vậy đều bị bỏ qua.
sha1_check( blob [, sha1 ])
Đối số blob là một blob thuộc loại đượ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ề hàm băm SHA1 của blob (dưới dạng chuỗi hex 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 trong số đó.
show_progress( frac , secs )
Nâng cao đồng hồ đo tiến độ trong khoảng thời gian tiếp theo của nó trong giây giây (phải là số nguyên). giây có thể là 0, trong trường hợp đó đồng hồ đo không tự động nâng lên mà bằng cách sử dụng hàm set_progress() được xác định ở trên.
sleep( secs )
Ngủ trong vài giây giây (phải là số nguyên).
stdout( expr [, expr , ...])
Đánh giá từng biểu thức và chuyển giá trị của nó vào thiết bị xuất chuẩn. Hữu ích cho việc gỡ lỗi.
tune2fs( device [, arg , …])
Điều chỉnh các tham số có thể điều chỉnh được trên thiết bị .
ui_print([ text , ...])
Ghép 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 tin được gắn tại mount_point .
wipe_block_device( block_dev , len )
Xóa các byte len của thiết bị khối đã cho block_dev .
wipe_cache()
Làm cho phân vùng bộ nhớ đệm bị xóa sau khi 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 tệp cục bộ hoặc đối số có giá trị blob chứa dữ liệu cần ghi. Để sao chép tệp từ gói OTA sang 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ỉ tên tệp mới được chấp nhận, do đó, để thực hiện được điều này, trước tiên dữ liệu phải được giải nén vào một tệp cục bộ tạm thời.