Android 5.0 Binder编译问题及解决方案


小编最近在把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_32BITtypedef __u32 binder_size_t;typedef __u32 binder_uintptr_t;#elsetypedef __u64 binder_size_t;typedef __u64 binder_uintptr_t;#endif

因而在编译时需加入 #define BINDER_IPC_32BIT

最后分享一下android5.0源码编译的classes.jar吧

http://download.csdn.net/detail/phoebe_2012/8700753




更多相关文章

  1. Android(安卓)Studio重写方法时参数显示异常的解决方法
  2. android android.support.v4.util.Pools 源码解析
  3. Android应用程序获取system权限
  4. LeakCanary源码解析之检测篇
  5. ARouter使用及源码简析
  6. Android(安卓)Studio加载第三方jar包,出现包重复加载的问题解决(:a
  7. android ant打包注意
  8. DEX 方法超过64K限制和gradle编译OOM问题解决
  9. Android(安卓)源码编译make的错误处理

随机推荐

  1. mySQL库编码,PHP页面编码和mysql_query("s
  2. MySQL计数器表的设计
  3. 登录使用PHP并´t显示任何html代码
  4. Ubuntu+Django+Nginx+uWSGI+Mysql搭建Pyt
  5. 请教mysql表分区后性能问题
  6. MySQL数据库的删除操作delete和truncate
  7. Oracle相当于MySQL代码“插入虚拟”以返
  8. java获取MySQL自动的int类型的Id
  9. java实现定时备份mysql数据库-----已通过
  10. mysql 自增列id 最大为多少 一直insert会