日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

創建Android守護進程實例(底層服務)

瀏覽:345日期:2022-09-26 08:56:57

前言

Android底層服務,即運行在 linux 下的進程,是 Android 系統運行的基礎,完成 Android 或者說計算機最基本的功能。比如連接服務(包括 WIFI,BT 等等);比如 Android 的 adb 功能;比如存儲監控等等。沒有這些底層服務,上層也就沒有了對應的功能。

Android 底層服務往往是常駐內存,時刻運行完成任務。底層服務進程,往往具有更多的權限,可能和驅動通信,可能和 linux 內核通信,可能需要操作系統核心運行文件以及節點等等。所以,底層服務,可以幫你完成更多計算機基本功能。

本文所使用的 AOSP 是基于 Android 8.1。閱讀文本需要對 Android 的架構、編譯系統、AOSP工程和 SeAndroid 有基本認識。

創建守護進程

創建目錄編寫代碼

創建目錄

我們在 Android 系統通用守護進程目錄下創建我們的守護進程,當然你也可以在其它目錄下放置你的守護進程。

/system/core/

在上面的目錄下,創建守護進程的文件夾 nativeservice,那么,我們的守護進程就存在如下目錄,下文中稱簡稱目錄代表如下目錄。

/system/core/nativeservice/

編寫代碼

在目錄中創建主代碼文件 native_main.cpp。另外,我們需要編譯,那么就需要 mk 文件,創建一個 Android.mk 文件。這時,目錄架構就是如下這個樣子

創建Android守護進程實例(底層服務)

編寫Android.mk

我在代碼中盡可能的注釋清楚重要語句的作用,讀者如果對 Android AOSP 編譯不了解的,可以查閱更多 mk 語法的資料學習。

# Copyright 2013 The Android Open Source Project# 當前路徑LOCAL_PATH := $(call my-dir)#清除歷史變量include $(CLEAR_VARS)### nativeservice ####待編譯的源碼文件LOCAL_SRC_FILES := native_main.cpp common_c_includes := bionic system/core/include/sysutils #引用一些函數庫common_shared_libraries := libsysutils libcutils liblog libutils libbinder libbaseLOCAL_C_INCLUDES := $(common_c_includes)#守護進程的名字LOCAL_MODULE := nativeserviceLOCAL_CFLAGS := -Wall -Wno-unused-parameter -WerrorLOCAL_SHARED_LIBRARIES := $(common_shared_libraries)LOCAL_MODULE_TAGS := optional#編譯守護進程,也就是可執行文件#編譯后,在/system/bin/ 下,變多了 nativeservice 可執行文件。include $(BUILD_EXECUTABLE)

編寫native_main.cpp

在 Linux 中,一個開機啟動的服務,執行完后會自動退出,而我們是守護進程,那么就需要一直運行。讓程序一直運行有很多種方法。在 native_main.cpp 中貼出了三種方式,它們分別是 epoll,有名管道(FIFO)和循環。

epoll 的方式是 Android 系統比較常見的方式,系統的電池狀態變化、USB 接口狀態變化等守護進程便是通過 epoll 的方式,實時鑒定并讀取新狀態。

有名管道,在 IPC 通信中比較簡單、便捷,適合輕量級任務。

循環,這個是最老套的方式。

三種方式在 native_main.cpp 都貼出來了,本文側重使用有名管道(FIFO)的方式,鑒于篇幅過長,其它方式就一筆帶過了,如果讀者對 epoll 等較為興趣的,可以自行查閱更多資料學習。

下面是 native_main.cpp 的代碼,請認真看注釋哦。

