<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Terry_龙</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/65692/rss</id><updated>2012-05-17T08:36:50Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/65692/rss"/><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/04/20/2458861.html</id><title type="text">Android 框架层为IMountService 增加新接口</title><summary type="text">在为Android 增加多分区的支持时，可能会需要获得当前 USB 连接的挂载口，可能标准的Android 框架并未提供这样的接口给开发者，这时就需要我们自己为它提供接口了。先来看一下上层（应用）如何得到一个IMountService 的。privatesynchronizedIMountServicegetMountService(){if(mMountService==null){IBinderservice=ServiceManager.getService("mount");if(service!=null){mMountService=IMountService.</summary><published>2012-04-20T02:10:00Z</published><updated>2012-04-20T02:10:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/20/2458861.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/20/2458861.html"/><content type="html">&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;在为Android 增加多分区的支持时，可能会需要获得当前 USB 连接的挂载口，可能标准的Android 框架并未提供这样的接口给开发者，这时就需要我们自己为它提供接口了。先来看一下上层（应用）如何得到一个IMountService 的。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;IMountService&amp;nbsp;getMountService()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mMountService&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&lt;strong&gt;IBinder&amp;nbsp;service&amp;nbsp;=&amp;nbsp;ServiceManager.getService("mount");&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(service&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mMountService&amp;nbsp;=&amp;nbsp;IMountService.Stub.asInterface(service);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.e(TAG,&amp;nbsp;"Can't&amp;nbsp;get&amp;nbsp;mount&amp;nbsp;service");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;mMountService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;关于Binder 可以参考下这篇文章：&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #111111; font-size: 13px; line-height: 23px; font-family: verdana, arial; background-color: #ffffff; "&gt;&lt;/span&gt;&lt;a href="http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html" target="_blank" style="text-decoration: underline; "&gt;&lt;strong&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; line-height: 23px; font-family: verdana, arial; background-color: #ffffff; color: red; "&gt;Android&lt;/span&gt;&lt;span style="font-family: verdana, arial; font-size: 13px; line-height: 23px; background-color: #ffffff; color: red; "&gt;深入浅出之&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; line-height: 23px; font-family: verdana, arial; background-color: #ffffff; color: red; "&gt;Binder&lt;/span&gt;&lt;span style="font-family: verdana, arial; font-size: 13px; line-height: 23px; background-color: #ffffff; color: red; "&gt;机制&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;。&lt;span style="color: #111111; font-family: verdana, arial; font-size: 13px; line-height: 23px; background-color: #ffffff; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Android 2.2新增接口&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Android 2.2为IMountService 新增接口非常容易，在frameworks/base/core/java/android/os/storage&amp;nbsp;有一个IMountService.aidl 文件，可以直接在这个文件里面新增一个接口提供给上层，如：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/*add&amp;nbsp;by&amp;nbsp;terry*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;getUsbMountPointPath()&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;该文件负责生成IMountService.java文件，接着进入frameworks/base/services/java/com/android/server&amp;nbsp;，打开MountService.java 该文件继承于IMountService.aidl生成的类&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MountService&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;IMountService.Stub&lt;/div&gt;&lt;p&gt;在这个类里面实现我们为IMountService.aidl 新增的接口&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getUsbMountPointPath(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;usbMountPointPath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;OK。通过上面的操作， StorageManage &amp;nbsp;就可以很方便的得到这个为其新增的接口，上层便可以访问了。&lt;/p&gt;&lt;p&gt;编译步骤：&lt;/p&gt;&lt;p&gt;1):编译framework/base (生成IMountService.java)&lt;/p&gt;&lt;p&gt;&amp;nbsp;2):编译framework/base/service (编译MountService)&lt;/p&gt;&lt;p&gt;3):编译framework/base &amp;nbsp;(编译StorageManage以提供给上层调用)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Android 4.0 以上新增接口&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;相比于Android 2.2，在Android 4.0框架层 为IMountService 新增一个接口就显得比较复杂了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;按照Android 2.2 新增接口的方法，我们会先进入frameworks/base/core/java/android/os/storage 查找IMountService.aidl文件，进入目录，ls 一下，会发现并没有该文件，取而代之的是IMountService.java。这是怎么回事？打开该文件：映入眼帘首先会看到该警告：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;WARNING!&amp;nbsp;Update&amp;nbsp;IMountService.h&amp;nbsp;and&amp;nbsp;IMountService.cpp&amp;nbsp;if&amp;nbsp;you&amp;nbsp;change&amp;nbsp;this&lt;br /&gt;&amp;nbsp;*&amp;nbsp;file.&amp;nbsp;In&amp;nbsp;particular,&amp;nbsp;the&amp;nbsp;ordering&amp;nbsp;of&amp;nbsp;the&amp;nbsp;methods&amp;nbsp;below&amp;nbsp;must&amp;nbsp;match&amp;nbsp;the&lt;br /&gt;&amp;nbsp;*&amp;nbsp;_TRANSACTION&amp;nbsp;enum&amp;nbsp;in&amp;nbsp;IMountService.cpp&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@hide&amp;nbsp;-&amp;nbsp;Applications&amp;nbsp;should&amp;nbsp;use&amp;nbsp;android.os.storage.StorageManager&amp;nbsp;to&amp;nbsp;access&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;storage&amp;nbsp;functions.&lt;br /&gt;&amp;nbsp;*/&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;该警告提示我们，如果要修改这个文件，必须先修改IMountService.h 头文件和 IMountService.cpp 文件 ，并且还需要注意枚举里面的顺序。按照警告可以一步步修改了。&lt;/p&gt;&lt;p&gt;进入frameworks/base/include/storage&amp;nbsp;打开IMountService.h ，新增这个方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;int32_t&amp;nbsp;getUsbMountPointPath()&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;;&lt;/div&gt;&lt;p&gt;完成后进入frameworks/base/libs/storage&amp;nbsp; 打开IMountService.cpp ，在枚举里面新增方法枚举：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;enum&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_registerListener&amp;nbsp;=&amp;nbsp;IBinder::FIRST_CALL_TRANSACTION,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_unregisterListener,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_isUsbMassStorageConnected,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_setUsbMassStorageEnabled,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_isUsbMassStorageEnabled,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_mountVolume,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_unmountVolume,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_formatVolume,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_getStorageUsers,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_getVolumeState,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_createSecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_finalizeSecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_destroySecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_mountSecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_unmountSecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_isSecureContainerMounted,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_renameSecureContainer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_getSecureContainerPath,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_getSecureContainerList,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_shutdown,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_finishMediaUpdate,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_mountObb,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_unmountObb,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_isObbMounted,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_getMountedObbPath,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_isExternalStorageEmulated,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_decryptStorage,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TRANSACTION_encryptStorage,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;TRANSACTION_getUsbMountPointPath,&lt;/strong&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;接着新增要实现的方法&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;int32_t&amp;nbsp;getUsbMountPointPath()&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parcel&amp;nbsp;data,&amp;nbsp;reply;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.writeInterfaceToken(IMountService::getInterfaceDescriptor());&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(remote()-&amp;gt;transact(&lt;strong style="color: red; "&gt;TRANSACTION_getUsbMountPointPath&lt;/strong&gt;,&amp;nbsp;data,&amp;nbsp;&amp;amp;reply)&amp;nbsp;!=&amp;nbsp;NO_ERROR)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;getVolumeState&amp;nbsp;could&amp;nbsp;not&amp;nbsp;contact&amp;nbsp;remote\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int32_t&amp;nbsp;err&amp;nbsp;=&amp;nbsp;reply.readExceptionCode();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(err&amp;nbsp;&amp;lt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;getVolumeState&amp;nbsp;caught&amp;nbsp;exception&amp;nbsp;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;err);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;err;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;reply.readInt32();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#800080"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;OK，这个方法到了这里，CPP部分就算完成了。接下来可以为IMountService.java加接口了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;再次进入frameworks/base/core/java/android/os/storage ，打开IMountService.java 文件。&lt;/p&gt;&lt;p&gt;实现该接口，增加以下方法：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;&lt;strong style="color: red; "&gt;getUsbMountPointPath()&lt;/strong&gt;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;throws&lt;/span&gt;&amp;nbsp;RemoteException&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parcel&amp;nbsp;_data&amp;nbsp;=&amp;nbsp;Parcel.obtain();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parcel&amp;nbsp;_reply&amp;nbsp;=&amp;nbsp;Parcel.obtain();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;_result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_data.writeInterfaceToken(DESCRIPTOR);&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRemote.transact(&lt;strong style="color: red; "&gt;Stub.TRANSACTION_getUsbMountPointPath&lt;/strong&gt;,&amp;nbsp;_data,&amp;nbsp;_reply,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_reply.readException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_result&amp;nbsp;=&amp;nbsp;_reply.readString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;finally&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_reply.recycle();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_data.recycle();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;_result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;增加这个常量：static final int TRANSACTION_getUsbMountPointPath = IBinder.FIRST_CALL_TRANSACTION + 28;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;在onTransact方法里面增加一个case 判断：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;&lt;strong style="color: red; "&gt;TRANSACTION_getUsbMountPointPath&lt;/strong&gt;:{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.enforceInterface(DESCRIPTOR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;state&amp;nbsp;=&amp;nbsp;&lt;span style="color: red; "&gt;&lt;strong&gt;getUsbMountPointPath();&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reply.writeNoException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reply.writeString(state);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后，再增加一个该接口的方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getUsbMountPointPath()&amp;nbsp;&lt;span style="color: #0000FF;"&gt;throws&lt;/span&gt;&amp;nbsp;RemoteException;&lt;/div&gt;&lt;p&gt;到此为止，为IMountService &amp;nbsp;增加接口所要做的必要步骤就算完成了。&lt;/p&gt;&lt;p&gt;编译步骤：&lt;/p&gt;&lt;p&gt;1):编译framework/base/libs/storage ，产生libstorage.a静态文件。&lt;/p&gt;&lt;p&gt;2):编译framework/base/native/android 产生libandroid.so动态库文件，该文件最终会被IMountService.java 使用。必须通过push 到 system/lib 目录下 。&lt;/p&gt;&lt;p&gt;3) :编译framework/base/service 让getUsbMountPointPath 接口生效。&lt;/p&gt;&lt;p&gt;4):编译framework/base 这样我们就可以在使用StorageManage 来读取IMountService 的新接口了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注：StorageManage 部分就不写了，可以借鉴其他的方法，添加一个可供上层访问的方法，这部分比较简单。StorageManage在2.2是隐藏的不被开发者使用的，在4.0后则可以正常使用。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2458861.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/04/20/2458861.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/04/12/2443443.html</id><title type="text">Android SDCard Mount 流程分析（二）</title><summary type="text">上一篇关于Mount的分析，分析了main的作用和一些挂载系统的分析。下面深入分析Mount的流程走法。Mount流程分为两个部分 主动挂载（插入SDCARD或者USB硬盘时系统自动挂载） 手动挂载（卸载SDCARD或者USB硬盘后，再点击加载设备的手动挂载）不同挂载走的流程并不相同，比如手动挂载是由上层发命令给vold 执行挂动作，而主动挂载是由kernel 分命令给vold 再由vold 发挂载消息给上层，上层得到挂载消息和状态后再发命令给vold 执行挂载。主动挂载较之复杂些。不过虽然流程不一样，但最终还是要调用Volume的挂载函数，下面将详细介绍两者的行走的流程。由于...</summary><published>2012-04-12T02:09:00Z</published><updated>2012-04-12T02:09:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/12/2443443.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/12/2443443.html"/><content type="html">&lt;p&gt;上一篇关于Mount的分析，分析了main的作用和一些挂载系统的分析。下面深入分析Mount的流程走法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Mount流程分为两个部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;主动挂载（插入SDCARD或者USB硬盘时系统自动挂载）&lt;/li&gt;     &lt;li&gt;手动挂载（卸载SDCARD或者USB硬盘后，再点击加载设备的手动挂载）&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;不同挂载走的流程并不相同，比如手动挂载是由上层发命令给vold 执行挂动作，而主动挂载是由kernel 分命令给vold 再由vold 发挂载消息给上层，上层得到挂载消息和状态后再发命令给vold 执行挂载。主动挂载较之复杂些。不过虽然流程不一样，但最终还是要调用Volume的挂载函数，下面将详细介绍两者的行走的流程。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;由于会涉及SDCARD或者USB硬盘，其中调用的方法就不详细说明，这里只说出当插入SDCARD或者USB硬盘会走的流程。&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;主动挂载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;主动挂载时，会走向DirectVolume类，调用DirectVolume::mountVol方法，代码如下：&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;font color="#800080"&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;DirectVolume::mountVol()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;errmsg[&lt;span style="color: #800080;"&gt;255&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dev_t&amp;nbsp;deviceNodes[&lt;span style="color: #800080;"&gt;64&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i,&amp;nbsp;n&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(getState()&amp;nbsp;==&amp;nbsp;Volume::State_NoMedia)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snprintf(errmsg,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(errmsg),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Volume&amp;nbsp;%s&amp;nbsp;%s&amp;nbsp;mount&amp;nbsp;failed&amp;nbsp;-&amp;nbsp;no&amp;nbsp;media&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getLabel(),&amp;nbsp;getMountpoint());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mVm-&amp;gt;getBroadcaster()-&amp;gt;sendBroadcast(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResponseCode::VolumeMountFailedNoMedia,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errmsg,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;ENODEV;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(getState()&amp;nbsp;!=&amp;nbsp;Volume::State_Idle)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;EBUSY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n&amp;nbsp;=&amp;nbsp;getDeviceNodes((dev_t&amp;nbsp;*)&amp;nbsp;&amp;amp;deviceNodes,&amp;nbsp;&lt;span style="color: #800080;"&gt;64&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!n)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;get&amp;nbsp;device&amp;nbsp;nodes&amp;nbsp;(%s)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;mounted&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: #0000ff; "&gt;for&lt;/span&gt;&lt;/strong&gt;&lt;strong style="color: #0000ff; "&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;n;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mDevNodeIndex&amp;nbsp;=&amp;nbsp;deviceNodes[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;XXX:&amp;nbsp;hack&amp;nbsp;mountpoint&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;mMountpointParsed&amp;nbsp;)&amp;nbsp;{&amp;nbsp;free(mMountpointParsed);&amp;nbsp;mMountpointParsed&amp;nbsp;=&amp;nbsp;NULL;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mMountpointParsed&amp;nbsp;=&amp;nbsp;getParsedMountPoint(mMountpoint,&amp;nbsp;i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(isMountpointMounted(getMountpoint()))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGW(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Volume&amp;nbsp;is&amp;nbsp;idle&amp;nbsp;but&amp;nbsp;appears&amp;nbsp;to&amp;nbsp;be&amp;nbsp;mounted&amp;nbsp;-&amp;nbsp;fixing&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Mounted);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;mCurrentlyMountedKdev&amp;nbsp;=&amp;nbsp;XXX&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;EBUSY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: #ff0000; "&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!Volume::mountVol())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mounted&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mState&amp;nbsp;=&amp;nbsp;Volume::State_Idle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: #0000ff; "&gt;&amp;nbsp;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;mMountpointParsed&amp;nbsp;)&amp;nbsp;{&amp;nbsp;free(mMountpointParsed);&amp;nbsp;mMountpointParsed&amp;nbsp;=&amp;nbsp;NULL;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;mounted&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;at&amp;nbsp;least&amp;nbsp;on&amp;nbsp;partition&amp;nbsp;has&amp;nbsp;been&amp;nbsp;mounted&amp;nbsp;successful,&amp;nbsp;mark&amp;nbsp;disk&amp;nbsp;as&amp;nbsp;mounted&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Mounted);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Volume&amp;nbsp;%s&amp;nbsp;found&amp;nbsp;no&amp;nbsp;suitable&amp;nbsp;devices&amp;nbsp;for&amp;nbsp;mounting&amp;nbsp;:(\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;getLabel());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Idle);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;代码加亮部分，蓝色部分，会循环整个设备节点系统目录位于(/dev/block/vold)，然后调用红色部分代码，调用Volume的挂载方法。&lt;/p&gt;&lt;p&gt;这里，无论是SDCARD或者USB硬盘在主动挂载时，都会走DirectVolume。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;手动挂载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;手动挂载是由上层发Mount 命令，代码位于MountService里面的doMountVolume方法，具体如何实现我们先不深究，它这里通过发送socket(&lt;strong style="color: #ff0000; "&gt;mount&lt;/strong&gt;)命令到Vold 的CommandListener里面的&lt;strong style="color: #ff0000; "&gt;CommandListener::VolumeCmd::runCommand&lt;/strong&gt;方法进入代码这里：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(argv[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;mount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(argc&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cli-&amp;gt;sendMsg(ResponseCode::CommandSyntaxError,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Usage:&amp;nbsp;volume&amp;nbsp;mount&amp;nbsp;&amp;lt;path&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: #0000ff; "&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;strong style="color: #0000ff; "&gt;(!strcmp(argv[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;],&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;firstMount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VolumeCollection::iterator&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(mVolumes!=NULL){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;mVolumes-&amp;gt;begin();&amp;nbsp;i&amp;nbsp;!=&amp;nbsp;mVolumes-&amp;gt;end();&amp;nbsp;++i)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(strcmp(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/sdcard&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;(*i)-&amp;gt;getMountpoint()))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vm-&amp;gt;mountVolume((*i)-&amp;gt;getMountpoint());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;{&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: #ff0000; "&gt;vm-&amp;gt;mountVolume(argv[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;]);&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: #0000ff; "&gt;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;这里执行挂载动作，看上面蓝色代码是为了系统第一次启动上层发送命令firstMount给CommandListener执行挂载USB硬盘的动作，红色代码即是核心要挂载的方法，调用的VolumeManage的&lt;strong style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; color: #ff0000; "&gt;mountVolume &lt;/strong&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; color: #000000; "&gt;方法&lt;/span&gt;，只需传入挂载点。该方法代码是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;VolumeManager::mountVolume(&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*label)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Volume&amp;nbsp;*v&amp;nbsp;=&amp;nbsp;lookupVolume(label);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!v)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;ENOENT;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: #ff0000; "&gt;return&lt;/span&gt;&lt;/strong&gt;&lt;strong style="color: #ff0000; "&gt;&amp;nbsp;v-&amp;gt;mountVol()&lt;/strong&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;可以看出，这里同样调用的是Volume的mountVol方法，殊途同归，接下来着重看一下Volume类里面这个mountVol方法，究竟干了些啥。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Volume::mountVol&amp;nbsp;方法深究&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;别的先不管，来看一下代码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;font color="#800080"&gt;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;int&lt;/span&gt;&amp;nbsp;Volume::mountVol()&amp;nbsp;{&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;errmsg[&lt;span style="color: #800080;"&gt;255&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*mountPath;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;devicePath[&lt;span style="color: #800080;"&gt;255&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(devicePath,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/dev/block/vold/%d:%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;MAJOR(mDevNodeIndex),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MINOR(mDevNodeIndex));//得到设备节点,如:/dev/block/vold/8:1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGI(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;being&amp;nbsp;considered&amp;nbsp;for&amp;nbsp;volume&amp;nbsp;%s&amp;nbsp;...major&amp;nbsp;:&amp;nbsp;%d&amp;nbsp;minor:&amp;nbsp;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath,&amp;nbsp;getLabel(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MAJOR(mDevNodeIndex),MINOR(mDevNodeIndex));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Checking);//设置状态为checking整型为3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO:&amp;nbsp;find&amp;nbsp;a&amp;nbsp;way&amp;nbsp;to&amp;nbsp;read&amp;nbsp;the&amp;nbsp;filesystem&amp;nbsp;ID&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;isFatFs&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;isNtfsFS&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//检查设备格式是否为Fat32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(Fat::check(devicePath))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(errno&amp;nbsp;==&amp;nbsp;ENODATA)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGW(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;does&amp;nbsp;not&amp;nbsp;contain&amp;nbsp;a&amp;nbsp;FAT&amp;nbsp;filesystem\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFatFs&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;EIO;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Badness&amp;nbsp;-&amp;nbsp;abort&amp;nbsp;the&amp;nbsp;mount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;failed&amp;nbsp;FS&amp;nbsp;checks&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Idle);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //创建挂载目录&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;create&amp;nbsp;mountpoint&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mkdir(getMountpoint(),&amp;nbsp;&lt;span style="color: #800080;"&gt;0755&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(errno&amp;nbsp;!=&amp;nbsp;EEXIST)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;create&amp;nbsp;mountpoint&amp;nbsp;%s&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;getMountpoint(),&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Mount&amp;nbsp;the&amp;nbsp;device&amp;nbsp;on&amp;nbsp;our&amp;nbsp;internal&amp;nbsp;staging&amp;nbsp;mountpoint&amp;nbsp;so&amp;nbsp;we&amp;nbsp;can&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;muck&amp;nbsp;with&amp;nbsp;it&amp;nbsp;before&amp;nbsp;exposing&amp;nbsp;it&amp;nbsp;to&amp;nbsp;non&amp;nbsp;priviledged&amp;nbsp;users.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //如果为sdcard则挂载到&lt;span style="color: #800000; "&gt;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #000000; "&gt;，否则挂载到挂载点&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!strcmp(getLabel(),&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sdcard&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mountPath=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mountPath=getMountpoint();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//接下来就是不同格式不同的挂载，这里支持两种格式：fat32,Ntfs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;isFatFs&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(Fat::doMount(devicePath,mountPath,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;1015&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0702&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;failed&amp;nbsp;to&amp;nbsp;mount&amp;nbsp;via&amp;nbsp;VFAT&amp;nbsp;(%s)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFatFs&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isNtfsFS&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;isNtfsFS&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(Ntfs::doMount(devicePath,&amp;nbsp;mountPath,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;failed&amp;nbsp;to&amp;nbsp;mount&amp;nbsp;via&amp;nbsp;NTFS&amp;nbsp;(%s)\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isNtfsFS&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;!isFatFs&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!isNtfsFS&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;unsupported&amp;nbsp;filesystem&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGI(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device&amp;nbsp;%s,&amp;nbsp;target&amp;nbsp;%s&amp;nbsp;mounted&amp;nbsp;@&amp;nbsp;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devicePath,&amp;nbsp;getMountpoint());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&amp;nbsp;!strcmp(getLabel(),&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sdcard&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protectFromAutorunStupidity();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(createBindMounts())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;create&amp;nbsp;bindmounts&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;umount(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Idle);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Now&amp;nbsp;that&amp;nbsp;the&amp;nbsp;bindmount&amp;nbsp;trickery&amp;nbsp;is&amp;nbsp;done,&amp;nbsp;atomically&amp;nbsp;move&amp;nbsp;the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;whole&amp;nbsp;subtree&amp;nbsp;to&amp;nbsp;expose&amp;nbsp;it&amp;nbsp;to&amp;nbsp;non&amp;nbsp;priviledged&amp;nbsp;users.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* 如果为sdcard则将/mnt/secure/staging 目录移动到挂载点，并将该目录unmount&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!strcmp(getLabel(),&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sdcard&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(doMoveMount(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;getMountpoint(),&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;move&amp;nbsp;mount&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;umount(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/mnt/secure/staging&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Idle);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setState(Volume::State_Mounted);//设置状态到MountService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCurrentlyMountedKdev&amp;nbsp;=&amp;nbsp;mDevNodeIndex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;p&gt;注意：原生的代码可能跟上面贴出来的代码有点不同，上面的代码是增加了Ntfs-3g挂载的支持和多分区挂载的支持，但基本流程是相同的。&lt;/p&gt;&lt;p&gt;&lt;font face="'Courier New'" size="2"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;代码有详细的注释，这里要注意的是：sdcard和USB的支持不同，sdcard 挂载时需要先挂载到临时目录/mnt/secure/staging，然后再移动到最终需要挂载的挂载点，而USB硬盘特别是多分区的支持，不用先挂载到临时目录，而是可以支持挂载到想要挂载的挂载点，这里是比较需要注意到的地方(在这里栽过跟头，会出现&amp;#8220;随机性的挂载失败&amp;#8221;)。&lt;/p&gt;&lt;p&gt;ok.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2443443.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/04/12/2443443.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/04/05/2432818.html</id><title type="text">Android SDCard Mount 流程分析（一）</title><summary type="text">前段时间对Android 的SDCard unmount 流程进行了几篇简短的分析，由于当时只是纸上谈兵，没有实际上的跟进，可能会有一些误导人或者小错误。今天重新梳理了头绪，针对mount的流程再重新分析一次。本篇大纲 android 系统如何开机启动监听mount服务 默认设备节点在Android 系统的哪个目录 vold.fstab 配置文件的分析 vold 里面启动页面main做了些什么android 系统如何开机启动监听mount服务android sdcard 热插拔监测和执行操作是由一个启动文件vold 所统领的，系统开机会读取初始化配置文件init...</summary><published>2012-04-05T03:01:00Z</published><updated>2012-04-05T03:01:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/05/2432818.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/04/05/2432818.html"/><content type="html">&lt;p&gt;前段时间对Android 的SDCard unmount 流程进行了几篇简短的分析，由于当时只是纸上谈兵，没有实际上的跟进，可能会有一些误导人或者小错误。今天重新梳理了头绪，针对mount的流程再重新分析一次。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;本篇大纲&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;android 系统如何开机启动监听mount服务&lt;/li&gt;     &lt;li&gt;默认设备节点在Android 系统的哪个目录&lt;/li&gt;     &lt;li&gt;vold.fstab 配置文件的分析&amp;nbsp;&lt;/li&gt;     &lt;li&gt;vold 里面启动页面main做了些什么&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;android 系统如何开机启动监听mount服务&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;android sdcard 热插拔监测和执行操作是由一个启动文件vold &amp;nbsp;所统领的，系统开机会读取初始化配置文件init.rc，该文件位于比如我的板子是：device/ti/omap3evm/init.rc，具体根据自己平台查找。里面有一个是默认启动vold 服务的代码，如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;service&amp;nbsp;vold&amp;nbsp;/system/bin/vold&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket&amp;nbsp;vold&amp;nbsp;stream&amp;nbsp;0660&amp;nbsp;root&amp;nbsp;mount&lt;br /&gt;&amp;nbsp; &amp;nbsp; ioprio&amp;nbsp;be&amp;nbsp;2&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;如果要对该文件做出修改之类，要重新编一下boot.img 镜像文件，烧录进android 系统，之后可以在android的文件系统根目录找到init.rc文件。上述代码为启动vold 启动文件，也可以在init.rc 增加多一些我们想要的文件目录，比如增加一个可以存放多分区挂载的目录等，这个是后话。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;默认设备节点在Android 系统的哪个目录&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;usbdisk 或者 sdcard 热插拔的时候，kernel 会发出命令执行mount或者unmount 操作，但这都是驱动级的。而mount 目录会在android 的文件系统目录下：/dev/block/vold 这个目录由vold 生成，用来存放所有的usbdisk 或者 sdcard 的设备节点。代码位于main里面最优先执行：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;mkdir("/dev/block/vold",&amp;nbsp;0755)&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;可以根据这个目录找到如下节点：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;sh-4.1#&amp;nbsp;ls&amp;nbsp;/dev/block/vold/&lt;br /&gt;179:0&amp;nbsp;&amp;nbsp;179:1&amp;nbsp;&amp;nbsp;8:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:4&amp;nbsp;&lt;/div&gt;&lt;p&gt;节点的小介绍：&lt;/p&gt;&lt;p&gt;0代表当前的整个设备，1代码当前设备的分区名称代号。&lt;/p&gt;&lt;p&gt;所以你会发现，sdcard只有一个分区它却生成了两个如：179:0 179:1&lt;/p&gt;&lt;p&gt;而usbdisk 有四个分区，它会生成五个设备节点：&amp;nbsp;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;8:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:4 &amp;nbsp;就是这个原因。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;vold.fstab 配置文件的分析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;vold 里面会通过指定文件来读取预先配置好的sdcard或者多分区配置文件，该文件位于&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/system/core/rootdir/etc/vold.fstab&lt;/div&gt;&lt;p&gt;如以下的配置文件为：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;dev_mount&amp;nbsp;sdcard&amp;nbsp;/mnt/sdcard&amp;nbsp;auto&amp;nbsp;/devices/platform/goldfish_mmc.0&amp;nbsp;/devices/platform/msm_sdcc.2/mmc_host/mmc1&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="'Courier New'" size="2"&gt;&lt;span style="line-height: 19px;"&gt;&amp;nbsp;dev_mount 代表挂载格式&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;sdcard 代表挂载的标签&lt;/p&gt;&lt;p&gt;/mnt/sdcard 代表挂载点&lt;/p&gt;&lt;p&gt;&amp;nbsp;auto 为自定义选项可以为任何，但必须在main 里面自己判断比如这里的意思为自动挂载&lt;/p&gt;&lt;p&gt;后面两个目录为设备路径，第一个如果被占用会选择第二个&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;配置文件可以根据自己的需要编写，并不是固定的，但最好遵循google vold 启动文件代码的格式编写，要不然会给我们修改代码或者增加多分区功能带来不小的麻烦，如以下我自己编写的多分区挂载支持vold.fstab 配置文件：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;dev_mount&amp;nbsp;sdcard&amp;nbsp;external&amp;nbsp;/mnt/sdcard&amp;nbsp;auto&amp;nbsp;/devices/platform/mmci-omap-hs.0/mmc_host/mmc0&amp;nbsp;/devices/platform/mmci-omap-hs.0/mmc_host/mmc1&lt;br /&gt;dev_mount&amp;nbsp;usb1&amp;nbsp;external&amp;nbsp;/mnt/usbdisk/usb1-disk%d&amp;nbsp;all&amp;nbsp;/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/&lt;br /&gt;dev_mount&amp;nbsp;usb2&amp;nbsp;external&amp;nbsp;/mnt/usbdisk/usb2-disk%d&amp;nbsp;all&amp;nbsp;/devices/platform/ehci-omap.0/usb1/1-2/1-2.2/&lt;br /&gt;dev_mount&amp;nbsp;usb3&amp;nbsp;external&amp;nbsp;/mnt/usbdisk/usb3-disk%d&amp;nbsp;all&amp;nbsp;/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/&lt;/div&gt;&lt;p&gt;&amp;nbsp;该文件修改后经系统编译会在android 系统目录里/system/etc/vold.fstab找到。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;/devices/platform/ehci-omap.0/usb1/1-2/1-2.1/ &amp;nbsp;代表要挂载的USB口。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;vold.fstab 只是一个单纯的配置文件，具体的读取和取数据还 是要靠main里面的process_config函数。看代码，里面正有一段用来读取配置文件：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp; if&amp;nbsp;(!(fp&amp;nbsp;=&amp;nbsp;fopen("/etc/vold.fstab",&amp;nbsp;"r")))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;在这个函数里面会根据读取到的数据存放起来，然后满足条件时执行操作。比如代码里面的：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(type,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;dev_mount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectVolume&amp;nbsp;*dv&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*part;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!(part&amp;nbsp;=&amp;nbsp;strtok_r(NULL,&amp;nbsp;delim,&amp;nbsp;&amp;amp;save_ptr)))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&amp;nbsp;parsing&amp;nbsp;partition&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;goto&lt;/span&gt;&amp;nbsp;out_syntax;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(strcmp(part,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;auto&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;atoi(part)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Partition&amp;nbsp;must&amp;nbsp;either&amp;nbsp;be&amp;nbsp;'auto'&amp;nbsp;or&amp;nbsp;1&amp;nbsp;based&amp;nbsp;index&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;'%s'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;part);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;goto&lt;/span&gt;&amp;nbsp;out_syntax;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: red; "&gt;if&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;(!strcmp(part,&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;"&lt;/span&gt;&lt;span style="color: red; "&gt;auto&lt;/span&gt;&lt;span style="color: red; "&gt;"&lt;/span&gt;&lt;span style="color: red; "&gt;))&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dv&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;new&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;DirectVolume(vm,&amp;nbsp;label,&amp;nbsp;mount_point,&amp;nbsp;-&lt;/span&gt;&lt;span style="color: red; "&gt;1&lt;/span&gt;&lt;span style="color: red; "&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;else&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dv&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;new&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;DirectVolume(vm,&amp;nbsp;label,&amp;nbsp;mount_point,&amp;nbsp;atoi(part));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;((sysfs_path&amp;nbsp;=&amp;nbsp;strtok_r(NULL,&amp;nbsp;delim,&amp;nbsp;&amp;amp;save_ptr)))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(*sysfs_path&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;If&amp;nbsp;the&amp;nbsp;first&amp;nbsp;character&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;'/',&amp;nbsp;it&amp;nbsp;must&amp;nbsp;be&amp;nbsp;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(dv-&amp;gt;addPath(sysfs_path))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;add&amp;nbsp;devpath&amp;nbsp;%s&amp;nbsp;to&amp;nbsp;volume&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;sysfs_path,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;goto&lt;/span&gt;&amp;nbsp;out_fail;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;If&amp;nbsp;sysfs_path&amp;nbsp;is&amp;nbsp;non-null&amp;nbsp;at&amp;nbsp;this&amp;nbsp;point,&amp;nbsp;then&amp;nbsp;it&amp;nbsp;contains&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;the&amp;nbsp;optional&amp;nbsp;flags&amp;nbsp;for&amp;nbsp;this&amp;nbsp;volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(sysfs_path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flags&amp;nbsp;=&amp;nbsp;parse_mount_flags(sysfs_path);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flags&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dv-&amp;gt;setFlags(flags);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vm-&amp;gt;addVolume(dv);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;DirectVolume后面会讲到，执行mount 和unmount 都是它在做。&lt;/p&gt;&lt;p&gt;另外，有时后读取配置文件会有问题，这是因为它读取是通过指标下标递增的方式在读，如果有问题可以跟踪打印一下配置文件，看哪里需要修改。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;vold 里面启动页面main做了些什么&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;main 主要是初始化socket 连接监听数据变化，在系统起来时第一时间启动，并且通过读取配置文件来识别usb口或者sdcard 的设备地址，来mount 或者unmount 。其它执行mount 、 unmount &amp;nbsp;或者删除节点等操作都是由上层或者framework 发送命令给main让其通知volumeManage 执行相应的操作。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2432818.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/04/05/2432818.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2412302.html</id><title type="text">Android SDCard UnMounted 流程分析（三）</title><summary type="text">前篇地址Android SDCard UnMounted 流程分析（一）Android SDCard UnMounted 流程分析（二）前一篇讲到SDCard unmout onEvent 发送socket 到框架层，接下来分析框架层得到数据后的流程。MoutService当android 系统启动时，system将MountService 添加到启动服务里面，而MountService 会开启一个线程来运行NativeDaemonConnector，由它来监听vold的消息，代码：mConnector=newNativeDaemonConnector(this,"vold&amp;quot</summary><published>2012-03-22T12:40:00Z</published><updated>2012-03-22T12:40:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2412302.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2412302.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前篇地址&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_1" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411628.html" style="outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; color: #6699cc; "&gt;Android SDCard UnMounted 流程分析（一）&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="homepage1_PostList1_rptEntries_TitleUrl_0" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411742.html" style="outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; color: #6699cc; "&gt;Android SDCard UnMounted 流程分析（二）&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;前一篇讲到SDCard unmout onEvent 发送socket 到框架层，接下来分析框架层得到数据后的流程。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;MoutService&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当android 系统启动时，system将MountService 添加到启动服务里面，而MountService 会开启一个线程来运行NativeDaemonConnector，由它来监听vold的消息，代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;mConnector&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;NativeDaemonConnector(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;vold&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;MAX_CONTAINERS&amp;nbsp;*&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;,&amp;nbsp;VOLD_TAG);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mReady&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread&amp;nbsp;thread&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Thread(mConnector,&amp;nbsp;VOLD_TAG);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; thread.start();&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;该函数运行在MountService的构造函数里面，而NativeDaemonConnector 本身就是继承自Runnable。&lt;/p&gt;&lt;strong&gt;NativeDaemonConnector&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;Framework与vold 的通信是通过socket来实现的，不过该socket 由　android做了一个封装，LocalSocket 实现的socket功能。&lt;/p&gt;&lt;p&gt;NativeDaecomConnector 位于framework/base/service/java/com/android/server目录下， 监听vold 的消息代码在继承自Runnable对象的run方法里面 ：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;run()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HandlerThread&amp;nbsp;thread&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;HandlerThread(TAG&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.CallbackHandler&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thread.start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCallbackHandler&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Handler(thread.getLooper(),&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&lt;strong&gt;listenToSocket&lt;/strong&gt;&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&amp;nbsp;in&amp;nbsp;NativeDaemonConnector&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SystemClock.sleep(&lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;NativeDaemonConnector 类实例化了一个LocalSocket来与vold 通信。LocalSocket　里面有一个类LocalSocketImpl，该类部分是通过JNI实现的。&lt;/p&gt;&lt;p&gt;关于socket 内部如何通信，这个不是我们所关心的内容，因为如果要深入进去估计没完没了，有兴趣的朋友可以参考源码进入SocketListener查看：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;建立连接&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SocketListener::SocketListener&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;当main初始化CommandListener 后，会为socketName 传入一个叫vold 的字符串&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SocketListener::startListener&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;等待并接收连接请求&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;SocketListener::runListener&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;获得命令参数&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;bool FrameworkListener::onDataAvailable&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;strong&gt;dispatchCommand 到相应的命令类,并返回一部分消息给上层&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;FrameworkListener::dispatchCommand&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;再回过头看NativeDaemonConnector 的listenToSocket，代码中实例化了一个LocalSocketAddress的实例，并传入一个叫"vold"字符串的socket 名称，这与CommandListener中继承了FrameworkListener时给的"vold"名称是一致的，两个socket名称一致则可以互相进行通讯了，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;listenToSocket()&amp;nbsp;throws&amp;nbsp;IOException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LocalSocket&amp;nbsp;socket&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,String.format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NativeDaemonConnector---&amp;gt;listenToSocket:start&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;LocalSocket();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: red; "&gt;LocalSocketAddress&amp;nbsp;address&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;new&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;LocalSocketAddress(mSocket,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LocalSocketAddress.Namespace.RESERVED);&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket.connect(address);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream&amp;nbsp;inputStream&amp;nbsp;=&amp;nbsp;socket.getInputStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutputStream&amp;nbsp;=&amp;nbsp;socket.getOutputStream();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCallbacks.onDaemonConnected();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;byte&lt;/span&gt;[]&amp;nbsp;buffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;byte&lt;/span&gt;[BUFFER_SIZE];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;inputStream.read(buffer,&amp;nbsp;start,&amp;nbsp;BUFFER_SIZE&amp;nbsp;-&amp;nbsp;start);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(count&amp;nbsp;&amp;lt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Add&amp;nbsp;our&amp;nbsp;starting&amp;nbsp;point&amp;nbsp;to&amp;nbsp;the&amp;nbsp;count&amp;nbsp;and&amp;nbsp;reset&amp;nbsp;the&amp;nbsp;start.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;+=&amp;nbsp;start;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;count;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(buffer[i]&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;&amp;nbsp;String&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;String(buffer,&amp;nbsp;start,&amp;nbsp;i&amp;nbsp;-&amp;nbsp;start);//解析socket 的数据并获取event&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(LOCAL_LOGD)&amp;nbsp;Slog.d(TAG,&amp;nbsp;String.format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;RCV&amp;nbsp;&amp;lt;-&amp;nbsp;{%s}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[]&amp;nbsp;tokens&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;.split(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;Integer.parseInt(tokens[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(code&amp;nbsp;&amp;gt;=&amp;nbsp;ResponseCode.UnsolicitedInformational)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCallbackHandler.sendMessage(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCallbackHandler.obtainMessage(code,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;));//发送消息给handler&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mResponseQueue.put(&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(InterruptedException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;put&amp;nbsp;response&amp;nbsp;onto&amp;nbsp;queue&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(NumberFormatException&amp;nbsp;nfe)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,&amp;nbsp;String.format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Bad&amp;nbsp;msg&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;should&amp;nbsp;end&amp;nbsp;at&amp;nbsp;the&amp;nbsp;amount&amp;nbsp;we&amp;nbsp;read.&amp;nbsp;If&amp;nbsp;not,&amp;nbsp;compact&amp;nbsp;then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;buffer&amp;nbsp;and&amp;nbsp;read&amp;nbsp;again.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(start&amp;nbsp;!=&amp;nbsp;count)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;remaining&amp;nbsp;=&amp;nbsp;BUFFER_SIZE&amp;nbsp;-&amp;nbsp;start;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.arraycopy(buffer,&amp;nbsp;start,&amp;nbsp;buffer,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&amp;nbsp;remaining);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;remaining;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(IOException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Communications&amp;nbsp;error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&amp;nbsp;ex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;finally&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;synchronized&amp;nbsp;(mDaemonLock)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mOutputStream&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutputStream.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;closing&amp;nbsp;output&amp;nbsp;stream&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutputStream&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(socket&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(IOException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;closing&amp;nbsp;socket&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;上面代码，通过socket 并event 解析出来，并通handler 发送到handleMessage&amp;nbsp;中，当handleMessage接收到传过来的消息时，会调用MountService 的onEvent 方法将code和event和sdcard 的状态传递进去。代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;boolean&amp;nbsp;handleMessage(Message&amp;nbsp;msg)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;&amp;nbsp;=&amp;nbsp;(String)&amp;nbsp;msg.obj;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,String.format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NativeDaemonConnector---&amp;gt;handleMessage&amp;nbsp;the&amp;nbsp;event&amp;nbsp;value&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;+&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;strong style="color: red; "&gt;mCallbacks.onEvent(msg.what,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;.split(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&lt;/strong&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,&amp;nbsp;String.format(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unhandled&amp;nbsp;event&amp;nbsp;'%s'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;String.format(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&amp;nbsp;handling&amp;nbsp;'%s'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;),&amp;nbsp;e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;又回到MountService ，在onEvent里面当接收到的code ==VoldResponseCode.VolumeBadRemoval时会调用updatePublicVolumeState，发送unmount改变的广播，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(code&amp;nbsp;==&amp;nbsp;VoldResponseCode.VolumeBadRemoval)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(DEBUG_EVENTS)&amp;nbsp;Slog.i(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Sending&amp;nbsp;unmounted&amp;nbsp;event&amp;nbsp;first&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Send&amp;nbsp;the&amp;nbsp;media&amp;nbsp;unmounted&amp;nbsp;event&amp;nbsp;first&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updatePublicVolumeState(path,&amp;nbsp;Environment.MEDIA_UNMOUNTED);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action&amp;nbsp;=&amp;nbsp;Intent.ACTION_MEDIA_UNMOUNTED;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(DEBUG_EVENTS)&amp;nbsp;Slog.i(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Sending&amp;nbsp;media&amp;nbsp;bad&amp;nbsp;removal&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&lt;strong&gt;updatePublicVolumeState(path,&amp;nbsp;Environment.MEDIA_BAD_REMOVAL);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action&amp;nbsp;=&amp;nbsp;Intent.ACTION_MEDIA_BAD_REMOVAL;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;到这里，进入updatePublicVolumeState看该函数里的主要代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;synchronized&amp;nbsp;(mListeners)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;mListeners.size()&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&amp;nbsp;i--)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MountServiceBinderListener&amp;nbsp;bl&amp;nbsp;=&amp;nbsp;mListeners.&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.w(TAG,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MountService---&amp;gt;updatePublicVolumeState--&amp;gt;bl.mListener.onStorageStateChanged&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;&amp;nbsp;bl.mListener.onStorageStateChanged(path,&amp;nbsp;oldState,&amp;nbsp;state);&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(RemoteException&amp;nbsp;rex)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Listener&amp;nbsp;dead&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mListeners.remove(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.e(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Listener&amp;nbsp;failed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;并且调用sendStorageIntent 方法将SDCard的Action:android.intent.action.MEDIA_BAD_REMOVAL&amp;nbsp;和dat：file:///mnt/sdcard&amp;nbsp;通过这个广播发送出去，代码如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;void&lt;/span&gt;&amp;nbsp;sendStorageIntent(String&amp;nbsp;action,&amp;nbsp;String&amp;nbsp;path)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent&amp;nbsp;intent&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Intent(action,&amp;nbsp;Uri.parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;file://&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;path));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;add&amp;nbsp;StorageVolume&amp;nbsp;extra&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME,&amp;nbsp;mVolumeMap.&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;(path));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slog.d(TAG,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sendStorageIntent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;intent);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mContext.sendBroadcast(intent);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再回到&amp;nbsp;updatePublicVolumeState　，调用了stateChange 后，将状态为632的标识发送到NativeDaemonConnector 的handlemessage，当NativeDaemonConnector 发现SDCard的状态发送改变时，比如unmount 的时候，从632（VolumeBadRemoval）变到605（VolumeStateChange）到onEvent，当onEvent再次得到请求时，进入判断会直接执行notifyVolumeStateChange 函数，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(code&amp;nbsp;==&amp;nbsp;VoldResponseCode.VolumeStateChange)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;One&amp;nbsp;of&amp;nbsp;the&amp;nbsp;volumes&amp;nbsp;we're&amp;nbsp;managing&amp;nbsp;has&amp;nbsp;changed&amp;nbsp;state.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Format:&amp;nbsp;"NNN&amp;nbsp;Volume&amp;nbsp;&amp;lt;label&amp;gt;&amp;nbsp;&amp;lt;path&amp;gt;&amp;nbsp;state&amp;nbsp;changed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;from&amp;nbsp;&amp;lt;old_#&amp;gt;&amp;nbsp;(&amp;lt;old_str&amp;gt;)&amp;nbsp;to&amp;nbsp;&amp;lt;new_#&amp;gt;&amp;nbsp;(&amp;lt;new_str&amp;gt;)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;notifyVolumeStateChange(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cooked[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;],&amp;nbsp;cooked[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;],&amp;nbsp;Integer.parseInt(cooked[&lt;span style="color: #800080;"&gt;7&lt;/span&gt;]),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer.parseInt(cooked[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;]));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;notifyStateChange 会调用updatePublicVolumeState通知packageManger　SDCard己经unmount.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;再回到Vold&amp;nbsp;&lt;/p&gt;&lt;p&gt;由于vold 启动文件一开始就启动了CommandListener的runcommand由于socket 一直在通讯，当发现值改变后，进入以下代码runCommand 方法里面:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(argv[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;unmount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(argc&amp;nbsp;&amp;lt;&amp;nbsp;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&amp;nbsp;||&amp;nbsp;argc&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;||&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((argc&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;strcmp(argv[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;force&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;&amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(argc&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;strcmp(argv[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;force_and_revert&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cli-&amp;gt;sendMsg(ResponseCode::CommandSyntaxError,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Usage:&amp;nbsp;volume&amp;nbsp;unmount&amp;nbsp;&amp;lt;path&amp;gt;&amp;nbsp;[force|force_and_revert]&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;force&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;revert&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(argc&amp;nbsp;&amp;gt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!strcmp(argv[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;force&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;force&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(argc&amp;nbsp;&amp;gt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!strcmp(argv[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;],&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;force_and_revert&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;force&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;revert&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;&lt;strong style="color: red; "&gt;vm-&amp;gt;unmountVolume&lt;/strong&gt;(argv[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;],&amp;nbsp;force,&amp;nbsp;revert);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;这时调用VolumeManage的unmoutVolume。该方法来源于Volume 的unmountVol，调用这个函数会unmount 三个挂载点，并同时调用setState通知框架unmount 成功，可以改变UI等一系列动作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MountService: 实现用于管理存储设备的后台服务&lt;/p&gt;&lt;p&gt;StorageManage:访问MountService 接口，并向应用层提供接口&lt;/p&gt;&lt;p&gt;PackageMangeService:是用于管理系统中所有apk，当SDCard发生变化时，向应用层发送消息&lt;/p&gt;&lt;p&gt;NativeDaemonConnector:创建socket实现mountservice 和vold 的通信&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;可以这么说：当vold 捕获到uevent 事件，会将事件消息通知framework,framework 进行判断，然后再下发执行命令。&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;粗糙图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后附一张比较粗糙的结构图，时间较急，没仔细画好&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/terryblog/Screenshot.png" border="0" alt="" width="776" height="526" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2412302.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2412302.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411742.html</id><title type="text">Android SDCard UnMounted 流程分析（二）</title><summary type="text">上一篇讲到通过NetlinkManager发送uevent 命令到NetlinkHandler 的onEvent，代码如下：voidNetlinkHandler::onEvent(NetlinkEvent*evt){VolumeManager*vm=VolumeManager::Instance();constchar*subsys=evt-&gt;getSubsystem();if(!subsys){SLOGW("Nosubsystemfoundinnetlinkevent");return;}SLOGD("NetlinkHandler:OnEventsubsy</summary><published>2012-03-22T07:47:00Z</published><updated>2012-03-22T07:47:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411742.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411742.html"/><content type="html">&lt;p&gt;上一篇讲到通过NetlinkManager发送uevent 命令到NetlinkHandler 的onEvent，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;NetlinkHandler::onEvent(NetlinkEvent&amp;nbsp;*evt)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;&lt;strong&gt;VolumeManager&amp;nbsp;*vm&amp;nbsp;=&amp;nbsp;VolumeManager::Instance();&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*subsys&amp;nbsp;=&amp;nbsp;evt-&amp;gt;getSubsystem();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!subsys)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGW(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No&amp;nbsp;subsystem&amp;nbsp;found&amp;nbsp;in&amp;nbsp;netlink&amp;nbsp;event&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NetlinkHandler:OnEvent&amp;nbsp;subsys&amp;nbsp;values&amp;nbsp;is&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,subsys);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(subsys,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;block&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NetlinkHandler:onEvent&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&lt;strong&gt;&amp;nbsp;vm-&amp;gt;handleBlockEvent(evt);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;在NetlinkHandler 里面得一个VolumeManager，当收到的命令为block时调用VolumnManager的handleBlockEvent，如上加红加粗的代码。&lt;/p&gt;&lt;p&gt;handleBlockEvent实则是通过一个循环将事先将main事先读取的配置文件:etc/vold.fstab存进VolumeCollection，得到VolumeCollection的对象，然后调用Volume 的handleBlockEvent，如代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;VolumeManager::handleBlockEvent(NetlinkEvent&amp;nbsp;*evt)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*devpath&amp;nbsp;=&amp;nbsp;evt-&amp;gt;findParam(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DEVPATH&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Lookup&amp;nbsp;a&amp;nbsp;volume&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;this&amp;nbsp;device&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VolumeCollection::iterator&amp;nbsp;it;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;hit&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(it&amp;nbsp;=&amp;nbsp;mVolumes-&amp;gt;begin();&amp;nbsp;it&amp;nbsp;!=&amp;nbsp;mVolumes-&amp;gt;end();&amp;nbsp;++it)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;strong style="color: red; "&gt;(*it)-&amp;gt;handleBlockEvent(evt)&lt;/strong&gt;)&amp;nbsp;{&lt;br /&gt;#ifdef&amp;nbsp;NETLINK_DEBUG&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device&amp;nbsp;'%s'&amp;nbsp;event&amp;nbsp;handled&amp;nbsp;by&amp;nbsp;volume&amp;nbsp;%s\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devpath,&amp;nbsp;(*it)-&amp;gt;getLabel());&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hit&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!hit)&amp;nbsp;{&lt;br /&gt;#ifdef&amp;nbsp;NETLINK_DEBUG&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGW(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No&amp;nbsp;volumes&amp;nbsp;handled&amp;nbsp;block&amp;nbsp;event&amp;nbsp;for&amp;nbsp;'%s'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;devpath);&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;p&gt;看一下Volume 的handleblockEvent代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;Volume::handleBlockEvent(NetlinkEvent&amp;nbsp;*evt)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;ENOSYS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;&amp;nbsp;看起来好像没做什么事，其实真的实现在于Volume 的子类，DirectVolume，DirectVolme 中重写了handleBlockEvent，看代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;DirectVolume::handleBlockEvent(NetlinkEvent&amp;nbsp;*evt)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*dp&amp;nbsp;=&amp;nbsp;evt-&amp;gt;findParam(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DEVPATH&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PathCollection::iterator&amp;nbsp;&amp;nbsp;it;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(it&amp;nbsp;=&amp;nbsp;mPaths-&amp;gt;begin();&amp;nbsp;it&amp;nbsp;!=&amp;nbsp;mPaths-&amp;gt;end();&amp;nbsp;++it)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strncmp(dp,&amp;nbsp;*it,&amp;nbsp;strlen(*it)))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;We&amp;nbsp;can&amp;nbsp;handle&amp;nbsp;this&amp;nbsp;disk&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;action&amp;nbsp;=&amp;nbsp;evt-&amp;gt;getAction();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*devtype&amp;nbsp;=&amp;nbsp;evt-&amp;gt;findParam(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DEVTYPE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(action&amp;nbsp;==&amp;nbsp;NetlinkEvent::NlActionAdd)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;major&amp;nbsp;=&amp;nbsp;atoi(evt-&amp;gt;findParam(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MAJOR&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;minor&amp;nbsp;=&amp;nbsp;atoi(evt-&amp;gt;findParam(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MINOR&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;nodepath[&lt;span style="color: #800080;"&gt;255&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snprintf(nodepath,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(nodepath),&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/dev/block/vold/%d:%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;major,&amp;nbsp;minor);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(createDeviceNode(nodepath,&amp;nbsp;major,&amp;nbsp;minor))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&amp;nbsp;making&amp;nbsp;device&amp;nbsp;node&amp;nbsp;'%s'&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;nodepath,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(devtype,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;disk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleDiskAdded(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handlePartitionAdded(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(action&amp;nbsp;==&amp;nbsp;NetlinkEvent::NlActionRemove)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(devtype,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;disk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;handleDiskRemoved&lt;/strong&gt;(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DirectVolume:handleBlockEvent---&amp;gt;handlePartitionRemoved&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;handlePartitionRemoved&lt;/strong&gt;(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(action&amp;nbsp;==&amp;nbsp;NetlinkEvent::NlActionChange)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!strcmp(devtype,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;disk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleDiskChanged(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handlePartitionChanged(dp,&amp;nbsp;evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGW(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ignoring&amp;nbsp;non&amp;nbsp;add/remove/change&amp;nbsp;event&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;errno&amp;nbsp;=&amp;nbsp;ENODEV;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;因为我的板子还未完善，所以这里它认为我的sdcard是一个分区，但无关紧要，原理一样，就根据分区的代码跟踪。:&lt;strong style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; color: red; "&gt;handlePartitionRemoved，&lt;/strong&gt;由于代码过多，只贴出核心代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;DirectVolume::handlePartitionRemoved(&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;*devpath,&amp;nbsp;NetlinkEvent&amp;nbsp;*evt)&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;((dev_t)&amp;nbsp;MKDEV(major,&amp;nbsp;minor)&amp;nbsp;==&amp;nbsp;mCurrentlyMountedKdev)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Yikes,&amp;nbsp;our&amp;nbsp;mounted&amp;nbsp;partition&amp;nbsp;is&amp;nbsp;going&amp;nbsp;away!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snprintf(msg,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(msg),&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Volume&amp;nbsp;%s&amp;nbsp;%s&amp;nbsp;bad&amp;nbsp;removal&amp;nbsp;(%d:%d)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getLabel(),&amp;nbsp;getMountpoint(),&amp;nbsp;major,&amp;nbsp;minor);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DirectVolume:(dev_t)&amp;nbsp;MKDEV(major,&amp;nbsp;minor)&amp;nbsp;==&amp;nbsp;mCurrentlyMountedKdev:%d,msg&amp;nbsp;is&amp;nbsp;:%s.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,mCurrentlyMountedKdev,msg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;mVm-&amp;gt;getBroadcaster()-&amp;gt;sendBroadcast(ResponseCode::VolumeBadRemoval,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg,&amp;nbsp;&lt;/span&gt;&lt;span style="color: red; "&gt;false&lt;/span&gt;&lt;span style="color: red; "&gt;);&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mVm-&amp;gt;cleanupAsec(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;cleanup&amp;nbsp;ASEC&amp;nbsp;-&amp;nbsp;unmount&amp;nbsp;will&amp;nbsp;probably&amp;nbsp;fail!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;strong style="color: red; "&gt;Volume::unmountVol(&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;)&lt;/strong&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Failed&amp;nbsp;to&amp;nbsp;unmount&amp;nbsp;volume&amp;nbsp;on&amp;nbsp;bad&amp;nbsp;removal&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;XXX:&amp;nbsp;At&amp;nbsp;this&amp;nbsp;point&amp;nbsp;we're&amp;nbsp;screwed&amp;nbsp;for&amp;nbsp;now&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGD(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Crisis&amp;nbsp;averted&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;到此，直接调用父类的unmountVol方法，unmountVol会通过setState通知框架状态改变。代码太多，只推荐核心代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;Volume::unmountVol(&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;force,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;revert)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;setState(Volume::State_Unmounting);&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;而setState会通过socket将msg消息传给框架&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;mVm-&amp;gt;getBroadcaster()-&amp;gt;sendBroadcast(ResponseCode::VolumeStateChange,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;msg,&amp;nbsp;&lt;span style="color: #0000ff; "&gt;false&lt;/span&gt;);&amp;nbsp;&lt;/div&gt;&lt;p&gt;接下去的步骤是关于socket的操作，就不深入了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;　到了这一步，Vold 向上层反馈的动作基本己经完成，下一篇文章将会讲解Framework 如何取得Vold 反馈过来的数据。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2411742.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411742.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411628.html</id><title type="text">Android SDCard UnMounted 流程分析（一）</title><summary type="text">Android SDCard框架Android SDCard框架，我们修改一般涉及到四大模块 Linux Kernel 用于检测热拔插，作为框架开发者来说，这者不用涉及 Vold 作为Kernel 与 Framework 之间的桥梁 Framework 操作Vold ,给Vold 下发操作命令 UI与Framework 交互，用于挂载/卸载SD卡框架涉及的源码位置Vold :System/vold 为vold 提供接口：System/Netd 其他涉及的部分：System/core/libsysutils/src Sys...</summary><published>2012-03-22T06:53:00Z</published><updated>2012-03-22T06:53:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411628.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411628.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Android SDCard框架&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Android SDCard框架，我们修改一般涉及到四大模块&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;Linux Kernel 用于检测热拔插，作为框架开发者来说，这者不用涉及&lt;/li&gt;     &lt;li&gt;Vold 作为Kernel 与 Framework 之间的桥梁&lt;/li&gt;     &lt;li&gt;Framework 操作Vold ,给Vold 下发操作命令&lt;/li&gt;     &lt;li&gt;UI　与Framework 交互，用于挂载/卸载SD卡&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;框架涉及的源码位置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Vold :System/vold&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 为vold 提供接口：System/Netd&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 其他涉及的部分：System/core/libsysutils/src&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System/core/include/sysutils&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Framework:frameworks/base/services/java/com/android/server&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;访问和提供接口类：framework/base/core/java/android/os/storage/&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;可能还要参考的库：framework/base/libs/storage&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; framework/base/native&lt;/p&gt;&lt;p&gt;UI:Settings/src/com/android/setting/deviceinfo&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SDCard UnMounted流程分析&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;初始化&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;VolumeManager, CommandListener, NetlinkManager 都是在 main()函数里面初始化的。&lt;/p&gt;&lt;div&gt;其中 VolumeManager,NetlinkManager 内部采用单例模式。&lt;/div&gt;&lt;div&gt;(1) Class NetlinkManager 主要是创建于内核通信的 socket,接收来自底层的信息,然后传交给VolumeManager 处理。&lt;/div&gt;&lt;div&gt;(2) class CommandListener 主要收到上层 MountService 通过 doMountVolume 发来的命令,分析后,转交给 VolumeManager 处理;VolumeManager 处理信息后,或报告给上层 MountService,&lt;/div&gt;&lt;div&gt;或交给 volume 执行具体操作。CommandListener在main()初始化后，之后开始监听，会开一个线程不停的监听来自内核的消息。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;深入main文件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;在Vold 的main.cpp里面，启动一个线程用来监听kernel 发出unMounted 的uevent事件，代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;NetlinkManager&amp;nbsp;*nm;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;NetlinkManager内部使用的单例模式&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!(nm&amp;nbsp;=&amp;nbsp;NetlinkManager::Instance()))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;create&amp;nbsp;NetlinkManager&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始监听，从服务启动就一直监听&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: red; "&gt;nm-&amp;gt;start&lt;/span&gt;())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;start&amp;nbsp;NetlinkManager&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;NetlinkManager的start 函数是实例化了一个NetlinkHandler（继承关系：NetlinkHandler-&amp;gt;NetlinkListener-&amp;gt;SocketLinstener），并调用handler 的start方法，如下代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp; mHandler&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;NetlinkHandler(mSock);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: red; "&gt;mHandler-&amp;gt;start&lt;/span&gt;())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable&amp;nbsp;to&amp;nbsp;start&amp;nbsp;NetlinkHandler:&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;深入NetlinkHandler 的start函数，见代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;NetlinkHandler::start()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: red; "&gt;startListener&lt;/span&gt;();&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;上面有说过NetlinkHandler其实是SocketLinstener的子类，NetlinkHandler直接调用父类的startListener&amp;nbsp;方法，startListener开启了一个线程用来执行threadStart函数，代码太多，贴出主心代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(pthread_create(&amp;amp;mThread,&amp;nbsp;NULL,&amp;nbsp;&lt;span style="color: red; "&gt;SocketListener::threadStart&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pthread_create&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;而threadStart函数则调用了runListener方法，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*SocketListener::threadStart(&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*obj)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SocketListener&amp;nbsp;*me&amp;nbsp;=&amp;nbsp;reinterpret_cast&amp;lt;SocketListener&amp;nbsp;*&amp;gt;(obj);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;me-&amp;gt;runListener();&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_exit(NULL);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;NULL;&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;runListener会判断socket 有无信息可读，不会阻滞UI，最后调用onDataAvailable函数，代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;SocketListener::runListener()&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;SocketClientCollection&amp;nbsp;*pendingList&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;SocketClientCollection();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;font color="#0000ff"&gt;//代码有所省略&lt;/font&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; while (!pendingList-&amp;gt;empty()) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Pop the first item from the list */&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; it = pendingList-&amp;gt;begin();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SocketClient* c = *it;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pendingList-&amp;gt;erase(it);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Process it, if false is returned and our sockets are&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* connection-based, remove and destroy it */&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!&lt;span style="color: red; "&gt;onDataAvailable&lt;/span&gt;(c) &amp;amp;&amp;amp; mListen) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Remove the client from our array */&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pthread_mutex_lock(&amp;amp;mClientsLock);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (it = mClients-&amp;gt;begin(); it != mClients-&amp;gt;end(); ++it) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (*it == c) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mClients-&amp;gt;erase(it);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pthread_mutex_unlock(&amp;amp;mClientsLock);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Remove our reference to the client */&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c-&amp;gt;decRef();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;onDataAvailable会处理来自uEvent 的命令，并最终调用onEvent函数,onDataAvailable 位于System/core/libsysutils/src/NetlinkListener.cpp　这个主要处理一些socket方法的知识，一般不用修改。&lt;/p&gt;&lt;p&gt;最后由Netlinklinstener 来解析 ,代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;NetlinkListener::onDataAvailable(SocketClient&amp;nbsp;*cli)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;socket&amp;nbsp;=&amp;nbsp;cli-&amp;gt;getSocket();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssize_t&amp;nbsp;count;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;TEMP_FAILURE_RETRY(&lt;span style="color: red; "&gt;&lt;strong&gt;uevent_kernel_multicast_recv&lt;/strong&gt;&lt;/span&gt;(socket,&amp;nbsp;mBuffer,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(mBuffer)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(count&amp;nbsp;&amp;lt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;recvmsg&amp;nbsp;failed&amp;nbsp;(%s)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;strerror(errno));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NetlinkEvent&amp;nbsp;*evt&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;NetlinkEvent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!evt-&amp;gt;decode(mBuffer,&amp;nbsp;count,&amp;nbsp;mFormat))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLOGE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&amp;nbsp;decoding&amp;nbsp;NetlinkEvent&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="color: red; "&gt;onEvent&lt;/strong&gt;(evt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;evt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NetlinkManager其实就是用来处理uEvent 命令，并最终发送到vold/NetlinkHandler 的onEvent 。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2411628.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/22/2411628.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/09/2387716.html</id><title type="text">Android RenderScript 使用 Struct 及其下标的赋值</title><summary type="text">这是一个关于RenderScript如何使用 Struct 的文章，是学习RenderScript 一个必须要掌握的基础知识点。大纲 如何定义Struct 如何得到指针长度并循环为指针赋值 整体DEMO代码如何定义StructRenderScript 里面定义结构有两种定义方法，参考如下：1.typedefstructtempArray{float2position;floatsize;}Array_T;Array_T*myArray;2.//定义一个structtypedefstruct__attribute__((packed,aligned(4)))tempArr...</summary><published>2012-03-09T07:45:00Z</published><updated>2012-03-09T07:45:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/09/2387716.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/09/2387716.html"/><content type="html">&lt;p&gt;这是一个关于RenderScript如何使用 Struct 的文章，是学习RenderScript 一个必须要掌握的基础知识点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;大纲&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;如何定义Struct&lt;/li&gt;     &lt;li&gt;如何得到指针长度并循环为指针赋值&lt;/li&gt;     &lt;li&gt;整体DEMO代码&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;如何定义Struct&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;RenderScript 里面定义结构有两种定义方法，参考如下：&lt;/p&gt;&lt;p&gt;1.&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;typedef&amp;nbsp;struct&amp;nbsp;tempArray&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float2&amp;nbsp;position&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;size&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;}&amp;nbsp;Array_T&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Array_T&amp;nbsp;*myArray;&lt;/div&gt;&lt;p&gt;2.&lt;/p&gt;&lt;p&gt;&amp;nbsp;//定义一个struct&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;typedef&amp;nbsp;struct&amp;nbsp;__attribute__((packed,&amp;nbsp;aligned(4)))&amp;nbsp;tempArray&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;temp&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;}&amp;nbsp;Array_T&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;Array_T&amp;nbsp;*myArray&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;RenderScript 定义Struct 成功后，会自动生成一个java文件，如上面的&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;tempArray&lt;/span&gt;名称的结构，会生产这个文件:ScriptField_tempArray,代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Copyright&amp;nbsp;(C)&amp;nbsp;2011&amp;nbsp;The&amp;nbsp;Android&amp;nbsp;Open&amp;nbsp;Source&amp;nbsp;Project&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Licensed&amp;nbsp;under&amp;nbsp;the&amp;nbsp;Apache&amp;nbsp;License,&amp;nbsp;Version&amp;nbsp;2.0&amp;nbsp;(the&amp;nbsp;"License");&lt;br /&gt;&amp;nbsp;*&amp;nbsp;you&amp;nbsp;may&amp;nbsp;not&amp;nbsp;use&amp;nbsp;this&amp;nbsp;file&amp;nbsp;except&amp;nbsp;in&amp;nbsp;compliance&amp;nbsp;with&amp;nbsp;the&amp;nbsp;License.&lt;br /&gt;&amp;nbsp;*&amp;nbsp;You&amp;nbsp;may&amp;nbsp;obtain&amp;nbsp;a&amp;nbsp;copy&amp;nbsp;of&amp;nbsp;the&amp;nbsp;License&amp;nbsp;at&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Unless&amp;nbsp;required&amp;nbsp;by&amp;nbsp;applicable&amp;nbsp;law&amp;nbsp;or&amp;nbsp;agreed&amp;nbsp;to&amp;nbsp;in&amp;nbsp;writing,&amp;nbsp;software&lt;br /&gt;&amp;nbsp;*&amp;nbsp;distributed&amp;nbsp;under&amp;nbsp;the&amp;nbsp;License&amp;nbsp;is&amp;nbsp;distributed&amp;nbsp;on&amp;nbsp;an&amp;nbsp;"AS&amp;nbsp;IS"&amp;nbsp;BASIS,&lt;br /&gt;&amp;nbsp;*&amp;nbsp;WITHOUT&amp;nbsp;WARRANTIES&amp;nbsp;OR&amp;nbsp;CONDITIONS&amp;nbsp;OF&amp;nbsp;ANY&amp;nbsp;KIND,&amp;nbsp;either&amp;nbsp;express&amp;nbsp;or&amp;nbsp;implied.&lt;br /&gt;&amp;nbsp;*&amp;nbsp;See&amp;nbsp;the&amp;nbsp;License&amp;nbsp;for&amp;nbsp;the&amp;nbsp;specific&amp;nbsp;language&amp;nbsp;governing&amp;nbsp;permissions&amp;nbsp;and&lt;br /&gt;&amp;nbsp;*&amp;nbsp;limitations&amp;nbsp;under&amp;nbsp;the&amp;nbsp;License.&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;This&amp;nbsp;file&amp;nbsp;is&amp;nbsp;auto-generated.&amp;nbsp;DO&amp;nbsp;NOT&amp;nbsp;MODIFY!&lt;br /&gt;&amp;nbsp;*&amp;nbsp;The&amp;nbsp;source&amp;nbsp;Renderscript&amp;nbsp;file:&amp;nbsp;/home/terry/workspace/RenderScriptsArray/src/com/xuzhi/renderScriptArray/array.rs&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;package&lt;/span&gt;&amp;nbsp;com.xuzhi.renderScriptArray;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.*;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.content.res.Resources;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@hide&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;ScriptField_tempArray&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;android.renderscript.Script.FieldBase&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Item&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;sizeof&amp;nbsp;=&amp;nbsp;4;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;temp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Item()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;Item&amp;nbsp;mItemArray[];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;FieldPacker&amp;nbsp;mIOBuffer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;Element&amp;nbsp;createElement(RenderScript&amp;nbsp;rs)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Element.Builder&amp;nbsp;eb&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Element.Builder(rs);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eb.add(Element.I32(rs),&amp;nbsp;"temp");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;eb.create();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&amp;nbsp;ScriptField_tempArray(RenderScript&amp;nbsp;rs,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;count)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mItemArray&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mIOBuffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mElement&amp;nbsp;=&amp;nbsp;createElement(rs);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init(rs,&amp;nbsp;count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&amp;nbsp;ScriptField_tempArray(RenderScript&amp;nbsp;rs,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;count,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;usages)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mItemArray&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mIOBuffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mElement&amp;nbsp;=&amp;nbsp;createElement(rs);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init(rs,&amp;nbsp;count,&amp;nbsp;usages);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;copyToArrayLocal(Item&amp;nbsp;i,&amp;nbsp;FieldPacker&amp;nbsp;fp)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp.addI32(i.temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;copyToArray(Item&amp;nbsp;i,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;index)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mIOBuffer&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mIOBuffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;FieldPacker(Item.sizeof&amp;nbsp;*&amp;nbsp;getType().getX()&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mIOBuffer.reset(index&amp;nbsp;*&amp;nbsp;Item.sizeof);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copyToArrayLocal(i,&amp;nbsp;mIOBuffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;set(Item&amp;nbsp;i,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;index,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;boolean&lt;/span&gt;&amp;nbsp;copyNow)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mItemArray&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Item[getType().getX()&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mItemArray[index]&amp;nbsp;=&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(copyNow)&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copyToArray(i,&amp;nbsp;index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FieldPacker&amp;nbsp;fp&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;FieldPacker(Item.sizeof);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copyToArrayLocal(i,&amp;nbsp;fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mAllocation.setFromFieldPacker(index,&amp;nbsp;fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;Item&amp;nbsp;get(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;index)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;mItemArray[index];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;set_temp(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;index,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;v,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;boolean&lt;/span&gt;&amp;nbsp;copyNow)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mIOBuffer&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mIOBuffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;FieldPacker(Item.sizeof&amp;nbsp;*&amp;nbsp;getType().getX()&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mItemArray&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Item[getType().getX()&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray[index]&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mItemArray[index]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Item();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mItemArray[index].temp&amp;nbsp;=&amp;nbsp;v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(copyNow)&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mIOBuffer.reset(index&amp;nbsp;*&amp;nbsp;Item.sizeof);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mIOBuffer.addI32(v);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FieldPacker&amp;nbsp;fp&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;FieldPacker(4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp.addI32(v);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mAllocation.setFromFieldPacker(index,&amp;nbsp;0,&amp;nbsp;fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;get_temp(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;index)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;mItemArray[index].temp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;copyAll()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;ct&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;ct&amp;nbsp;&amp;lt;&amp;nbsp;mItemArray.length;&amp;nbsp;ct++)&amp;nbsp;copyToArray(mItemArray[ct],&amp;nbsp;ct);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mAllocation.setFromFieldPacker(0,&amp;nbsp;mIOBuffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;synchronized&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;resize(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;newSize)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mItemArray&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;oldSize&amp;nbsp;=&amp;nbsp;mItemArray.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;copySize&amp;nbsp;=&amp;nbsp;Math.min(oldSize,&amp;nbsp;newSize);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(newSize&amp;nbsp;==&amp;nbsp;oldSize)&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Item&amp;nbsp;ni[]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Item[newSize];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.arraycopy(mItemArray,&amp;nbsp;0,&amp;nbsp;ni,&amp;nbsp;0,&amp;nbsp;copySize);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mItemArray&amp;nbsp;=&amp;nbsp;ni;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mAllocation.resize(newSize);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mIOBuffer&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;mIOBuffer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;FieldPacker(Item.sizeof&amp;nbsp;*&amp;nbsp;getType().getX()&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;生成的代码是提供给你做内存分配和操作类似数组的功能。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何得到指针长度并循环为指针赋值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;RenderScript 有两个函数是专门用来获取指针长度的：&lt;/p&gt;&lt;p&gt;rsGetAllocation：&amp;nbsp;返回一个己经分配过地址的指针&lt;/p&gt;&lt;p&gt;rsAllocationGetDimX&amp;nbsp;：获取返回指针的长度&lt;/p&gt;&lt;p&gt;&amp;nbsp;通过将这两个函数做组合使用可以返回指针长度,代码如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;const&amp;nbsp;int&amp;nbsp;size&amp;nbsp;=&amp;nbsp;rsAllocationGetDimX(rsGetAllocation(myArray))&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;取得了长度即可以为指针内部变量赋值，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;for(int&amp;nbsp;i=0&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;i&amp;lt;size;i++){&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array-&amp;gt;temp=i&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//循环赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsDebug("current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;",&amp;nbsp;array-&amp;gt;temp)&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//打印当前值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//指向下个指针&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array++&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;整体DEMO代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;本DEMO没有任何界面 ，只是演示如何使用struct并打印出指针下标原素的值，如此简单， 涉及的rs文件代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma&amp;nbsp;version(1)&lt;br /&gt;#pragma&amp;nbsp;rs&amp;nbsp;java_package_name(com.xuzhi.renderScriptArray)&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp;"rs_graphics.rsh"&lt;br /&gt;&lt;br /&gt;static&amp;nbsp;int&amp;nbsp;initialized&amp;nbsp;=&amp;nbsp;0&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;//定义一个struct&lt;br /&gt;typedef&amp;nbsp;struct&amp;nbsp;__attribute__((packed,&amp;nbsp;aligned(4)))&amp;nbsp;tempArray&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;temp&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;}&amp;nbsp;Array_T&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;Array_T&amp;nbsp;*myArray&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static&amp;nbsp;void&amp;nbsp;&amp;nbsp;initArray(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array_T&amp;nbsp;*array=myArray&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//得到struct长度&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//1.返回一个己经分配过地址的指针&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//2.获取返回指针的长度&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;const&amp;nbsp;int&amp;nbsp;size&amp;nbsp;=&amp;nbsp;rsAllocationGetDimX(rsGetAllocation(myArray))&lt;/span&gt;&lt;span style="color: red; "&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int&amp;nbsp;i=0&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;i&amp;lt;size;i++){&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array-&amp;gt;temp=i&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//循环赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsDebug("current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;",&amp;nbsp;array-&amp;gt;temp)&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//打印当前值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//指向下个指针&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array++&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int&amp;nbsp;root(){&lt;br /&gt;&amp;nbsp;rsgClearColor(0.0f,&amp;nbsp;1.0f,&amp;nbsp;0.0f,&amp;nbsp;1.0f)&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;if(initialized==0){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initArray()&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialized=1&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;16&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;java 代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;package&lt;/span&gt;&amp;nbsp;com.xuzhi.renderScriptArray;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.app.Activity;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.content.Context;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.content.res.Resources;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.os.Bundle;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.Allocation;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.RSSurfaceView;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.RenderScriptGL;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;RenderScriptsArrayActivity&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;Activity&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Called&amp;nbsp;when&amp;nbsp;the&amp;nbsp;activity&amp;nbsp;is&amp;nbsp;first&amp;nbsp;created.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onCreate(Bundle&amp;nbsp;savedInstanceState)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;renderScriptView(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;));&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;renderScriptRS&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;ScriptC_array&amp;nbsp;mScript;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;ScriptField_tempArray&amp;nbsp;array;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RenderScriptGL&amp;nbsp;mRS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;renderScriptRS(RenderScriptGL&amp;nbsp;rs,Resources&amp;nbsp;resource)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;constructor&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS=rs;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化struct&amp;nbsp;并为其指定有多少个下标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;array=&lt;/span&gt;&lt;span style="color: red; "&gt;new&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;ScriptField_tempArray(mRS,&amp;nbsp;10,Allocation.USAGE_SCRIPT|Allocation.USAGE_GRAPHICS_VERTEX);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;实始化CcriptC&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;mScript=&lt;/span&gt;&lt;span style="color: red; "&gt;new&lt;/span&gt;&lt;span style="color: red; "&gt;&amp;nbsp;ScriptC_array(mRS,&amp;nbsp;resource,&amp;nbsp;R.raw.array);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绑定struct&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;mScript.bind_myArray(array);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绑定脚本&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;mRS.bindRootScript(mScript);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;renderScriptView&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;RSSurfaceView&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;RenderScriptGL&amp;nbsp;mRS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;renderScriptRS&amp;nbsp;mRender;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;renderScriptView(Context&amp;nbsp;context)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;(context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;constructor&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onAttachedToWindow()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;.onAttachedToWindow();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android.util.Log.e("rs",&amp;nbsp;"onAttachedToWindow");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mRS&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RenderScriptGL.SurfaceConfig&amp;nbsp;sc&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;RenderScriptGL.SurfaceConfig();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;createRenderScriptGL(sc);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRender&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;renderScriptRS(mRS,&amp;nbsp;getResources());&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onDetachedFromWindow()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;.onDetachedFromWindow();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mRS&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destroyRenderScriptGL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;都加了注释了，最主要的四段代码标注了红色，要注意。&lt;/p&gt;&lt;p&gt;&amp;nbsp;运行结果：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;03-09&amp;nbsp;15:47:50.492:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;0&amp;nbsp;&amp;nbsp;0x0&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;0x1&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;2&amp;nbsp;&amp;nbsp;0x2&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;3&amp;nbsp;&amp;nbsp;0x3&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;4&amp;nbsp;&amp;nbsp;0x4&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;5&amp;nbsp;&amp;nbsp;0x5&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;0x6&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;0x7&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;0x8&lt;br /&gt;03-09&amp;nbsp;15:47:50.507:&amp;nbsp;D/RenderScript(2298):&amp;nbsp;current&amp;nbsp;value&amp;nbsp;is&amp;nbsp;====&amp;gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;0x9&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2387716.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/09/2387716.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/05/2380500.html</id><title type="text">Android RenderScript 关于Compute 的使用</title><summary type="text">RenderScript 不仅可以用来画图，而且可以用来做密集的计算操作。目前的API可以使用到的是利用CPU的核心优势来帮我们做计算。在未来，可能会包括GPU和DSP处理器上做精密计算。创建一个Compute 的RenderScript 下面有一张图详细的介绍了勾划了一个Compute 的 RenderScript:图解：Andriod 有一个RenderScript Compute 的引擎来支持做精密计算，后期google 会不断扩展这个引擎让其支持更多的精密计算如上面提到的GPU、DSP等等，创建Compute RenderScript 同样的也必须写一个.rs 文件，做运行时生成对..</summary><published>2012-03-05T07:23:00Z</published><updated>2012-03-05T07:23:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/05/2380500.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/05/2380500.html"/><content type="html">&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;RenderScript 不仅可以用来画图，而且可以用来做密集的计算操作。目前的API可以使用到的是利用CPU的核心优势来帮我们做计算。在未来，可能会包括GPU和DSP处理器上做精密计算。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建一个Compute &amp;nbsp;的RenderScript&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;下面有一张图详细的介绍了勾划了一个Compute 的 RenderScript:&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/terryblog/rs_compute.png" border="0" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;图解：Andriod 有一个RenderScript Compute 的引擎来支持做精密计算，后期google 会不断扩展这个引擎让其支持更多的精密计算如上面提到的GPU、DSP等等，创建Compute RenderScript 同样的也必须写一个.rs 文件，做运行时生成对象读取调用。之后在Android 上层实现计算功能。另，（&lt;strong&gt;必须显示在应用上调用forEach_root或者在RenderScript 运行时运件中.rs，调用rsForEach()，Compute 才会自动调用硬件支持核心来计算&lt;/strong&gt;） .&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;参照DEMO&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;&amp;nbsp;在上层调用forEach_root 计算的DEMO&lt;/li&gt;     &lt;li&gt;在RenderScript 运行时调用rsForEach计算的DEMO&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其实，两个DEMO都实现了同一样的功能，就是将一张图片使用滤镜效果将其变颜色RGB值变成灰尘色，而另一张则原样显示，该DEMO参考了SDK中的HelloWorldCompute DEMO，而唯一与SDK中不一样的地方是在：SDK是在于上层调用forEach_root方法进行计算，而我使用的是在.rs 中调用rsForEach方法进行计算。两者功能相同，实现效果不一样而已。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;在上层调用forEach_root 计算的DEMO&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;区别的代码在于：&amp;nbsp;&lt;/p&gt;&lt;p&gt;SDK DEMO&amp;nbsp;&lt;/p&gt;&lt;p&gt;.rs文件 ：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;#pragma&lt;/span&gt;&amp;nbsp;version(1)&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;#pragma&lt;/span&gt;&amp;nbsp;rs&amp;nbsp;java_package_name(com.example.android.rs.hellocompute)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;float3&amp;nbsp;gMonoMult&amp;nbsp;=&amp;nbsp;{&lt;span style="color: #800080;"&gt;0.299f&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0.587f&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0.114f&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;root(&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;uchar4&amp;nbsp;*v_in,&amp;nbsp;uchar4&amp;nbsp;*v_out)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float4&amp;nbsp;f4&amp;nbsp;=&amp;nbsp;rsUnpackColor8888(*v_in);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float3&amp;nbsp;mono&amp;nbsp;=&amp;nbsp;dot(f4.rgb,&amp;nbsp;gMonoMult);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;dot:[0]*[0]+[1]*[1]+[2]*[2]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_out&amp;nbsp;=&amp;nbsp;rsPackColorTo8888(mono);&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;createScript方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;createScript()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;RenderScript.create(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mInAllocation&amp;nbsp;=&amp;nbsp;Allocation.createFromBitmap(mRS,&amp;nbsp;mBitmapIn,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Allocation.MipmapControl.MIPMAP_NONE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Allocation.USAGE_SCRIPT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutAllocation&amp;nbsp;=&amp;nbsp;Allocation.createTyped(mRS,&amp;nbsp;mInAllocation.getType());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;ScriptC_mono(mRS,&amp;nbsp;getResources(),&amp;nbsp;R.raw.mono);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;mScript.forEach_root(mInAllocation,&amp;nbsp;mOutAllocation);//通知RenderScript Compute Runtime&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutAllocation.copyTo(mBitmapOut);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;在RenderScript 运行时调用rsForEach计算的DEMO&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;.rs文件：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;#pragma&lt;/span&gt;&amp;nbsp;version(1)&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;#pragma&lt;/span&gt;&amp;nbsp;rs&amp;nbsp;java_package_name(com.xuzhi.renderScriptCompute)&lt;br /&gt;&lt;br /&gt;rs_allocation&amp;nbsp;gIn;&lt;br /&gt;rs_allocation&amp;nbsp;gOut;&lt;br /&gt;&lt;br /&gt;rs_script&amp;nbsp;gScript;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;float3&amp;nbsp;gMonoMult={&lt;span style="color: #800080;"&gt;0.299f&lt;/span&gt;,&lt;span style="color: #800080;"&gt;0.587f&lt;/span&gt;,&lt;span style="color: #800080;"&gt;0.114f&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;root(&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;uchar4&amp;nbsp;*v_in,&amp;nbsp;uchar4&amp;nbsp;*v_out,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;*usrData,&amp;nbsp;uint32_t&amp;nbsp;x,&amp;nbsp;uint32_t&amp;nbsp;y){&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将一个uchar4&amp;nbsp;的颜色解压为float4&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float4&amp;nbsp;f4=rsUnpackColor8888(*v_in);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;dot:[0]*[0]+[1]*[1]+[2]*[2]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float3&amp;nbsp;mono=dot(f4.rgb,gMonoMult);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打包uchar4，alpha&amp;nbsp;默认为1.0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_out=rsPackColorTo8888(mono);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;filter(){&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用RenderScript&amp;nbsp;进行处理(操作输入的图片然后把处理的结果放到输出结果中)，最后把处理完的数据存回bitmap&amp;nbsp;，在ImageView显示出来&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsForEach(gScript,&amp;nbsp;gIn,&amp;nbsp;gOut);&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;createScript方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;createScript()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;RenderScript.create(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;从一个bitmap&amp;nbsp;创建一个allocation&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mInAllocation&amp;nbsp;=&amp;nbsp;Allocation.createFromBitmap(mRS,&amp;nbsp;mBitmapIn,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Allocation.MipmapControl.MIPMAP_NONE,&amp;nbsp;Allocation.USAGE_SCRIPT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutAllocation=Allocation.createTyped(mRS,&amp;nbsp;mInAllocation.getType());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript=&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;ScriptC_mono(mRS,&amp;nbsp;getResources(),&amp;nbsp;R.raw.mono);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red; "&gt;&amp;nbsp;mScript.set_gIn(mInAllocation);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript.set_gOut(mOutAllocation);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript.set_gScript(mScript);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: red; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript.invoke_filter();&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;//通知RenderScript Compute Runtime&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mOutAllocation.copyTo(mBitmapOut);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;两种方法无论怎么变化，最终的上的都是要通知RenderScript Compute 运行时做计算功能。 运行效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/terryblog/computerender.png" border="0" alt="" width="852" height="414" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a target="_blank" title="RenderScript-&amp;gt;Compute" href="http://files.cnblogs.com/TerryBlog/Compute.zip" style="color: #ff0000; "&gt;RenderScript-&amp;gt;Compute&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2380500.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/05/2380500.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html</id><title type="text">关于Android RenderScript 的详细说明和一些实用文档</title><summary type="text">RenderScript 是一种低级的高性能编程语言，用于3D渲染和处理密集型计算（3D播放等和关于CPU密集型的计算）。一直以来Android 在绘图性能的表现一直差强人意，引入NDK之后才有所改善，而在Honeycomb 中发布了RenderScript 这一杀手级在Framework 后，大大的增加了Android 本地语言的执行能力和计算能力。以下是参考一些网上总结的几点：编程语言和可移植性RenderScript 采用了c99语法（标准C来自1999年，最新标准是C11，来自2011年），新的应用编程接口（API）最终编译成原生代码。这意味着做为Android 图形开发者就不得不再系</summary><published>2012-03-02T07:15:00Z</published><updated>2012-03-02T07:15:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html"/><content type="html">&lt;p&gt;RenderScript 是一种低级的高性能编程语言，用于3D渲染和处理密集型计算（3D播放等和关于CPU密集型的计算）。一直以来Android 在绘图性能的表现一直差强人意，引入NDK之后才有所改善，而在Honeycomb 中发布了RenderScript 这一杀手级在Framework 后，大大的增加了Android 本地语言的执行能力和计算能力。以下是参考一些网上总结的几点：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;编程语言和可移植性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RenderScript 采用了c99语法（标准C来自1999年，最新标准是C11，来自2011年），新的应用编程接口（API）最终编译成原生代码。这意味着做为Android 图形开发者就不得不再系统的学习一套API，因为它的API并非人人都清楚，而Google 对于RenderScript &amp;nbsp;这方面的文档又少之又少。&lt;/p&gt;&lt;p&gt;RenderScript 无法从其他C应用程序移植过来，不过它在Android 设备上比NDK 更常见。相比于NDK的可移植性要弱一些，记得以前移植过一个C程序叫Cadaver的webdav客户端 就是使用的NDK，所以这点来说RenderScript 的移植性可以说有待改善。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;编译和调试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RenderScript 在机器上进行第一遍编译，然后在目标设备上进行最后一遍编译（Just-In-Time Compiling），因而带来更高效的原生二进制代码。这也就是意味着，凡是支持RenderScript 的设备都可以运行你的代码。不用管什么架构。&lt;/p&gt;&lt;p&gt;目前 ，RenderScript 带来的代码只能在主处理器上运行，它会自动生成可利用多个核心的代码（如果设备上有多个核心）。就因此，编译出来的程序是针对该机器的最佳优化，这解决了Device Fragmentation,也就是说开发者再也不必担心使用者的手机、平板够不够好、有没有GPU...等等问题，全都交给RenderScript 去担心就好。没有GPU,RenderScript 写好的程序就交由CPU来处理（背后的编译技术其实是使用的LLVM）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;性能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RenderScript 有类似于CUDA的Compute API用于计算，配置和设置相对比较容易。最终的运行速度实际上要比胜过于NDK 的实现方式， 需要编写的代码比较少。而RenderScript 最适合用于做3D的用户界面或高性能计算任务。而上面的编译和调试所说的一样，随着最后一遍的编译可以通过硬件直接或得性能的提升。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;引入RenderScript 并不是来代替NDK的，而是给开发者多一种选择。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何学习？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于官方的文档&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://developer.android.com/guide/topics/renderscript/index.html&amp;nbsp; 这是官方RenderScript 的首页&lt;/p&gt;&lt;p&gt;http://developer.android.com/guide/topics/renderscript/graphics.html&amp;nbsp; &amp;nbsp;关于图形方面的知识&lt;/p&gt;&lt;p&gt;http://developer.android.com/guide/topics/renderscript/compute.html&amp;nbsp; 关于计算方面的知识&lt;/p&gt;国外一个比较不错的开发者的博客，目前只有两篇：&amp;nbsp;&lt;p&gt;http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/&lt;/p&gt;http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外那些rs文件里面的函数如何寻找？&lt;/p&gt;&lt;p&gt;4.0的请到框架这里查找相应的头文件：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;frameworks/base/libs/rs/scriptc，这里包含以下的头文件&lt;/div&gt;&lt;p&gt;&amp;nbsp;rs_allocation.rsh &amp;nbsp;rs_atomic.rsh &amp;nbsp;rs_cl.rsh &amp;nbsp;rs_core.rsh &amp;nbsp;rs_debug.rsh &amp;nbsp;rs_graphics.rsh &amp;nbsp;rs_math.rsh &amp;nbsp;rs_matrix.rsh &amp;nbsp;rs_object.rsh &amp;nbsp;rs_quaternion.rsh &amp;nbsp;rs_time.rsh &amp;nbsp;rs_types.rsh&lt;/p&gt;&lt;p&gt;或者在SDK的platform 下也可以找到。&lt;/p&gt;&lt;p&gt;对应的文档在下面：&lt;/p&gt;&lt;p&gt;&lt;iframe src="http://developer.android.com/reference/renderscript/index.html" frameborder="0" height="800" scrolling="none" width="800"&gt;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;nbsp;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;nbsp;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;nbsp;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;nbsp;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;nbsp;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;br id="-moz-br-"&amp;amp;amp;gt;&amp;amp;amp;lt;/body&amp;amp;amp;gt;&amp;amp;amp;lt;/html&amp;amp;amp;gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;另外：&lt;/p&gt;&lt;p&gt;想学好RenderScript 必须先看一下关于图形学方面的知识和熟悉OpenGL方面的知识，路遥遥呀。。。。&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2377251.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TerryBlog/archive/2012/03/01/2375450.html</id><title type="text">Android RenderScript 的使用基础篇</title><summary type="text">准备上4.0项目，最近接触API 的时候看到了RenderScript 。通过运行google 那几个项目发现这个真是一个非常不错的API，但是google 所提供的文档非常少，有助于了解计算机图形计算，虽然我们做应用编程的不一定要涉及这块，但涉猎一下总是不错的。RenderScript 是Android 平台上的一种类C脚本语言。要在我们程序上实现RenderScript 渲染功能，最少需要实现的几个功能如下，以一个Hello Wold 为例： helloworld.rs实现RenderScript 的代码 RenderScriptRS.java 一个辅助类，简化操...</summary><published>2012-03-01T05:54:00Z</published><updated>2012-03-01T05:54:00Z</updated><author><name>Terry_龙</name><uri>http://www.cnblogs.com/TerryBlog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/01/2375450.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TerryBlog/archive/2012/03/01/2375450.html"/><content type="html">&lt;p&gt;准备上4.0项目，最近接触API 的时候看到了RenderScript 。通过运行google 那几个项目发现这个真是一个非常不错的API，但是google 所提供的文档非常少，有助于了解计算机图形计算，虽然我们做应用编程的不一定要涉及这块，但涉猎一下总是不错的。&lt;/p&gt;&lt;p&gt;RenderScript 是Android 平台上的一种类C脚本语言。要在我们程序上实现RenderScript 渲染功能，最少需要实现的几个功能如下，以一个Hello Wold 为例：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;helloworld.rs&amp;nbsp;实现RenderScript 的代码&lt;/li&gt;     &lt;li&gt;     &lt;div&gt;RenderScriptRS.java 一个辅助类，简化操作RenderScript (非必要)&amp;nbsp;&lt;/div&gt;     &lt;/li&gt;     &lt;li&gt;     &lt;div&gt;RenderScriptView.java &amp;nbsp;一个继承于RSSurfaceView的类，用于显示RenderScript 的渲染或者用来处理用户的触摸等视图&lt;/div&gt;     &lt;/li&gt;     &lt;li&gt;     &lt;div&gt;RenderScriptHelloWorldActivity.java 这个不用多说，Android 应用程序的界面类&lt;/div&gt;     &lt;p&gt;&amp;nbsp;&lt;/p&gt;     &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;当创建一个RenderScript 的项目的时候，必须在包名下创建一个以rs为后缀的文件(位于我们Activity 同包名下)，如本篇文章使用的helloworld.rs文件.&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma&amp;nbsp;version(1)&lt;br /&gt;#pragma&amp;nbsp;rs&amp;nbsp;java_package_name(com.xuzhi.rs.helloworld)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp;"rs_graphics.rsh"&lt;br /&gt;&lt;br /&gt;int&amp;nbsp;gTouchX&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;int&amp;nbsp;gTouchY&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;void&amp;nbsp;init(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gTouchX=50.0f&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gTouchY=50.0f&lt;span style="color: #008000;"&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;//application&amp;nbsp;main&amp;nbsp;&lt;br /&gt;int&amp;nbsp;root(void){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsgClearColor(0.0f,1.0f,0.0f,0.0f)&lt;span style="color: #008000;"&gt;;//颜色更改为no red,full green,no blue,no opacity ，的RGBA值&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsgFontColor(1.0f,0.0f,1.0f,1.0f)&lt;span style="color: #008000;"&gt;;//设置字体颜色&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsgDrawText("my&amp;nbsp;first&amp;nbsp;renderscript&amp;nbsp;application",gTouchX,gTouchY)&lt;span style="color: #008000;"&gt;;//根据应用传上来的x,y 将字画在屏幕对应的坐标上&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsDebug("======my&amp;nbsp;renderscript&amp;nbsp;debug========",rsUptimeMillis())&lt;span style="color: #008000;"&gt;;//打印日志&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 20&lt;span style="color: #008000;"&gt;;&lt;br /&gt;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;注解：&lt;/p&gt;&lt;p&gt;#pragma:简单的可以理解告诉或者通知编译器编译这个文件时需要的参数或者指定编译的版本等，跟编译器有关。&lt;/p&gt;&lt;p&gt;void init():这个函数作一些初始化动作&lt;/p&gt;&lt;p&gt;int root(viod):程序入口，根据返回值(ms)作刷新。比如上面写的20相当于每20毫秒刷新一次。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; root 函数下&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;rsgClearColor,&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;rsgFontColor,&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;rsgDrawText都位于rs_graphics.rsh头文件下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;rsDebug是打印日志函数，位于&lt;/span&gt;&lt;span style="color: #222222; font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; line-height: 24px; background-color: #eeeeff; "&gt;rs_core.rsh头文件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;在上面的代码中，日志将己每20毫秒打印一次这样的日志：03-01 11:09:18.289: D/RenderScript(1838): ======my renderscript debug======== 600462 &amp;nbsp;0x9298e&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp; &amp;nbsp; rsUptimeMillis则定义在rs_time.rsh头文件中。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;目前有关于RenderScript调用的函数位于我们SDK目录下(platforms/android-*[目前11-15]/renderscript/include)目录里面的头文件中。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;好了，rs文件己经编写完成，接着往下走。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;下一步，为了方便调用RenderScript 这里创建了一个辅助类，RenderScriptRS.java。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #008000; "&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;font color="#008000"&gt;&amp;nbsp;*&amp;nbsp;Render&amp;nbsp;Script&amp;nbsp;help&amp;nbsp;&lt;/font&gt;&lt;br /&gt;&lt;font color="#008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/font&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;terry&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;RenderScriptRS&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;RenderScriptGL&amp;nbsp;mRS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;ScriptC_hellowold&amp;nbsp;mScript;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;RenderScriptRS(RenderScriptGL&amp;nbsp;rs,Resources&amp;nbsp;resource)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;constructor&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS=rs;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript=&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;ScriptC_helloworld(mRS,&amp;nbsp;resource,&amp;nbsp;R.raw.hellowold);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS.bindRootScript(mScript);&amp;nbsp;&lt;span style="color: #008000;"&gt;//绑定脚本&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;传入坐标&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@param&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@param&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onActionDown(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;x,&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;y){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript.set_gTouchX(x);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mScript.set_gTouchY(y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;目前我们所做的一切都是要使用到的RenderScriptGL(RenderScript 图形的衍生)，实例化RenderScriptGL并绑定脚本。如果你的开发ADT高于或者是1.5的话Eclipse 会根据你的rs文件生成ScriptC_你的rs文件为名的java类。如上面代码的ScriptC_helloworld一样，并且在资源目录res/raw生成一个.bc的文件，在实例化ScriptC_hellowold会需要传进去。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;下一步，创建RenderScriptView.java,让其可以显示在界面上。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.content.Context;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.RSSurfaceView;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.RenderScriptGL;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.renderscript.RenderScriptGL.SurfaceConfig;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;android.view.MotionEvent;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;RenderScriptView&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;RSSurfaceView&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;RenderScriptGL&amp;nbsp;mRS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;RenderScriptRS&amp;nbsp;mRender;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;RenderScriptView(Context&amp;nbsp;context)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;(context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;constructor&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initRenderScript();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;初始化RenderScriptRS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;initRenderScript()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mRS&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RenderScriptGL.SurfaceConfig&amp;nbsp;config&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;SurfaceConfig();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;createRenderScriptGL(config);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRender&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;RenderScriptRS(mRS,&amp;nbsp;getResources());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onDetachedFromWindow()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Handle&amp;nbsp;the&amp;nbsp;system&amp;nbsp;event&amp;nbsp;and&amp;nbsp;clean&amp;nbsp;up&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRender&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(mRS&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRS&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destroyRenderScriptGL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onAttachedToWindow()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;method&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;.onAttachedToWindow();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initRenderScript();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;boolean&lt;/span&gt;&amp;nbsp;onTouchEvent(MotionEvent&amp;nbsp;event)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;method&amp;nbsp;stub&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;传入点击坐标&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(event.getAction()&amp;nbsp;==&amp;nbsp;MotionEvent.ACTION_DOWN)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mRender.onActionDown((&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;)&amp;nbsp;event.getX(),&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;)&amp;nbsp;event.getY());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;RSSurfaceView扩展自SurfaceView，用来显示这些需要渲染的图形界面。&lt;/p&gt;&lt;p&gt;&amp;nbsp;上述代码&lt;font face="'Courier New'" size="2"&gt;&lt;span style="line-height: 19px; "&gt;的initRenderScript方法，如果&lt;/span&gt;&lt;/font&gt;RenderScriptGL 未实例化，就需要创建一个SurfaceConfig(这是用来控制深度的颜色，深度缓冲区等等，这里使用默认)，并且让它实现自身的onTouchEvent事件，传入x,y坐标轴进入RenderScript，改变文本显示的位置(跟随鼠标的点击点变化)。&lt;/p&gt;&lt;p&gt;最后的界面只需要让它显示出来即可：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;RenderScriptHelloWorldActivity&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extends&lt;/span&gt;&amp;nbsp;Activity&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Called&amp;nbsp;when&amp;nbsp;the&amp;nbsp;activity&amp;nbsp;is&amp;nbsp;first&amp;nbsp;created.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onCreate(Bundle&amp;nbsp;savedInstanceState)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;super&lt;/span&gt;.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;RenderScriptView(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;这一系列的步骤可以用一张图来做说明，详细的规划了RenderScript 的图形概述：&lt;br /&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/terryblog/rs_graphics.png" border="0" alt="" width="559" height="460" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;这是一个简单的DEMO，介绍了RenderScript 使用的一些基本步骤，详细的使用后面会慢慢提到。最后通过上面的代码可以看到的运行效果如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/terryblog/device-2012-03-01-133850.png" border="0" alt="" width="1280" height="768" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;另外，后文还会提供一些详细的文档和例子。比如：&lt;/p&gt;&lt;ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff; "&gt;     &lt;li style="margin-bottom: 0.3em; "&gt;rs_graphics&lt;/li&gt;     &lt;li style="margin-bottom: 0.3em; "&gt;rs_core&lt;/li&gt;     &lt;li style="margin-bottom: 0.3em; "&gt;rs_math&lt;/li&gt;     &lt;li style="margin-bottom: 0.3em; "&gt;rs_time&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;上面这四个的头文件的API。&lt;/p&gt;&lt;p&gt;代码可以在Android 4.0中找到，RenderScript-&gt;Helloworld。&lt;br/&gt;注：模拟器无法运行。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TerryBlog/aggbug/2375450.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TerryBlog/archive/2012/03/01/2375450.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
