小编最近在把Hook binder通信的ioctl函数部分移植到android5.0时,遇到了以下问题并得到如下解决方案。
代码如下:
int new_ioctl (int __fd, unsigned long int __request, void * arg) { LOGV("New ioctl called!%x,%x= BINDER_WRITE_READ \n",__request,BINDER_WRITE_READ); if ( __request == BINDER_WRITE_READ ) { … } int res = (*old_ioctl)(__fd, __request, arg); return res; }
通过log信息可发现程序运行时__request = 0xc0186201,而BINDER_WRITE_READ = 0xc0306201。
程序是在Ubuntu64 14.04.1 Android 5.0.0源码编译环境下编译的,运行环境是Google Nexus 6 Android 5.0 32位。
通过查看源码可知,0x18代表binder_write_read结构体在手机运行时的大小,而0x30代表binder_write_read结构体在编译时的大小。#define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read) #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) #define _IOC(dir,type,nr,size) (((dir) << _IOC_DIRSHIFT) | ((type) << _IOC_TYPESHIFT) | ((nr) << _IOC_NRSHIFT) | ((size) << _IOC_SIZESHIFT)) #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) #define _IOC_TYPEBITS 8 #define _IOC_NRBITS 8 #define _IOC_NRSHIFT 0
由此可知,在源码编译环境下binder通信部分默认编译为64位。
从源码http://androidxref.com./5.0.0_r2/xref/bionic/libc/kernel/uapi/linux/binder.h中也可发现android5.0.0新增加以下内容:
#ifdef BINDER_IPC_32BIT typedef __u32 binder_size_t; typedef __u32 binder_uintptr_t; #else typedef __u64 binder_size_t; typedef __u64 binder_uintptr_t; #endif
最后分享一下android5.0源码编译的classes.jar吧
http://download.csdn.net/detail/phoebe_2012/8700753