//// Created familyyuan user on 18-4-20.//#include <errno.h>#include <string.h>#include <unistd.h>#include <cutils/log.h>#include <fcntl.h>#include <android-base/logging.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/epoll.h>#include <cutils/uevent.h>#include <sys/ioctl.h>#define MAX_EPOLL_EVENTS 40//epoll方式的 epoll fdstatic int epollfd;//FIFO 方式的 fdstatic int fifo_fd;//epoll方式的 uevent fdstatic int uevent_fd;#define BUFFER_SIZE PIPE_BUFint main(int argc, char *argv[]) { SLOGD('native_service start'); // // 1、epoll 的方式, // 監聽一個 socket,如果 socket 被連接,便激活程序讀取數據。 // Android 驅動和用戶態程序較多使用這種方式交互。 ///* int eventct = 5; struct epoll_event events[eventct]; struct epoll_event ev; uevent_fd = uevent_open_socket(64*1024, true); //創建 epoll 通道,監聽 socket fd epollfd = epoll_create(MAX_EPOLL_EVENTS); if (epollfd == -1) { SLOGD('native_service epoll_create failed'); } else { SLOGD('native_service epoll_create success'); } // fcntl(uevent_fd, F_SETFL, O_NONBLOCK); ev.events = EPOLLIN; ev.data.fd=uevent_fd; //注冊 epoll fd if (epoll_ctl(epollfd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) { SLOGD('native_service epoll_ctl failed'); } else { SLOGD('native_service epoll_ctl success'); } while(1){ SLOGD('native_service epoll running'); int nevents = 0; // 監聽 socket 端口 nevents = epoll_wait(epollfd, events, eventct, 100000); if (nevents == -1 || nevents == 0) { SLOGD('native_service epoll_wait failed'); } else { SLOGD('native_service epoll_wait success'); } epoll_ctl(epollfd, EPOLL_CTL_DEL, uevent_fd, &ev); } close(uevent_fd);*/ // // 2、 FIFO 的方式, // 在/mnt/下創建一個名為 nativeservice 的管道, // 監聽管道的數據變化,如果有數據寫入管道,便讀取數據。 // int res; int bytes = 0; char buffer[BUFFER_SIZE + 1]; // 創建 FIFO res = mkfifo('/mnt/nativeservice', 0777); if (res != 0){ SLOGD('native_service create fifo exist or failed'); } else{ SLOGD('native_service create fifo success'); } // 以阻塞的方式打開 FIFO,知道管道有數據寫入,激活程序,往下執行 fifo_fd = TEMP_FAILURE_RETRY(open('/mnt/nativeservice',O_RDONLY)); if (fifo_fd < 0) { SLOGD('native_service open failed'); } else { SLOGD('native_service open success'); } if (fifo_fd != -1){ while(1){ //讀取管道數據,如果沒有數據,阻塞等待數據被寫入,激活 res = read(fifo_fd, buffer, BUFFER_SIZE); bytes += res; SLOGD('native_service result=%s', buffer); } } else { SLOGD('native_service open failed'); } //關閉管道資源。 close(fifo_fd); // // 3、循環的方式 // 這種方式代碼最簡單,但是耗資源,沒有實時性。 // 一個死循環,每隔 5 秒運行一次 ///* while(1){ SLOGD('native_service runnig'); sleep(5); SLOGD('native_service wake'); }*/ SLOGD('native_service die'); return 0;}

推進編譯系統

編寫好 Android.mk 和 native_main.cpp 后,可以通過單邊命令 “mmm system/core/nativeservice” 編譯我們的守護進程了。但是此時用 make 編譯整個 AOSP 時,卻不會編譯我們的 nativeservice。因此,需要告訴編譯系統,編譯工程時,同時編譯 nativeservice。修改如下

創建Android守護進程實例(底層服務)

在 /build/make/target/product/core.mk 文件添加 nativeservice,當然不限制添加在這個文件,很多廠商的工程,也會增加自己的 PRODUCT_PACKAGES 配置 mk 文件。

配置開機啟動

至此,編譯整個工程,守護進程也可以被編譯了,這個時候,刷到手機是否就可以運行了呢?不會的,我們還需要讓守護進程在手機開機的時候運行起來,且運行中進程死掉的話,也需要重新啟動守護進程。方法如下

在 system/core/rootdir/init.rc 文件中添加如下代碼

service healthd /system/bin/healthd class core critical group root system wakelock#我們的代碼開始service nativeservice /system/bin/nativeservice class main #main類,屬于main的服務會開機被運行,且死掉會重啟 group system #屬于 system 組 #user system #以system用戶啟動,不設置以root用戶啟動 seclabel u:r:nativeservice:s0 #SeAndroid SContext,domain是nativeservice restorecon nativeservice#我們的代碼結束service console /system/bin/sh

讀者可以查看 AOSP 中 system/core/init/README.md 文件了解 init.rc 的語法和配置方法。對于 class core 等不同類別的區別,讀者可以閱讀《Android加密之全盤加密》相關的闡述。

配置SeAndroid

至此,編譯整個工程,守護進程也可以被編譯了,也配置了開機自啟動。這個時候,刷到手機是否就可以運行守護進程了呢?不可以,我們知道 Android 繼用了 SeLinux 安全機制,同時發展出 SeAndroid 機制,所有文件和進程都需要配置 SeAndroid 才能有權限。因此,如果沒有給守護進程以及守護進程需要操作的目錄和文件賦予權限,都會被 SeAndroid 過濾或禁止。

