Android通过编译源代码提供系统服务-android学习之旅(85)
通过编译android4.1.2的源代码,添加一个FregServer的系统服务,以及一个服务代理FregClient
具体分为三部分,client,common,server,common中规定了client和common的接口,和一些公共方法
client部分代码
#define LOG_TAG "FregTest"
#include <utils/Log.h>
#include <binder/IServiceManager.h>
#include "../common/IFregService.h"
int main()
{
IServiceManager = defaultServiceManager();
sp<IBinder> binder = defaultServiceManager()->getService(String16(FREG_SERVICE)); //通过servicemanager获取名为xxx的Service的BpBinder代理对象
if(binder == NULL) {
ALOGE("[C] Failed to get freg service: %s.\n", FREG_SERVICE);
return -1;
}
ALOGE("[C] Got BpBinder");
sp<IFregService> service = IFregService::asInterface(binder); //将bpbinder代理对象封装为bpfregservice对象
if(service == NULL) {
ALOGE("[C] Failed to get freg service interface.\n");
return -2;
}
ALOGE("[C] Got BpFregService");
ALOGE("[C] Reading original value from FregService.\n");
int32_t val = service->getVal();
ALOGE("[C] Result: %d.\n", val);
sleep(15);
ALOGE("[C] Add value 1 to FregService.\n");
val += 1;
service->setVal(val);
ALOGE("[C] Reading the value from FregService again:\n");
val = service->getVal();
ALOGE("[C] Result: %d.\n", val);
return 0;
}
mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := ../common/IFregService.cpp \
FregClient.cpp
LOCAL_SHARED_LIBRARIES:= libcutils libutils libbinder
LOCAL_MODULE := FregClient
include $(BUILD_EXECUTABLE)
Server部分
#define LOG_TAG "FregTest"
#include <stdlib.h>
#include <fcntl.h>
#include <utils/Log.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include "../common/IFregService.h"
#define FREG_DEVICE_NAME "/dev/freg"
class FregService : public BnFregService
{
public:
FregService()
{
val = 0;
ALOGE("[S] Tread: %d. In FregService().", gettid());
}
virtual ~FregService()
{
ALOGE("[S] Tread: %d. In ~FregService().", gettid());
}
public:
static void instantiate()
{
defaultServiceManager()->addService(String16(FREG_SERVICE), new FregService()); //获取servicemanager并调用addService函数实现服务注册
ALOGE("[S] Tread: %d. instantiate(), addService-%s", gettid(), FREG_SERVICE);
}
int32_t getVal()
{
ALOGE("[S] Tread: %d. In getVal(), val-%d returned.", gettid(), val);
return val;
}
void setVal(int32_t v)
{
val = v;
ALOGE("[S] Tread: %d. In setVal(), val-%d set.", gettid(), val);
}
private:
int val;
};
int main(int argc, char** argv)
{
FregService::instantiate();
ProcessState::self()->startThreadPool(); //启动线程池
ALOGE("[S] Tread: %d. ProcessState::self()->startThreadPool() finished.", gettid());
IPCThreadState::self()->joinThreadPool(); //将主线程加入线程池
ALOGE("[S] Tread: %d. IPCThreadState::self()->joinThreadPool(); finished.", gettid());
return 0;
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := ../common/IFregService.cpp \
FregServer.cpp
LOCAL_SHARED_LIBRARIES:= libcutils libutils libbinder
LOCAL_MODULE := FregServer
include $(BUILD_EXECUTABLE)
common部分
#define LOG_TAG "IFregService"
#include <utils/Log.h>
#include "IFregService.h"
using namespace android;
enum
{
GET_VAL = IBinder::FIRST_CALL_TRANSACTION,
SET_VAL
};
class BpFregService: public BpInterface<IFregService> //通信请求的发送
{
public:
BpFregService(const sp<IBinder>& impl)
: BpInterface<IFregService>(impl)
{
}
public:
int32_t getVal()
{
Parcel data;
data.writeInterfaceToken(IFregService::getInterfaceDescriptor()); //获取了Ifregservice的接口名,并调用了parcel.writeInterfaceToken函数写入了data中
Parcel reply;
remote()->transact(GET_VAL, data, &reply); //remote获取bpbinder代理对象,通过transact函数来发送请求
int32_t val = reply.readInt32();
return val;
}
void setVal(int32_t val)
{
Parcel data;
data.writeInterfaceToken(IFregService::getInterfaceDescriptor());
data.writeInt32(val);
Parcel reply;
remote()->transact(SET_VAL, data, &reply);
}
};
IMPLEMENT_META_INTERFACE(FregService, "hikame.IFregService");//见最下
status_t BnFregService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) //通信数据的接收与处理
{
switch(code)
{
case GET_VAL:
{
CHECK_INTERFACE(IFregService, data, reply);
int32_t val = getVal();
reply->writeInt32(val);
return NO_ERROR;
}
case SET_VAL:
{
CHECK_INTERFACE(IFregService, data, reply);
int32_t val = data.readInt32();
setVal(val);
return NO_ERROR;
}
default:
{
return BBinder::onTransact(code, data, reply, flags);
}
}
}
/*IFregService的具体实现
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
const android::String16 I##INTERFACE::descriptor(NAME); \
const android::String16& \
I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::sp<I##INTERFACE> intr; \
if (obj != NULL) {
\
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) {
\
intr = new Bp##INTERFACE(obj); \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { } \
*/
#ifndef IFREGSERVICE_H_
#define IFREGSERVICE_H_
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#define FREG_SERVICE "hikame.FregService" //Service名称
using namespace android; //在各个头文件中namespace为android的代码部分都被使用了
class IFregService: public IInterface
{
public:
/*
#define DECLARE_META_INTERFACE(INTERFACE) \
static const android::String16 descriptor; \
static android::sp<I##INTERFACE> asInterface( \
const android::sp<android::IBinder>& obj); \
virtual const android::String16& getInterfaceDescriptor() const; \
I##INTERFACE(); \
virtual ~I##INTERFACE(); \
定义了构造函数和析构函数,descriptor是接口名,getInterfaceDescriptor是获取该接口名的函数
??这个android::sp是什么?A:/include/utils/StrongPointer.h
*/
DECLARE_META_INTERFACE(FregService);
virtual int32_t getVal() = 0;
virtual void setVal(int32_t val) = 0;
};
class BnFregService: public BnInterface<IFregService>
{
public:
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
};
#endif
好了放他们放到android-4.1.2_r1-JZO54K\external\binder目录下, external目录下可以放这些外来的服务
执行编译命令
1.通过xShell连接到远程的ubuntu服务器,里面下载了Android源代码
2.cd 到相应版本源代码的根目录
3.执行source build/envsetup.sh初始化环境
4.执行mmm ./external/binder/server/
5.执行mmm ./external/binder/client/ ,分别编译两个模块
6然后在out/target/product/gerneric/system/bin目录底下,查看相应的生成文件
下一步是把相应的服务文件拷贝到手机的/data/local/tmp目录下
1.代开adb shell,执行su,进入root模式
2.在服务文件的目录,按住shift右键,打开命令窗口
3.输入adb push FregServer /data/local/tmp,adb push FregClient /data/local/tmp,拷贝到相应的目录
4.su进入root模式,进入 /data/local/tmp目录,执行./FregClient
5.查看日志adb logcat FregTest:i *:s
部分截图
Android通过编译源代码提供系统服务-android学习之旅(85)的更多相关文章
- Android反编译工具的使用-Android Killer
今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...
- Android反编译获取源码-android学习之旅(70)
上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...
- Android反编译获取资源文件-android学习之旅(69)
有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两 ...
- 基于android studio编译工具下的android开发之IBeacon 例子
想直接看主要内容的请调到红字下面. 之所以会接触到android下的IBeacon,是因为我自己导师给的任务.一个网址http://estimote.com/和一句话:看看这个网站,然后试下在安卓手机 ...
- Cocos2dx Android环境编译出错:jni/Android.mk: Cannot find module with tag 'scripting/lua-bindings' in import path
解决方案为: 在项目proj.android\jni\Android.mk(D:\my_lua_test2\MyluaTest\frameworks\runtime-src\proj.android\ ...
- android ndk编译x264开源(用于android的ffmpeg中进行软编码)
http://blog.csdn.net/u012917616/article/details/40921833 不废话,直接上.sh脚本: export NDK=/home/xxx/my_softw ...
- Android反编译工具的用法
Android的APK文件时可以反编译的,通过反编译我们就能查看到大体的代码,帮助学习.反编译仅仅提供的是学习的方式,禁止使用该技术进行非法活动. 其实就是两个命令: 1:运行(WIN+R)-> ...
- Android反编工具的使用-Android Killer
今天百度搜索"Android反编译"搜索出来的结果大多数都是比較传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比較方便操作的Android ...
- AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机)
AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机) 特别感谢google官方文档及AOSP源代码开放 參考链接: https://source.a ...
随机推荐
- Ubuntu命令行启动Matlab
原文转自:http://blog.csdn.net/striker_v/article/details/52884485 小编安装的是Matlab R2015b,使用的是默认安装目录,安装在目录/us ...
- JUnit单元测试教程(翻译自Java Code Geeks)
JUnit单元测试教程--终极指南 JUnit单元测试教程终极指南 说明 单元测试简介 1 什么是单元测试 2 测试覆盖 3 Java中的单元测试 JUnit简介 1 使用Eclipse实现简单JUn ...
- 好久没有写BLOG了,人老了就开始变懒了【非技术】
算算到今天,在码农的路上已经走了15年了.马上就40不惑的我,现在是充满的疑惑.
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...
- Android Topeka介绍
概述 当你已经做Android开发一段时间,并苦于进入瓶颈,这个时候阅读一些优秀App的源码是最好的学习进阶方式,前几天,邀请去参加一个Android大会,我作为其中一个演讲者,专门讲解了Androi ...
- Python动态展现之一
首先: def f(): print('first') def g(): f() g() def f(): print('second') g() 结果: >>> first sec ...
- 破解Oracle ERP 密码
1. 写作目的 1 2. 利用Toad或其它pl/sql工具在Oracle ERP Database中建立Package,源码如下 1 (1). ...
- bmp格式图像的读写函数(对一个开源代码的封装)
在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...
- Python optparser库详解
一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常的使用了.废话不多说,开始今天的分享吧. 简介 optparse模块主要用 ...
- 获取imageView的图和背景图
img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属性) img2.setImageDrawable(img1.getDrawable()); 背景(对应 ...