[꼭대기]안 드 로 이 드 4.0 바 텀 핵심 서비스 추가

위 하 다 Android 기본 핵심 서비스 추가
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());

        }

    }
}

좋은 웹페이지 즐겨찾기