由于 QCOM 和 Mediatek 的不同,在相關文件的放置路徑會不同,但是方法都是一樣的,不同的平臺,找到對應的路徑下的文件就可以了。本文以 MTK 平臺的為例。

1、在 device/mediatek/sepolicy/basic/non_plat/file_contexts 中添加如下代碼

/system/bin/nativeservice u:object_r:nativeservice_exec:s0

2、在 device/mediatek/sepolicy/basic/non_plat/ 中添加 nativeservice.te 文件,文件內容如下

#守護進程 domain 為 nativeservicetype nativeservice, domain;typeattribute nativeservice coredomain;type nativeservice_exec, exec_type, file_type;init_daemon_domain(nativeservice)#allow nativeservice self:netlink_kobject_uevent_socket create_socket_perms_no_ioctl;#allow nativeservice tmpfs:file { getattr open read write ioctl create };#允許 nativeservice 在mnt目錄讀寫管道文件allow nativeservice tmpfs:fifo_file rw_file_perms;#允許 nativeservice 在mnt目錄創建管道文件allow nativeservice tmpfs:fifo_file create_file_perms;#允許 nativeservice 在mnt目錄讀寫allow nativeservice tmpfs:dir rw_dir_perms;#允許 nativeservice 在mnt目錄創建目錄allow nativeservice tmpfs:dir create_dir_perms;

刷機驗證

至此,需要編譯整個 AOSP 工程,當然,如果有編譯過,只需要增量編譯即可,很快就可以編譯完成。

1、刷機后在手機的 /system/bin/nativeservie 目錄下能看到守護進程;

創建Android守護進程實例(底層服務)

2、看一下 SeAndroid 的 SContext

創建Android守護進程實例(底層服務)

3、看一下 FIFO 管道文件

創建Android守護進程實例(底層服務)

4、prwx 前面的 p 代表是一個管道文件

創建Android守護進程實例(底層服務)

5、管道文件 SeAndroid 的 tcontext

創建Android守護進程實例(底層服務)

6、守護進程啟動,啟動后打開管道,等待管道數據寫入。由于守護進程比抓 log 的工具啟動還早,因此,開機時前面的 log 無法抓取,如下 log 是手動 kill 掉守護進程打印的 log

創建Android守護進程實例(底層服務)

7、通過終端給管道寫入數據

創建Android守護進程實例(底層服務)

8、守護進程激活,讀取數據

創建Android守護進程實例(底層服務)

總結

Android 守護進程可以做很多上層無法完成的功能,但是,為了安全,要運用好 SeAndroid,以最小能力的原則去配置安全權限。創建守護進程,要編寫對應代碼,配置 rc 文件,配置 SeAndroid。

