1.http://blog.youkuaiyun.com/yongyu_it/article/details/54629675
2.http://blog.youkuaiyun.com/zhx6044/article/details/47342227
AOSP版本:Android-7-0-0_r6
项目结构:位于android-7-0-0_r6\frameworks\native\services\thinking_test下

1、service:native service的主体,即服务的实现部分
2、server:native service的载体,即启动和注册服务的部分。
3、client:客户端程序,服务调用封装。
4、test:测试client
------------------------------------------------------------------------------------------------------------------------------------------
service
ThinkingService.h
- #ifndef THINKING_SERVICE_H
- #define THINKING_SERVICE_H
-
- #include <utils/RefBase.h>
- #include <binder/IInterface.h>
- #include <binder/Parcel.h>
-
- #include <android/log.h>
- #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)
-
- namespace android{
- class ThinkingService : public BBinder
- {
- private:
-
- public:
-
- static int Instance();
- ThinkingService();
- virtual ~ThinkingService();
-
-
- virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
- };
- }
-
- #endif
ThinkingService.cpp
- #include <binder/IServiceManager.h>
- #include <binder/IPCThreadState.h>
- #include "ThinkingService.h"
-
- namespace android
- {
- static pthread_key_t sigbuskey;
- int ThinkingService::Instance()
- {
- LOGE("-----------ThinkingService-->Instance \n");
- int ret=defaultServiceManager()->addService( String16("thinking.svc"),new ThinkingService());
- LOGE("-----------ThinkingService-->Instance %d \n",ret);
- return ret;
- }
-
- ThinkingService::ThinkingService()
- {
- LOGE("-----------ThinkingService");
- pthread_key_create(&sigbuskey,NULL);
- }
-
- ThinkingService::~ThinkingService()
- {
- LOGE("-----------~ThinkingService");
- pthread_key_delete(sigbuskey);
- }
-
- status_t ThinkingService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
- {
- switch(code)
- {
- case 0:
- {
- int a=data.readInt32();
- int b=data.readInt32();
- reply->writeInt32(a*b);
- return NO_ERROR;
- }
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
- }
- }
Android.mk
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=ThinkingService.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libbinder
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=libThinkingService
- LOCAL_PRELINK_MODULE:=false
- LOCAL_LDLIBS += -llog
- include $(BUILD_SHARED_LIBRARY)
------------------------------------------------------------------------------------------------------------------------------------------
server
ThinkingServer.cpp
- #include <stdio.h>
- #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 "../service/ThinkingService.h"
-
- using namespace android;
-
- int main(int arg, char** argv)
- {
- printf("ThinkingService start register \n");
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- int ret=ThinkingService::Instance();
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- return 0;
- }
Android.mk
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=ThinkingServer.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libbinder libThinkingService
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=ThinkingServer
- include $(BUILD_EXECUTABLE)
------------------------------------------------------------------------------------------------------------------------------------------
- #ifndef THINKING_CLIENT_H
- #define THINKING_CLIENT_H
-
- namespace android
- {
- class ThinkingClient
- {
- public:
- int setData(int a,int b);
- private:
- static void getThinkingService();
- };
- }
-
- #endif
ThinkingClient.cpp
- #include <binder/IServiceManager.h>
- #include <binder/IPCThreadState.h>
- #include "ThinkingClient.h"
-
- namespace android
- {
- sp<IBinder> binder;
-
- int ThinkingClient::setData(int a,int b)
- {
- getThinkingService();
- Parcel data,reply;
- data.writeInt32(a);
- data.writeInt32(b);
- binder->transact(0, data, &reply);
- int result=reply.readInt32();
- return result;
- }
-
- void ThinkingClient::getThinkingService()
- {
- sp<IServiceManager> sm = defaultServiceManager();
- binder = sm->getService(String16("thinking.svc"));
- if(binder == 0)
- return;
- }
- }
Android.mk
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=ThinkingClient.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libbinder
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=libThinkingClient
- LOCAL_PRELINK_MODULE:=false
- include $(BUILD_SHARED_LIBRARY)
------------------------------------------------------------------------------------------------------------------------------------------
test.cpp
- #include <stdio.h>
- #include "../client/ThinkingClient.h"
-
- using namespace android;
-
- int main(int argc, char** argv)
- {
- ThinkingClient client;
- int result=client.setData(1,2);
- printf("result is %d \n",result);
- return 0;
- }
Android.mk
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=test.cpp
- LOCAL_SHARED_LIBRARIES:=libThinkingClient
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=ThinkingTest
- include $(BUILD_EXECUTABLE)
------------------------------------------------------------------------------------------------------------------------------------------
整个项目的Android.mk文件(即android-7-0-0_r6\frameworks\native\services\thinking_test\Android.mk)
- include $(call all-subdir-makefiles)
------------------------------------------------------------------------------------------------------------------------------------------
[yong@localhost android-7-0-0_r6]$ cd frameworks/native/services/thinking_test
[yong@localhost thinking_test]$ mm
[yong@localhost android-7-0-0_r6]$ ls out/target/product/angler/system/lib
可以看到
[yong@localhost android-7-0-0_r6]$ ls out/target/product/angler/system/bin
可以看到
2、用adb命令将编译结果push到测试手机里面去
Z:\AndroidSourceCode\android-7-0-0_r6>adb push .\out\target\product\angler\system\lib\libThinkingClient.so /system/lib/
[100%] /system/lib/libThinkingClient.so
Z:\AndroidSourceCode\android-7-0-0_r6>adb push .\out\target\product\angler\system\lib\libThinkingService.so /system/lib/
[100%] /system/lib/libThinkingService.so
Z:\AndroidSourceCode\android-7-0-0_r6>adb push .\out\target\product\angler\system\bin\ThinkingServer /system/bin/
[100%] /system/bin/ThinkingServer
Z:\AndroidSourceCode\android-7-0-0_r6>adb push .\out\target\product\angler\system\bin\ThinkingTest /system/bin/
[100%] /system/bin/ThinkingTest
3、测试
Z:\AndroidSourceCode\android-7-0-0_r6>adb shell
angler:/system/bin # ./ThinkingServer &
[1] 16230
angler:/system/bin # ThinkingService start register
angler:/system/bin # ./ThinkingTest
result is 2
angler:/system/bin #
编译优化
如果嫌mm的方式麻烦
可在android-7-0-0_r6\build\target\product\base.mk添加如下代码
- PRODUCT_PACKAGES += \
- ......
- libThinkingService \
- libThinkingClient \
- ThinkingServer \
- ThinkingTest \
- ......
即可将这些模块加入AOSP编译系统,这样直接make,就可得到包含这些模块的输出结果(system.img)