新增至建構作業的檔案系統物件和服務經常需要獨立項目, 專屬 ID,也就是 Android ID (AID)。目前,許多資源 檔案和服務無端使用核心 (Android 定義) AID;許多 但你可以使用原始設備製造商 (OEM) AID。
舊版 Android (Android 7.x 以下版本) 擴充 AID
使用裝置專屬 android_filesystem_config.h
的機制
檔案,指定檔案系統功能和/或自訂原始設備製造商 (OEM) AID。不過,
因為本產品不支援使用 OEM AID 的好名字
您必須指定不含
將好記名稱與數字 AID 建立關聯。
較新版本的 Android (Android 8.0 以上版本) 支援新的 擴充檔案系統功能這個新方法支援 包括:
- 設定檔的多個來源位置 (啟用可延伸 建構設定)。
- 檢查原始設備製造商 (OEM) AID 值的建構期間例行性檢查。
- 產生可在來源檔案中使用的自訂原始設備製造商 (OEM) AID 標頭 。
- 將易記名稱與實際原始設備製造商 (OEM) AID 值建立關聯。支援 使用者和群組的非數字字串引數,例如「foo」而不是 「2901」。
其他改善項目包括移除 android_ids[]
陣列來源
system/core/libcutils/include/private/android_filesystem_config.h
。這個
陣列在 Bionic 中現為完全私密產生的陣列
具有 getpwnam()
和 getgrnam()
的存取子。(這有
因為核心 AID 被修改而產生穩定二進位檔的副作用)。適用對象
和 README 檔案等詳細資訊
build/make/tools/fs_config
。
新增 Android ID (AID)
Android 8.0 已從 Android 中移除 android_ids[]
陣列
開放原始碼計畫 (AOSP)。所有適合 AID 使用的名稱都會從以下來源產生:
system/core/libcutils/include/private/android_filesystem_config.h
。android_ids[]
不限
工具選取 define
相符的AID_*
,* 則會變成小寫名稱。
例如,在 private/android_filesystem_config.h
中:
#define AID_SYSTEM 1000
變更為:
- 簡單易懂的名稱:系統
- uid:1000
- Gid:1000
如要新增 Android 開放原始碼計畫核心 AID,只要將 #define
android_filesystem_config.h
標頭檔案。AID 為
建構時產生的程式碼,並提供給採用使用者和群組的介面
引數。這項工具會驗證新 AID 不在應用程式或原始設備製造商 (OEM) 中
範圍;也會遵循這些範圍的變更,且會自動
在變更或新的原始設備製造商 (OEM) 保留範圍時重新設定。
設定 AID
如要啟用新的 AID 機制,請在TARGET_FS_CONFIG_GEN
BoardConfig.mk
檔案。這個變數會保留設定清單
檔案,可讓您視需要附加檔案。
按照慣例,設定檔使用 config.fs
這個名稱,但
練習你說出任何名稱。config.fs
個檔案位於
Python
ConfigParser ini 格式,並加入 Caps 區段 (用於設定檔案)
系統功能) 和 AID 部分 (用於設定 OEM AID)。
設定上限部分
大寫部分支援設定 檔案 系統功能對建構中的檔案系統物件 (檔案系統) 執行 本身也必須支援這項功能)。
在 Android 中以根權限執行穩定的服務會導致
Compatibility Test Suite (CTS)
先前要求在執行時仍要保留功能
也就是設定功能的程序或服務
setuid
/setgid
,以便執行適當的 AID。使用大寫時,你可以
可以略過這些要求,讓核心為您代勞。控制選項處於啟用狀態時
已交給 main()
,你的程序已具備這項功能
您需要這樣服務才能使用非超級使用者和群組 (建議使用
以便啟動特殊權限服務)。
上限部分使用的語法如下:
章節 | 值 | 定義 |
---|---|---|
[path] |
要設定的檔案系統路徑。系統會將結尾為 / 的路徑視為 dir,
而是檔案
指定多個位置相同的版面會發生錯誤 [path] (不同檔案)。在 Python 3.2 以下版本中,
同一檔案內的區段可能會覆寫前一個部分;Python 應用程式
3.2,系統會將此模式設定為嚴格模式。 |
|
mode |
八進位檔案模式 | 有效的八位數檔案模式 (至少要有 3 位數)。如果指定 3,則 前置字串為 0,其他模式則依原樣使用。 |
user |
AID_<使用者> | C define 代表有效的 AID 或易記名稱
(例如 AID_RADIO 和 radio 均可使用)。目的地:
定義自訂 AID,請參閱設定
AID 部分 |
group |
AID_<群組> | 與使用者相同。 |
caps |
上限* | 名稱
bionic/libc/kernel/uapi/linux/capability.h
開頭的 CAP_ 除外可以混合大小寫。上限可能也是
原始:
|
如需使用範例,請參閱使用檔案 系統功能
設定 AID 區段
AID 部分包含 OEM AID,並使用下列語法:
章節 | 值 | 定義 |
---|---|---|
[AID_<name>] |
<name> 可以包含集合內的字元
大寫、數字和底線系統會使用小寫版本
好記的名稱。為了納入程式碼,系統產生的標頭檔案會使用
AID_<name> 。
指定多個位置相同的版面會發生錯誤 AID_<name> (在與
[path] )。
<name> 的開頭必須是分區名稱,才能確保
確定不會與其他來源衝突 |
|
value |
<數字> | 有效的 C 樣式數字字串 (十六進位、八進位、二進位和十進位)。
以相同的值選項指定多個版面會發生錯誤。 必須在對應分區的範圍內指定值選項 在 <name> 中使用。有效分區的清單及其對應的
範圍是在 system/core/libcutils/include/private/android_filesystem_config.h 中定義。
可採用的選項包括:
|
如需使用範例,請參閱「定義原始設備製造商 (OEM) AID 名稱和使用原始設備製造商 (OEM) AID。
使用範例
下列範例詳細說明如何定義及使用 OEM AID,以及如何 啟用檔案系統功能。原始設備製造商 (OEM) AID 名稱 ([AID_name]) 的開頭必須是 分區名稱,例如「vendor_」確保它們不會與未來衝突 AOSP 名稱或其他分區。
定義原始設備製造商 (OEM) AID 名稱
如要定義 OEM AID,請建立 config.fs
檔案,
AID 值例如,在 device/x/y/config.fs
中,將
包括:
[AID_VENDOR_FOO] value: 2900
建立檔案後,請設定 TARGET_FS_CONFIG_GEN
變數
並在 BoardConfig.mk
中指向它例如,在
device/x/y/BoardConfig.mk
,請設定以下屬性:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
如此一來,系統在建立新建構作業時就能直接使用您的自訂 AID。
使用原始設備製造商 (OEM) AID
如要使用 OEM AID,請在 C 程式碼中加入 oemaids_headers
Makefile,新增 #include "generated_oem_aid.h"
,然後開始使用宣告的內容
識別碼例如,在 my_file.c
中新增下列程式碼:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
在相關聯的 Android.bp
檔案中,新增以下內容:
header_libs: ["oemaids_headers"],
如果您使用 Android.mk
檔案,請新增下列程式碼:
LOCAL_HEADER_LIBRARIES := oemaids_headers
使用好記名稱
在 Android 9 中,您可以為 介面。例如:
- 在
some/init.rc
的chown
指令中:chown vendor_foo /vendor/some/vendor_foo/file
- 在
some/init.rc
的service
中:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
因為從好記名稱到 uid 的內部對應是由
供應商 /vendor/etc/passwd
和 /vendor/etc/group
必須掛接分區。
連結好記名稱
Android 9 支援將 且帶有實際 OEM AID 值的易記名稱。您可以使用非數字字串 使用者和群組的引數,也就是「vendor_foo」而不是 「2901」。
從 AID 轉換為好記名稱
適用對象
OEM AID (Android 8.x 必須使用
具有 getpwnam
和類似函式的 oem_####
,如
且適合使用 getpwnam
處理查詢 (例如
init
指令碼)。Android 9:
在 Bionic 使用 getpwnam
和 getgrnam
好友:
將 Android ID (AID) 轉換為好記名稱,反之亦然。
使用檔案系統功能
如要啟用檔案系統功能,請在
config.fs
檔案。例如,在
device/x/y/config.fs
,請新增下列區段:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
建立檔案後,請將 TARGET_FS_CONFIG_GEN
設為指向
該檔案位於 BoardConfig.mk
中例如,在
device/x/y/BoardConfig.mk
,請設定以下屬性:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
執行時,服務 vendor_foo
會啟動
具備功能CAP_SYS_ADMIN
和CAP_SYS_NICE
呼叫 setuid
和 setgid
網路。此外,
vendor_foo
服務的 SELinux 政策不再適用
需要 setuid
和 setgid
功能,且可在
已刪除。
設定覆寫設定 (Android 6.x-7.x)
Android 6.0 已更換 fs_config
和相關結構
定義
(system/core/include/private/android_filesystem_config.h
) 變更為
system/core/libcutils/fs_config.c
(支援更新或
這個 Cloud Shell 中安裝的二進位檔案
/system/etc/fs_config_dirs
和
/system/etc/fs_config_files
。使用不同的比對和剖析功能
目錄和檔案規則 (可能會使用額外的 glob 運算式)
可讓 Android 處理兩個不同資料表中的目錄和檔案。
system/core/libcutils/fs_config.c
中的結構定義不正確
僅允許執行階段讀取目錄和檔案,但主機可以使用
或建構檔案系統映像檔
「${OUT}/system/etc/fs_config_dirs
」和
${OUT}/system/etc/fs_config_files
。
雖然擴充檔案系統的覆寫方法已被取代 Android 8.0 推出了模組設定系統,不過您仍可使用 方法。以下各節將詳細說明如何產生及納入 覆寫檔案並設定檔案系統
產生覆寫檔案
您可以產生對齊的二進位檔案
「/system/etc/fs_config_dirs
」和
/system/etc/fs_config_files
使用
build/tools/fs_config
中的 fs_config_generate
工具。
工具會使用 libcutils
程式庫函式
(fs_config_generate()
) 用於管理緩衝區中的 DAC 需求
並且定義了 include 檔案的規則,用於機構 DAC 規則。
如要使用,請在以下位置建立納入檔案:
device/vendor/device/android_filesystem_config.h
做為覆寫值檔案必須使用
structure fs_path_config
格式定義於
system/core/include/private/android_filesystem_config.h
,其中包含
下列目錄和檔案符號的初始化結構如下:
- 如果是目錄,請使用
android_device_dirs[]
。 - 針對檔案,請使用
android_device_files[]
。
不使用 android_device_dirs[]
和
android_device_files[]
,您可以定義
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
和
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(請參閱
範例)。您也可以指定覆寫值
在白板中使用 TARGET_ANDROID_FILESYSTEM_CONFIG_H
的檔案
並將強制執行的 basename
android_filesystem_config.h
。
包含覆寫檔案
如要加入檔案,請確認 PRODUCT_PACKAGES
包含
fs_config_dirs
和/或 fs_config_files
,以便
請安裝在「/system/etc/fs_config_dirs
」中
/system/etc/fs_config_files
。建構系統
在 中搜尋自訂 android_filesystem_config.h
$(TARGET_DEVICE_DIR)
,其中 BoardConfig.mk
存在。
如果這個檔案位於其他地方,請設定主機板設定變數
TARGET_ANDROID_FILESYSTEM_CONFIG_H
:指向該位置。
設定檔案系統
如要在 Android 6.0 以上版本設定檔案系統,請按照下列步驟操作:
- 建立
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
檔案。 - 將
fs_config_dirs
和/或fs_config_files
加入PRODUCT_PACKAGES
(例如$(TARGET_DEVICE_DIR)/device.mk
)。
覆寫範例
這個範例顯示覆寫 system/bin/glgps
Daemon 開始支援 Wake Lock
device/vendor/device
目錄內。保留
注意:
- 每個結構項目都是 mode、uid、gid、功能和名稱。
system/core/include/private/android_filesystem_config.h
是 自動提供各種資訊清單 #defines (AID_ROOT
、AID_SHELL
、CAP_BLOCK_SUSPEND
)。 android_device_files[]
部分包含以下項目的動作: 如未指定,則禁止存取system/etc/fs_config_dirs
。 可做為額外的 DAC 防護,避免目錄缺少內容 覆寫值然而,這種防護方式較弱;如果某位使用者擁有/system
,他們通常可以執行任何動作。
diff --git a/android_filesystem_config.h b/android_filesystem_config.h new file mode 100644 index 0000000..874195f --- /dev/null +++ b/android_filesystem_config.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +/* This file is used to define the properties of the file system +** images generated by build tools (eg: mkbootfs) and +** by the device side of adb. +*/ + +#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS +/* static const struct fs_path_config android_device_dirs[] = { }; */ + +/* Rules for files. +** These rules are applied based on "first match", so they +** should start with the most specific path and work their +** way up to the root. Prefixes ending in * denotes wildcard +** and will allow partial matches. +*/ +static const struct fs_path_config android_device_files[] = { + { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND), "system/bin/glgps" }, +#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS + { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" }, +#endif +}; diff --git a/device.mk b/device.mk index 0c71d21..235c1a7 100644 --- a/device.mk +++ b/device.mk @@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \ libwpa_client \ hostapd \ wpa_supplicant \ - wpa_supplicant.conf + wpa_supplicant.conf \ + fs_config_files ifeq ($(TARGET_PREBUILT_KERNEL),) ifeq ($(USE_SVELTE_KERNEL), true)
從先前版本遷移檔案系統
遷移 Android 5.x 以下版本的檔案系統時,請注意下列事項 Android 6.x 版
- 移除部分包含、結構和內嵌定義。
- 需要
libcutils
的參照,而非直接執行system/core/include/private/android_filesystem_config.h
起。 裝置製造商私人執行檔時,依附元件是system/code/include/private_filesystem_config.h
代表檔案,或 目錄結構或fs_config
必須新增libcutils
程式庫依附元件 - 需要裝置製造商私人分支版本的
system/core/include/private/android_filesystem_config.h
搭配 與現有目標相關的額外內容device/vendor/device/android_filesystem_config.h
。 - 保留將 SELinux 必要存取控制 (MAC) 套用至
包括在目標系統中的
使用
fs_config()
確定目標執行檔必須確保存取。