以上這篇創建Android守護進程實例(底層服務)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
奇米色欧美一区二区三区| 国产福利电影在线播放| 久久中文精品| 老司机免费视频一区二区| 久久不卡国产精品一区二区| 老司机免费视频一区二区三区| 老鸭窝一区二区久久精品| 精品三级av| 日韩三区免费| 日韩一级精品| 一区视频在线| 日韩精品电影一区亚洲| 欧美日韩一区二区三区在线电影| 国产欧美另类| 夜鲁夜鲁夜鲁视频在线播放| 91九色精品| 日韩一区欧美二区| 日本成人在线不卡视频| 国产激情精品一区二区三区| 福利一区和二区| 蜜桃成人av| 日韩中文一区二区| 精品一区电影| 午夜电影亚洲| 国产欧美视频在线| 国产成年精品| 99在线精品视频在线观看 | 国产精品探花在线观看| 成人国产精品一区二区免费麻豆| 韩日一区二区三区| 日韩不卡在线观看日韩不卡视频| 国产91欧美| 午夜宅男久久久| 美女尤物国产一区| 不卡一区2区| 国产欧美一区二区精品久久久 | 99精品在线| 亚洲午夜久久| 欧美美女一区| 欧美a级一区二区| 免费久久99精品国产自在现线| 免费在线播放第一区高清av| 国产一区导航| 激情黄产视频在线免费观看| 中文字幕视频精品一区二区三区| 里番精品3d一二三区| 国产亚洲午夜| а√在线中文在线新版| 日韩在线观看中文字幕| 成人福利av| 清纯唯美亚洲综合一区| 成人免费电影网址| 国产麻豆精品| 日韩精品一级中文字幕精品视频免费观看 | 久久超级碰碰| 一区久久精品| 国产黄大片在线观看| 日韩三级精品| 亚洲国产日韩欧美在线| 国产成人久久精品一区二区三区| 亚洲三区欧美一区国产二区| 天堂日韩电影| 国产va免费精品观看精品视频| 在线一区二区三区视频| 久久久久国产精品一区二区| 欧美激情网址| 国产精品亚洲欧美| 日本中文字幕不卡| 日韩视频久久| 久久精品99久久无色码中文字幕| 国产精品一线| 日韩精品午夜视频| 香蕉成人久久| 亚洲欧美日韩在线观看a三区| 亚洲性色av| 福利片在线一区二区| 精品国产一区二区三区av片| 国产日韩免费| 亚洲一级淫片| 久久av一区二区三区| 五月婷婷六月综合| 色吊丝一区二区| 日韩av在线播放网址| 国产精品毛片aⅴ一区二区三区| 亚洲精一区二区三区| 国产视频一区三区| 午夜欧美精品| 亚洲视频播放| 玖玖精品视频| 亚洲免费福利一区| 香蕉久久一区| 日韩不卡在线观看日韩不卡视频| 日本91福利区| 国产精品入口久久| 国产亚洲久久| 久久久久九九精品影院| 欧美黑人巨大videos精品| 国产精品最新自拍| 久久精品国产福利| 国产传媒av在线| 国产aⅴ精品一区二区四区| 久久99蜜桃| 国产一区二区三区精品在线观看| 国产一区国产二区国产三区| 四虎成人av| 欧美日韩中文一区二区| 亚洲天堂成人| 一本色道久久精品| 国产农村妇女精品一二区| 激情自拍一区| 日韩在线播放一区二区| 日韩不卡手机在线v区| 国产精品自拍区| 精品国产乱码久久久久久1区2匹| 狠狠久久伊人| 国产suv精品一区二区四区视频| 香蕉成人av| 亚洲欧美日本日韩| 日本不卡不码高清免费观看| 国产欧美日韩免费观看| 色婷婷综合网| 亚洲欧美日本国产专区一区| 精品九九久久| 狠狠操综合网| 亚洲精品影视| 麻豆91小视频| 日韩中文影院| 免费人成在线不卡| 欧美国产中文高清| 久久国产中文字幕| 欧美日韩国产免费观看视频| 亚洲一级在线| 久久精品 人人爱| 亚洲免费福利| 亚洲精品少妇| jizzjizz中国精品麻豆| 欧美在线网站| 国产精品v亚洲精品v日韩精品| 天堂а√在线最新版中文在线| 自拍日韩欧美| 欧美aaaaaa午夜精品| 1024精品久久久久久久久| 亚洲视频国产| 精品久久网站| 欧美精品一线| 日韩欧美三区| 韩国精品主播一区二区在线观看| 亚洲精品精选| 日本在线高清| 亚洲精品一区二区在线播放∴| 激情不卡一区二区三区视频在线| 中国女人久久久| 精品国产不卡| 久久最新视频| 日韩欧美三级| 日韩高清成人在线| 亚洲va在线| 国产欧美日韩在线观看视频| 五月天综合网站| 国产成人久久精品麻豆二区| 视频在线观看一区| 日本蜜桃在线观看视频| 91午夜精品| 亚洲女同一区| 97欧美在线视频| **爰片久久毛片| 美女国产一区| 性欧美xxxx免费岛国不卡电影| 国产精品白浆| 日韩视频1区| 亚洲黄色影院| 蜜桃精品在线| 91欧美在线| 国产精品极品国产中出| 中文字幕一区二区三区在线视频| 成人美女视频| 麻豆精品99| 欧美一级一区| 亚洲v天堂v手机在线| 一本一道久久a久久精品蜜桃| 成人三级高清视频在线看| 国产精品一区二区av交换| 一本综合精品| 在线亚洲激情| 欧美日韩中文字幕一区二区三区| 精品午夜视频| 麻豆精品av| 国产精品日本一区二区不卡视频| 美女精品在线| 免费久久99精品国产自在现线| 久久精品影视| 亚洲综合在线电影| 日本高清不卡一区二区三区视频| 麻豆91在线播放| 精品99在线| 精品视频国产| 国产乱码午夜在线视频| a天堂资源在线| 天堂√中文最新版在线| 桃色av一区二区|