Trang này mô tả cách cải thiện hiệu suất bằng cách xác định và xoá các gói không cần thiết cho người dùng hệ thống.
Tắt các gói không cần thiết
Trong mảng Ô tô, người dùng hệ thống là không có giao diện người dùng, nghĩa là người dùng hệ thống không được dùng hoặc truy cập trực tiếp bởi con người. Do đó, nhiều ứng dụng và dịch vụ không cần chạy trong người dùng hệ thống và có thể bị tắt để cải thiện hiệu suất. Do đó, bạn có thể chọn xoá các ứng dụng không cần thiết cho người dùng hệ thống (Người dùng 0).
Trên trang này, chúng ta sẽ thảo luận về hai loại người dùng:
- HỆ THỐNG. Luôn là Người dùng 0
- FULL (Đã hết chỗ). Người dùng mà con người dự định sử dụng (không phải người dùng hệ thống), Người dùng 10+
Android 11
Trong Android 11, hãy thay đổi cấu hình config_userTypePackageWhitelistMode
. Bạn có thể kết hợp các cờ. Trong trường hợp này, 5
tương đương với 1
cộng với 4
(kết hợp các cờ 1
và 4
).
Gắn cờ | Mô tả |
---|---|
0 |
Tắt danh sách cho phép. Cài đặt tất cả gói hệ thống; không ghi nhật ký. |
1 |
Thực thi. Chỉ cài đặt các gói hệ thống khi chúng nằm trong danh sách cho phép. |
2 |
Ghi lại các gói không có trong danh sách cho phép. |
4 |
Mọi gói không được đề cập trong tệp danh sách cho phép đều được đưa vào danh sách cho phép ngầm ẩn cho tất cả người dùng. |
8 |
Tương tự như 4 , dành cho người dùng hệ thống. |
16 |
Bỏ qua OTA. Không cài đặt các gói hệ thống trong quá trình OTA. |
Hãy xem xét các trường hợp phổ biến sau:
- Để bật một tính năng cho danh sách cho phép đầy đủ,
1
(được thực thi đầy đủ) - Để bật một tính năng cho danh sách cho phép chưa hoàn chỉnh,
5
- Để bật một tính năng cho người dùng
SYSTEM
nhằm hỗ trợ việc phát triển cục bộ,9
(danh sách cho phép ngầm ẩn) - Để tắt một tính năng như thể chưa bao giờ bật,
16
- Để tắt một tính năng và huỷ tất cả hiệu ứng trước đó, hãy
0
Cài đặt tệp XML trong thư mục sysconfig
cho thiết bị (đây là cùng một thư mục chứa tệp makefile (.mk
) dùng để tạo hình ảnh hệ thống cho thiết bị). Khi đặt tên cho tệp XML, hãy thêm vị trí gói được xác định trong bản dựng, ví dụ: preinstalled-packages-product-car-CAR_PRODUCT_NAME.xml
.
<!- this package will be installed for both FULL and SYSTEM user --> <install-in-user-type package="com.android.bluetooth"-> <install-in user-type="FULL" /-> <install-in user-type="SYSTEM" /-> </install-in-user-type-> <!- this package will only be installed for both FULL user --> <install-in-user-type package="com.android.car.calendar"-> <install-in user-type="FULL" > </install-in-user-type->
Android 9 và Android 10
Cách định cấu hình tính năng này trong Android 9 và Android 10:
- Lớp phủ cấu hình
config_systemUserPackagesBlacklistSupported
từframeworks/base/core/res/res/values/config.xml
và đặt cấu hình đó thànhtrue
. Khi tính năng này được bật, theo mặc định, tất cả gói sẽ được cài đặt cho cả người dùng hệ thống và người dùng FULL. - Tạo tệp
config.xml
liệt kê các gói cần tắt cho người dùng hệ thống, ví dụ:<config> <!-- This package will be uninstalled for the system user --> <system-user-blacklisted-app package="com.google.car.calendar" /> </config>
- Thêm một dòng vào
device.mk
để sao chép tệp vào thư mục đíchsystem/etc/sysconfig/
của thiết bị, ví dụ:PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
Xác minh kết quả
Để xác minh kết quả, hãy chạy:
$ adb shell dumpsys user | grep PACKAGE_SUBSTRING $ adb shell pm list packages --user USER_ID PACKAGE_SUBSTRING $ adb shell cmd user report-system-user-package-whitelist-problems
Văn phòng
Để xác định xem có nên cài đặt gói trong người dùng hệ thống hay không, hãy kiểm tra tệp AndroidManifest.xml
của gói nằm ở thư mục gốc của nguồn dự án, bao gồm các thuộc tính của ứng dụng và các thành phần của ứng dụng, bao gồm tất cả các hoạt động, dịch vụ, broadcast receiver và nhà cung cấp nội dung. Để tìm hiểu thêm, hãy xem bài viết Tổng quan về tệp kê khai ứng dụng.
Hình 1. Tắt quy trình làm việc của gói.
Cấp 1, cấp ứng dụng
1. Kiểm tra xem ứng dụng (hoặc các thành phần ứng dụng) có được khai báo là singleton hay không
Nếu ứng dụng là một singleton, thì hệ thống sẽ chỉ tạo bản sao ứng dụng trong người dùng hệ thống. Có thể ứng dụng này được thiết kế để nhận biết nhiều người dùng. Để tìm hiểu thêm về ứng dụng nhận biết nhiều người dùng, hãy xem phần Tạo ứng dụng nhận biết nhiều người dùng.
- Kiểm tra tệp kê khai Android để tìm
android:singleUser="true"
. - Nếu là
true
, hãy thêm vào danh sách cho phép. Cần thiết cho người dùng hệ thống. - Nếu là
false
, hãy tiếp tục. Hãy kiểm tra các tiêu chí khác trước khi xoá.
2. Kiểm tra xem ứng dụng có yêu cầu quyền truy cập vào bộ nhớ được bảo vệ hay không
Nhiều dịch vụ khởi động hệ thống thường dựa vào bộ nhớ được mã hoá thiết bị (DE) thay vì bộ nhớ được mã hoá thông tin xác thực (CE). Ngoài ra, các ứng dụng hệ thống có khả năng nhận biết chế độ khởi động trực tiếp cũng dựa vào bộ nhớ được mã hoá của thiết bị. Để tìm hiểu thêm về các ứng dụng nhận biết tính năng khởi động trực tiếp, hãy xem phần Hỗ trợ tính năng Khởi động trực tiếp trong ứng dụng hệ thống.
- Kiểm tra tệp kê khai Android để biết
android:defaultToDeviceProtectedStorage="true"
, cần thiết cho nhiều dịch vụ khởi động hệ thống. - Nếu là
true
, hãy thêm vào danh sách cho phép. - Nếu là
false
, hãy tiếp tục.
Cấp 2, thành phần ứng dụng
Hoạt động
Để tìm hiểu thêm về hoạt động, hãy xem phần Giới thiệu về hoạt động.
a. Kiểm tra xem ứng dụng có chỉ chứa các hoạt động hay không
Hoạt động được định hướng theo giao diện người dùng. Vì người dùng hệ thống không có giao diện người dùng trong Automotive, nên không có người dùng nào tương tác với người dùng hệ thống. Do đó, nếu chỉ chứa các hoạt động, thì ứng dụng có nhiều khả năng không liên quan đến người dùng hệ thống.
Kiểm tra mức độ ưu tiên và đặc quyền:
- Nếu Có, có thể cần thiết cho người dùng hệ thống.
- Nếu Không, đừng thêm người dùng hệ thống vào danh sách cho phép.
Ví dụ: Bộ kiểm thử khả năng tương thích (CTS) (com.android.cts.priv.ctsshim
) chỉ chứa các hoạt động và các hoạt động được xác định để kiểm thử bộ lọc ý định. Tuy nhiên, vì CTS có đặc quyền cao, nên bạn cần cài đặt CTS cho người dùng hệ thống cho mục đích kiểm thử.
Dịch vụ
Để tìm hiểu thêm về các dịch vụ, hãy xem bài viết Tổng quan về dịch vụ.
b. Kiểm tra xem dịch vụ có được khai báo là riêng tư và không thể truy cập được từ các ứng dụng khác hay không
Nếu dịch vụ được khai báo là riêng tư, các gói khác sẽ không sử dụng dịch vụ đó. Tìm android:exported="false"
. Nếu dịch vụ được khai báo là riêng tư hoặc không thể truy cập được từ các ứng dụng khác, thì các ứng dụng khác không thể liên kết với dịch vụ đó. Do đó, Bước c và Bước d bên dưới không liên quan. Do đó, thành phần này sẽ không cung cấp thêm gợi ý về việc người dùng hệ thống có cần dịch vụ hay không.
- Nếu Có, hãy kiểm tra thành phần tiếp theo.
- Nếu Không, hãy tiếp tục kiểm tra thành phần này.
c. Kiểm tra xem các ứng dụng được cài đặt trong người dùng hệ thống có thể liên kết với dịch vụ này hay không
Kiểm tra các gói có trong danh sách cho phép ở Cấp 1 và xác định các dịch vụ liên kết với các gói đó. Theo dõi từ bộ lọc ý định trong dịch vụ này và startService
trong các gói khác.
Nếu dịch vụ này được liên kết với các ứng dụng được cài đặt trong người dùng hệ thống (ví dụ: com.android.car.companiondevicesupport
được đưa vào danh sách cho phép chạy trong người dùng hệ thống), hãy thêm dịch vụ vào danh sách cho phép:
- Nếu Có, hãy thêm vào danh sách cho phép.
- Nếu Không, hãy tiếp tục kiểm tra thành phần này.
d. Kiểm tra xem dịch vụ có được liên kết từ các ứng dụng khác và được khai báo để chạy trên nền trước hay không
Tìm startForeground
. Điều này có nghĩa là mọi người sẽ tương tác với ứng dụng ở nền trước. Rất có thể, người dùng hệ thống sẽ không cần đến dịch vụ này và không cần đưa vào danh sách cho phép:
- Nếu Có, đừng thêm vào danh sách cho phép.
- Nếu Không, hãy tiếp tục kiểm tra thành phần tiếp theo.
e. Kiểm tra xem dịch vụ có được xác định để chạy trong quy trình hệ thống hay không
Trong tệp AndroidManifest, hãy tìm android:process="system"
.
Nếu dịch vụ được xác định một cách có chủ ý để chạy trong quy trình hệ thống, thì dịch vụ đó sẽ chạy trong cùng một quy trình với dịch vụ hệ thống và phải được đưa vào danh sách cho phép để chạy trong người dùng hệ thống. Trong thiết kế phân bổ bộ nhớ của Android, các dịch vụ hệ thống là một số quy trình cuối cùng bị tắt, ngụ ý mức độ quan trọng của các dịch vụ được xác định bằng thuộc tính như vậy. Để tìm hiểu thêm về thiết kế phân bổ bộ nhớ của Android, hãy xem phần Trình tắt khi bộ nhớ thấp.
- Nếu Có, đừng thêm vào danh sách cho phép.
- Nếu Không, hãy tiếp tục kiểm tra các thành phần khác.
Ví dụ: gói com.android.networkstack.inprocess
phải được đưa vào danh sách cho phép vì gói này chứa RegularMaintenanceJobService
có thẻ android:process="system"
.
Nhà cung cấp nội dung
Để tìm hiểu thêm về trình cung cấp nội dung, hãy xem bài viết Trình cung cấp nội dung.
f. Kiểm tra xem ứng dụng được cài đặt trong người dùng hệ thống có phụ thuộc vào nhà cung cấp này hay không
Kiểm tra các gói trong danh sách cho phép ở Cấp 1 và kiểm tra xem các gói đó phụ thuộc vào nhà cung cấp nào. Nếu một ứng dụng chạy trong người dùng hệ thống (ví dụ: com.android.car.companiondevicesupport
có trong danh sách cho phép để chạy trong người dùng hệ thống) và phụ thuộc vào nhà cung cấp nội dung này, thì hãy đảm bảo rằng nhà cung cấp nội dung này cũng có trong danh sách cho phép.
- Nếu Có, hãy thêm vào danh sách cho phép.
- Nếu Không, đừng thêm vào danh sách cho phép.
Ví dụ: nếu com.android.car.EXAMPLE
chứa trình cung cấp singleton (SystemActionsContentProvider
và ManagedProvisioningActionsContentProvider
), thì trình cung cấp đó phải được đưa vào danh sách cho phép cho người dùng hệ thống. Sau đó, nếu com.android.car.EXAMPLE
phụ thuộc vào android.webkit
cho WebViewFactoryProvider
, thì com.android.webview
phải được đưa vào danh sách cho phép cho người dùng hệ thống vì nó tải android.webkit
.
Hướng dẫn từng bước về gói mẫu
Ví dụ sau đây cho biết cách đánh giá AndroidManifest.xml
của một gói:
<?xml version="1.0" encoding="utf-8"?> <!-- 1. Search in the entire manifest for singleUser attribute. No. Move to step 2 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.providers.calendar" android:sharedUserId="android.uid.calendar"> We can ignore the entire permission section <uses-permission android:name="android.permission.READ_CALENDAR" /> ... <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <!-- 2. Look for defaultToDeviceProtectedStorage in application's attribute. No. Continue evaluating app components. --> <application android:label="@string/calendar_storage" android:allowBackup="false" android:icon="@drawable/app_icon" android:usesCleartextTraffic="false"> <!-- a. Contain only activities? No. Continue to evaluate components other than activities. --> <provider android:name="CalendarProvider2" android:authorities="com.android.calendar" <!-- b. Is this component exported? Yes. Continue evaluating this component. f. App on u0 might depend on this? Search for CalendarProvider2 in dumpsys, shows ContentProviderRecord{b710923 u0 com.android.providers.calendar/.CalendarProvider2} Yes. Whitelist for system user. --> android:label="@string/provider_label" android:multiprocess="false" android:exported="true" android:readPermission="android.permission.READ_CALENDAR" android:writePermission="android.permission.WRITE_CALENDAR" />
<activity android:name="CalendarContentProviderTests" android:label="Calendar Content Provider" android:exported="false"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.UNIT_TEST" /> </intent-filter> </activity> <!-- Not service/content provider. Ignore. --> <receiver android:name="CalendarProviderBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.android.providers.calendar.intent.CalendarProvider2"/> <category android:name="com.android.providers.calendar"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.EVENT_REMINDER"/> <data android:scheme="content" /> </intent-filter> </receiver> <service android:name="CalendarProviderIntentService"/> </application> </manifest>