[英]Add native service to aosp
我試圖將用C ++編寫的本機服務添加到AOSP構建中。
我要做的第一件事是為AOSP構建創建本機服務和客戶端。
這按預期工作。 我可以在adb shell中啟動該服務,然后通過adb shell上的活頁夾調用它。
當我想使用init啟動服務時,麻煩就開始了。
我在構建中添加了.rc文件
service myp /system/bin/myp_service
class main
這樣做成功了,所以init嘗試啟動它,但是由於SELinux策略而失敗。
因此,我在設備樹中添加了一個file_contexts
並添加了:
/system/bin/myp_service u:object_r:myp_exec:s0
接下來,我添加了myp.te文件並添加了:
type myp, domain;
type myp_exec, exec_type, file_type;
type myp_service, service_manager_type;
init_daemon_domain(myp)
net_domain(myp)
binder_use(myp)
binder_service(myp)
add_service(myp, myp_service)
binder_call(myp, binderservicedomain)
binder_call(myp, appdomain)
allow myp myp_service:service_manager add;
最后,我添加了一個service_contexts
文件:
myp u:object_r:myp_service:s0
這最終使我的服務在啟動時成功啟動。 不幸的是,我不能對本服務使用活頁夾。 當我嘗試與客戶連接到服務時,電話
defaultServiceManager()->getService(String16("Demo"))
返回一個空指針。
我在dmesg
找不到任何提示。 所以我認為我仍然缺少SElinux的東西,但是我不知道我缺少什么。
如果我使用setenforce
關閉SELinux並重新啟動服務,則它可以正常工作。
誰能給我一個提示,我對於SELinux缺少什么,或者在哪里可以獲得有關哪些策略阻止了某些內容的更多信息?
您會看到這樣的拒絕:
adb logcat | grep "SELinux : avc" > /tmp/logs
adb pull sepolicy
。 audit2allow
(位於AOSP源代碼: external / selinux / prebuilts / bin / audit2allow或SDK工具中。執行以下操作: cat /tmp/logs | .external/selinux/prebuilts/bin/audit2allow -p sepolicy
audit2allow工具將告訴您所提取的logcat和當前sepolicy文件缺少哪些權限,請當心 ,因為您可能需要執行幾次此操作,因為修復某些權限將顯示下一個所需的權限。
如果您使用的是userdebug類型的構建,則可以獲取setenforce 0
,logcat以及所有拒絕,即使您被允許執行所需的操作,也都將包含在logcat中。 這將保留1中所需的audit2allow迭代。
對於遇到此問題的任何人,請確保您的service_contexts
文件已成功與service_contexts
文件合並。 如果您要為Android O或更高版本構建服務,請將該文件放在文件夾中,並通過BOARD_PLAT_PRIVATE_SEPOLICY_DIR
1在Makefile中進行BOARD_PLAT_PRIVATE_SEPOLICY_DIR
。 如果構建系統確實選擇了service_contexts
則無需添加allow myp default_android_service:service_manager add
。
另外,關於domain.te
違規問題,您可能想將coredomain
或appdomain
屬性之一附加到您的域2中 , typeattribute <your_domain> <attribute>;
。
最后,請仔細檢查以下構建文件,以確保在最終構建中不會遺漏任何Sepolicy配置:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.