【ACCESS精品源码栏目提醒】:网学会员,鉴于大家对ACCESS精品源码十分关注,论文会员在此为大家搜集整理了“【代码】Android_框架层为IMountService_增加新接口 - 其它资料”一文,供大家参考学习!
【代码】Android 框架层为 IMountService 增加新接口在为 Android 增加多分区的支持时,可能会需要获得当前 USB 连接的挂载口,可能标准的Android 框架并未提供这样的接口给开发者,这时就需要我们自己为它提供接口了。
先来看一下上层(应用)如何得到一个 IMountService 的。
1 private synchronized IMountService getMountService 2 if mMountService null 3 IBinder service ServiceManager.getServicemount 4 if service null 5 mMountService IMountService.Stub.asInterfaceservice 6 else 7 Log.eTAG Cant get mount service 8 9 10 return mMountService 11 复制代码关于 Binder 可以参考下这篇文章:Android 深入浅出之 Binder 机制 。
Android 2.2新增接口Android 2.2为 IMountService 新增接口非常容易,在frameworks/base/core/java/android/os/storage 有一个 IMountService.aidl 文件,可以直接在这个文件里面新增一个接口提供给上层,如: 12 /add by terry/ 13 String getUsbMountPointPath复制代码该文件负责生成 IMountService.java 文件,接着进入frameworks/base/services/java/com/android/server , 开 MountService.java 该文件继 打承于 IMountService.aidl 生成的类 14 class MountService extends IMountService.Stub复制代码在这个类里面实现我们为 IMountService.aidl 新增的接口 15 public String getUsbMountPointPath 16 return usbMountPointPath 17 复制代码OK。
通过上面的操作, StorageManage 就可以很方便的得到这个为其新增的接口,上层便可以访问了。
编译步骤:1:编译 framework/base 生成 IMountService.java2:编译 framework/base/service 编译 MountService3:编译 framework/base 编译 StorageManage 以提供给上层调用Android 4.0 以上新增接口相比于 Android 2.2, Android 4.0框架层 为 IMountService 新增一个接口就显得比较复 在杂了。
按照 Android 2.2 新增接口的方法,我们会先进入frameworks/base/core/java/android/os/storage 查找 IMountService.aidl 文件,进入目录,ls 一下,会发现并没有该文件,取而代之的是 IMountService.java。
这是怎么回事?打开该文件:映入眼帘首先会看到该警告: 18 19 / 20 WARNING Update IMountService.h and IMountService.cpp if you change this 21 file. In particular the ordering of the methods below must match the 22 _TRANSACTION enum in IMountService.cpp 23 24 hide - Applications should use android.os.storage.StorageManager to
access 25 storage functions. 26 /复制代码该警告提示我们,如果要修改这个文件,必须先修改 IMountService.h 头文件和IMountService.cpp 文件 ,并且还需要注意枚举里面的顺序。
按照警告可以一步步修改了。
进入 frameworks/base/include/storage 打开 IMountService.h ,新增这个方法: 27 virtual int32_t getUsbMountPointPath 0 复制代码完成后进入 frameworks/base/libs/storage 打开 IMountService.cpp ,在枚举里面新增方法枚举: 28 enum 29 TRANSACTION_registerListener IBinder::FIRST_CALL_TRANSACTION 30 TRANSACTION_unregisterListener 31 TRANSACTION_isUsbMassStorageConnected 32 TRANSACTION_setUsbMassStorageEnabled 33 TRANSACTION_isUsbMassStorageEnabled 34 TRANSACTION_mountVolume 35 TRANSACTION_unmountVolume 36 TRANSACTION_formatVolume 37 TRANSACTION_getStorageUsers 38 TRANSACTION_getVolumeState 39 TRANSACTION_createSecureContainer 40 TRANSACTION_finalizeSecureContainer 41 TRANSACTION_destroySecureContainer 42 TRANSACTION_mountSecureContainer 43 TRANSACTION_unmountSecureContainer 44 TRANSACTION_isSecureContainerMounted 45 TRANSACTION_renameSecureContainer 46 TRANSACTION_getSecureContainerPath 47 TRANSACTION_getSecureContainerList 48 TRANSACTION_shutdown 49 TRANSACTION_finishMediaUpdate 50 TRANSACTION_mountObb 51 TRANSACTION_unmountObb 52 TRANSACTION_isObbMounted 53 TRANSACTION_getMountedObbPath 54 TRANSACTION_isExternalStorageEmulated 55 TRANSACTION_decryptStorage 56 TRANSACTION_encryptStorage 57 TRANSACTION_getUsbMountPointPath 58 复制代码接着新增要实现的方法 59 60 int32_t getUsbMountPointPath 61 62 Parcel data reply 63 data.writeInterfaceTokenIMountService::getInterfaceDescriptor 64 if remote-transactTRANSACTION_getUsbMountPointPath data reply NO_ERROR 65 LOGDgetVolumeState could not contact remoten 66 return -1 67 68 int32_t err reply.readExceptionCode 69 if err 0 70 LOGDgetVolumeState caught exception dn err 71 return err 72 73 return reply.readInt32 74 75 76复制代码OK,这个方法到了这里,CPP 部分就算完成了。
接下来可以为 IMountService.java 加接口了。
再次进入 frameworks/base/core/java/android/os/storage ,打开 IMountService.java 文件。
实现该接口,增加以下方法: 77 public String getUsbMountPointPath throws RemoteException 78 79 Parcel _data Parcel.obtain 80 Parcel _reply Parcel.obtain 81 String _result 82 try 83 _data.writeInterfaceTokenDESCRIPTOR 84 mRemote.transactStub.TRANSACTION_getUsbMountPointPath _data _reply 0 85 _reply.readException 86 _result _reply.readString 87 finally 88 _reply.recycle 89 _data.recycle 90 91 return _result 92 复制代码增加这个常量:static final int TRANSACTION_getUsbMountPointPath IBinder.FIRST_CALL_TRANSACTION 28在 onTransact 方法里面增加一个 case 判断: 93 case TRANSACTION_getUsbMountPointPath: 94 data.enforceInterfaceDESCRIPTOR 95 String state getUsbMountPointPath 96 reply.writeNoException 97 reply.writeStringstate 98 return true 99 复制代码最后,再增加一个该接口的方法 100 public String getUsbMountPointPath throws RemoteException复制代码到此为止,为 IMountService 增加接口所要做的必要步骤就算完成了。
编译步骤:1:编译 framework/base/libs/storage ,产生 libstorage.a 静态文件。
2:编译 framework/base/native/android 产生 libandroid.so 动态库文件,该文件最终会被IMountService.java 使用。
必须通过 push 到 system/lib 目录下 。
3 :编译 framework/base/service 让 getUsbMountPointPath 接口生效。
4:编译 framework/base 这样我们就可以在使用 StorageManage 来读取 IMountService的新接口了。
注:StorageManage 部分就不写了,可以借鉴其他的方法,添加一个可供上层访问的方法,这部分比较简单。
StorageManage 在2.2是隐藏的不被开发者使用的,在4.0后则可以正常使用。
希望大家喜欢,如果您有任何问题,请访问清源教育论坛提问讨论或者交流,谢谢阅读! 来源:清源教育