日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android4.0添加底层核心服务

發布時間:2025/4/5 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android4.0添加底层核心服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、為?Android添加底層核心服務

1.?????為什么要寫底層核心服務呢?

?????????因為底層核心服務是?Android框架里最接近?Linux/Driver的部分。為了充分發揮硬件設備的差異化特性,核心服務是讓上層?Java應用程序來使用?Driver/HW Device?特色的重要管道。例如?Media、?Telephone等底層硬件。

???????在開機過程中,就可以啟動核心服務(漢字輸入法服務等),讓眾多應用程序來共同使用。由于共用,所以能有效降低?Java應用程序的大小(?Size)。

2.?????核心服務與?Java?層的?Service有何區別和關系?

???????Android具有兩層服務

?????????????--Java層?SDK-based Service

?????????????--C++層的?Code Service

????

?

3.?編寫自己的核心服務(?C++?層)

1).?要點

??????核心服務通常在獨立的進程(?Process?)里執行。

??????必須提供?IBinder?接口,讓應用程序可以進行跨進程的綁定(?Binding?)和調用。

??????因為共用,所以必須確保多線程安全(?Thread-safe?)。

????? 使用?C++?來實現,并調用?IServiceManager::addService()?函數添加到系統的?Binder Driver?里。

????? 上層應用程序通過?ServiceManager?獲取該服務。

????? 上層應用程序通過?IBinder::transact()?函數來與核心服進行數據交互。

2).?添加服務

下面詳細介紹如何添加一個底層服務到系統中,假設服務名為?TestService?,其用途是對傳入的參數加上?1000?,并返回結果。

服務實現

??????進入?android?源碼的frameworks/base?,在該目錄下建立自己的目錄,假設為?Testservice?,再在這個目錄中建立兩個子目錄?Testserver?和libTestservice?,?Testserver?用于存放服務的啟動文件,其最終的生成為可執行文件,在系統啟動的時候運行,?libTestservice?用于存放服務的實現文件,最終會生成動態鏈接庫,有?addserver?調用。

首先,服務的實現文件libTestservice?包括兩個文件,TestService.h?和?TestService.cpp?,

以下是?TestService.h?:

#ifndef ANDROID_JOBEN_TEST_SERVICE_H #define ANDROID_JOBEN_TEST_SERVICE_H#include <utils/RefBase.h> #include <binder/IInterface.h> #include <binder/Parcel.h> #include <utils/threads.h>namespace android {class TestService:public BBinder{//從BBinder 派生, 實現本地接口public:static int instantiate();TestService();virtual ~TestService();virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);}; };//namespace #endif


然后是服務的實現文件?TestService.cpp?:

#include "TestService.h" #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h>namespace android {static struct sigaction oldact;static pthread_key_t sigbuskey;//把自己注冊到系統中int TestService::instantiate(){LOGE("--JOBEN--TestService instantiate");int r = defaultServiceManager()->addService(String16("joben.add"), new TestService());//這里主要是把 //TestService這個服務添加到Binder Driver 中服務名為joben.addLOGE("TestService r = %d/n", r);return r;}//構造函數TestService::TestService(){LOGV("TestService created");//mNextConnId = 1;pthread_key_create(&sigbuskey, NULL);}//析構函數TestService::~TestService(){pthread_key_delete(sigbuskey);LOGV("TestService destroyed");}//這個是服務具體的本地實現, 功能實現都應該放在這里面,通過傳入執行代碼(code)//的不同來執行不同的操作,上層隱射為不同的api。status_t TestService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {switch(code){case 0: {//根據code的不同執行不同的操作pid_t pid = data.readInt32();int num = data.readInt32();num = num + 1000;reply->writeInt32(num);return NO_ERROR;}break;default:return BBinder::onTransact(code, data, reply, flags);}}};//namespace


以下是編譯服務的?Android.mk?,和上面的?cpp?放在一起。

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_SRC_FILES += TestService.cpp LOCAL_C_INCLUDE := $(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libandroid_runtime LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libTest include $(BUILD_SHARED_LIBRARY)?

在命令行中退出到?android/目錄級?加載編譯環境?. build/envsetup.sh

然后?lunch。

然后選擇你的具體平臺

然后在?cd /frameworks/base/addservice/libaddservice/?目錄?輸入?mm

之后在?out?目錄產出?libTest.so?文件。

在此?完成核心服務第一步。

服務進程實現

??????? 進入到?cd??/android/frameworks/base/Testservice/Testserver/?目錄

???? 增加一個文件?Testserver.cpp?,文件內容如下:

?

#include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <utils/Log.h> #include <private/android_filesystem_config.h> //#include <libadd/AddService.h> #include "../libtestservice/TestService.h"using namespace android;int main(int argc, char **argv) {sp<ProcessState>proc(ProcessState::self());sp<IServiceManager>sm = defaultServiceManager();//取得ServiceManagerLOGI("ServiceManager:%p", sm.get());TestService::instantiate();//把自己添加到ServiceManager中ProcessState::self()->startThreadPool();//啟動緩沖池IPCThreadState::self()->joinThreadPool();//這里是把服務添加到Binder閉合循環進程中 }


以上為底層服務的標準操作。

下面是這個服務?Android.mk:

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_SRC_FILES += \testserver.cppLOCAL_SHARED_LIBRARIES := \libTest \libutils \libbinder LOCAL_MODULE := addserver include $(BUILD_EXECUTABLE)


退出后當前目錄執行?mm即可在?out目錄的?system/bin下產出?addserver可執行文件。

實現服務進程開機自動運行

進入到?/android/system/core/rootdir/目錄中有個?init.rc文件

vi init.rc

在?service中添加

service addservice????/system/bin/addserver????//將?/system/bin/addserver作為一個服務啟動,服務的名稱為?addservice(這個不重要)。

?

最后退出到?android/目錄下執行全編譯:

輸入?. build/envsetup.sh

Lunch

Make

完成之后

Emulator打開模擬器

打開另一個?shell終端?輸入?adb shell????進入模擬器模式??????如果?adbshell系統提示沒有發現該命令?就在?android/out/host/linux-x86/bin/中輸入???./adb shell??

在輸入?ps??查看進程???找到是否有?addserver進程

如果有就成功一半。

測試我們的服務

隨便在?app中?建立一個簡單的應用程序,

這里可以直接在?eclipse?中建立好工程?拷貝到?android/packages/apps?中,然后為應用添加一個?Android.mk?文件,可以從其他應用中拷貝來修改。

在應用程序中測試服務的代碼:

package cn.toltech.testserver;import android.app.Activity; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; import android.util.Log; import android.os.Process;public class TestServerActivity extends Activity {private static final String TAG = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}private void test(){try{IBinder binder = ServiceManager.getService("joben.add");// 取得服務Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();if(binder == null)Log.d(TAG,"failed to get service");data.writeInt(Process.myPid());// 固定操作data.writeInt(100);// 傳入參數binder.transact(0, data, reply, 0);// 執行遠程調用Log.d(TAG,"result="+reply.readInt());// 驗證結果}catch(Exception e){Log.d(TAG,e.toString());}} }

總結

以上是生活随笔為你收集整理的Android4.0添加底层核心服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。