通过编译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)的更多相关文章

  1. Android反编译工具的使用-Android Killer

    今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...

  2. Android反编译获取源码-android学习之旅(70)

    上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...

  3. Android反编译获取资源文件-android学习之旅(69)

    有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两 ...

  4. 基于android studio编译工具下的android开发之IBeacon 例子

    想直接看主要内容的请调到红字下面. 之所以会接触到android下的IBeacon,是因为我自己导师给的任务.一个网址http://estimote.com/和一句话:看看这个网站,然后试下在安卓手机 ...

  5. 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\ ...

  6. android ndk编译x264开源(用于android的ffmpeg中进行软编码)

    http://blog.csdn.net/u012917616/article/details/40921833 不废话,直接上.sh脚本: export NDK=/home/xxx/my_softw ...

  7. Android反编译工具的用法

    Android的APK文件时可以反编译的,通过反编译我们就能查看到大体的代码,帮助学习.反编译仅仅提供的是学习的方式,禁止使用该技术进行非法活动. 其实就是两个命令: 1:运行(WIN+R)-> ...

  8. Android反编工具的使用-Android Killer

    今天百度搜索"Android反编译"搜索出来的结果大多数都是比較传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比較方便操作的Android ...

  9. AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机)

    AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机) 特别感谢google官方文档及AOSP源代码开放 參考链接: https://source.a ...

随机推荐

  1. Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...

  2. Swift中关于任意类型的数组

    在Objc中你是不可以把一个非对象类型放入数组的,你必须将其"封箱",然后再放入数组. 在Swift中你可将非对象类型轻松放入数组: let ary = [1,2,3] 你可以明确 ...

  3. Activity平移动画

    Activity平移动画 效果图 添加动画文件 在res下添加anim文件夹,在anim下添加几个动画文件,分别是进入和退出的动画时间和移动距离,属性很简单,一看就懂,不磨叽了. tran_next_ ...

  4. Hive-ORC文件存储格式(续)

    本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式. 一.表结构 库名+表名:fileformat.test_orc 字段 类型 category_ ...

  5. 设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

    我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像 T ...

  6. 为什么选择C++

    为什么选择C++,怎么不选其它语言呢? 为什么不选择C? 因为C++比C简单点~ 为什么不选择C#? 因为C++可以在所有操作系统上使用. 为什么不选择JAVA? 因为C++的性能好一点~ 还有其他的 ...

  7. 闪屏页面开发遇到的问题you need to use a theme.appcompat theme (or descendant)

    开始做一个新闻客户端的应用,在做到闪屏页面时之前发布应用的时候总是报错,原因是我在splash.java中把Activty写成ActionBarActivity,导包,然后就可以了.以前也遇到过这种情 ...

  8. 为何不能在viewDidLoad方法中显示其他视图

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 你可以使得当视图控制器(view controller)显示自 ...

  9. 安卓高仿QQ头像截取升级版

    观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图:   为了适应大家不同需求,这次打了两个包,及上图 ...

  10. 算法之路(二)呈现O(logN)型的三个算法

    典型时间复杂度 我们知道算法的执行效率,可以从它的时间复杂度来推算出一二.而典型的时间复杂度有哪些类型呢? 由上图,可以看出,除了常数时间复杂度外,logN型的算法效率是最高的.今天就介绍三种非常ea ...