[꼭대기]안 드 로 이 드 4.0 바 텀 핵심 서비스 추가
1. 왜 밑바닥 핵심 서 비 스 를 써 야 합 니까?
밑바닥 핵심 서 비 스 는 Android 프레임 에서 가장 가 깝 습 니 다. 리 눅 스/드라이버 부분.하드웨어 설비 의 차별 화 특성 을 충분히 발휘 하기 위해 핵심 서 비 스 는 상부 에 양보 하 는 것 이다. 자바 응용 프로그램 사용 Driver/HW Device 특색 있 는 중요 한 파이프.예컨대 Media、 Telephone 등 바 텀 하드웨어.
켜 는 과정 에서 핵심 서비스(한자 입력 법 서비스 등)를 시작 해 여러 애플 리 케 이 션 이 함께 사용 할 수 있 도록 했다.공용 하기 때문에 효과적으로 낮 출 수 있다 Java 응용 프로그램의 크기( Size)。
2. 핵심 서비스 와 Java 층 의 Service 는 어떤 차이 와 관계 가 있 습 니까?
Android 는 2 층 서 비 스 를 가지 고 있 습 니 다.
--자바 계층 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 원본 프레임 워 크/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.add
LOGE("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 := optional
LOCAL_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();// ServiceManager
LOGI("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.cpp
LOCAL_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 addservice /system/bin/addserver //장차 /시스템/bin/addserver 는 서비스 로 시작 합 니 다.서비스의 이름 은? addservice.
마지막 으로 종료 android/디 렉 터 리 에서 전체 컴 파일 실행:
입력 . build/envsetup.sh
Lunch
Make
완성 후
에 뮬 레이 터 시 뮬 레이 터 열기
다른 것 열기 셸 터미널 입력 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. */
@Override
public 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());
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.