<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_海王</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/63928/rss</id><updated>2012-05-29T12:16:15Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/63928/rss"/><entry><id>http://www.cnblogs.com/leaven/archive/2012/05/29/2524553.html</id><title type="text">wireshark过滤规则</title><summary type="text">http://blog.chinaunix.net/uid-15797451-id-3041829.html一、IP过滤：包括来源IP或者目标IP等于某个IP比如：ip.src addr==192.168.0.208 or ip.src addr eq 192.168.0.208 显示来源IP (ip.addr(或者ip.src)==192.168.10.87)//有自动补全功能 ip.dst addr==192.168.0.208 or ip.dst addr eq 192.168.0.208 显示目标IP二、端口过滤：比如：tcp.port eq 80 // 不管端口是来源的还是目标的都显</summary><published>2012-05-29T12:15:00Z</published><updated>2012-05-29T12:15:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/05/29/2524553.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/05/29/2524553.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;http://blog.chinaunix.net/uid-15797451-id-3041829.html&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一、IP过滤：包括来源IP或者目标IP等于某个IP&lt;/p&gt;比如：ip.src addr==192.168.0.208&amp;nbsp; or ip.src addr eq 192.168.0.208 显示来源IP (ip.addr(或者ip.src)==192.168.10.87)//有自动补全功能&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.dst addr==192.168.0.208&amp;nbsp; or ip.dst addr eq 192.168.0.208 显示目标IP&lt;br /&gt;&lt;br /&gt;二、端口过滤：&lt;br /&gt;比如：tcp.port eq 80 // 不管端口是来源的还是目标的都显示&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcp.port == 80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcp.port eq 2722&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcp.port eq 80 or udp.port eq 80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcp.dstport == 80 // 只显tcp协议的目标端口80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcp.srcport == 80 // 只显tcp协议的来源端口80&lt;br /&gt;&lt;br /&gt;过滤端口范围&lt;br /&gt;tcp.port &amp;gt;= 1 and tcp.port &amp;lt;= 80&lt;br /&gt;&lt;br /&gt;三、协议过滤：tcp&lt;br /&gt;udp&lt;br /&gt;arp&lt;br /&gt;icmp&lt;br /&gt;http&lt;br /&gt;smtp&lt;br /&gt;ftp&lt;br /&gt;dns&lt;br /&gt;msnms&lt;br /&gt;ip&lt;br /&gt;ssl&lt;br /&gt;等等&lt;br /&gt;排除ssl包，如!ssl 或者&amp;nbsp; not ssl&lt;br /&gt;&lt;br /&gt;四、包长度过滤：&lt;br /&gt;比如：&lt;br /&gt;udp.length == 26 这个长度是指udp本身固定长度8加上udp下面那块数据包之和&lt;br /&gt;tcp.len &amp;gt;= 7&amp;nbsp; 指的是ip数据包(tcp下面那块数据),不包括tcp本身&lt;br /&gt;ip.len == 94 除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后&lt;br /&gt;frame.len == 119 整个数据包长度,从eth开始到最后&lt;br /&gt;&lt;br /&gt;五、http模式过滤：&lt;br /&gt;例子:&lt;br /&gt;http.request.method == &amp;#8220;GET&amp;#8221;&lt;br /&gt;http.request.method == &amp;#8220;POST&amp;#8221;&lt;br /&gt;http.request.uri == &amp;#8220;/img/logo-edu.gif&amp;#8221;&lt;br /&gt;http contains &amp;#8220;GET&amp;#8221;&lt;br /&gt;http contains &amp;#8220;HTTP/1.&amp;#8221;&lt;br /&gt;&lt;br /&gt;// GET包&lt;br /&gt;http.request.method == &amp;#8220;GET&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;Host: &amp;#8221;&lt;br /&gt;http.request.method == &amp;#8220;GET&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;User-Agent: &amp;#8221;&lt;br /&gt;// POST包&lt;br /&gt;http.request.method == &amp;#8220;POST&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;Host: &amp;#8221;&lt;br /&gt;http.request.method == &amp;#8220;POST&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;User-Agent: &amp;#8221;&lt;br /&gt;// 响应包&lt;br /&gt;http contains &amp;#8220;HTTP/1.1 200 OK&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;Content-Type: &amp;#8221;&lt;br /&gt;http contains &amp;#8220;HTTP/1.0 200 OK&amp;#8221; &amp;amp;&amp;amp; http contains &amp;#8220;Content-Type: &amp;#8221;&lt;br /&gt;一定包含如下&lt;br /&gt;Content-Type:&lt;br /&gt;&lt;br /&gt;六、连接符 and / or&lt;br /&gt;&lt;br /&gt;七、表达式：!(arp.src==192.168.1.1) and !(arp.dst.proto_ipv4==192.168.1.243)&lt;img src="http://www.cnblogs.com/leaven/aggbug/2524553.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/05/29/2524553.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/05/07/2486878.html</id><title type="text">JNI 的某些数组和字符串类型转换</title><summary type="text">jbytearray转c++byte数组 C代码 jbyte * arrayBody = env-&gt;GetByteArrayElements(data,0); jsize theArrayLengthJ = env-&gt;GetArrayLength(data); BYTE * starter = (BYTE *)arrayBody; jbyteArray 转 c++中的BYTE[] C代码...</summary><published>2012-05-07T01:06:00Z</published><updated>2012-05-07T01:06:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/05/07/2486878.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/05/07/2486878.html"/><content type="html">&lt;p&gt;jbytearray转c++byte数组  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jbyte * arrayBody = env-&amp;gt;GetByteArrayElements(data,0);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;jsize theArrayLengthJ = env-&amp;gt;GetArrayLength(data);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;BYTE * starter = (BYTE *)arrayBody;&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;jbyteArray 转 c++中的BYTE[]  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;//jbytearray strIn &lt;li&gt;jbyte * olddata = (jbyte*)env-&amp;gt;GetByteArrayElements(strIn, 0);&amp;nbsp;&amp;nbsp; &lt;li&gt;jsize&amp;nbsp; oldsize = env-&amp;gt;GetArrayLength(strIn);&amp;nbsp;&amp;nbsp; &lt;li&gt;BYTE* bytearr = (BYTE*)olddata;&amp;nbsp;&amp;nbsp; &lt;li&gt;int len = (int)oldsize;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;C++中的BYTE[]转jbyteArray  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;//nOutSize是BYTE数组的长度 BYTE pData[] &lt;li&gt;jbyte *by = (jbyte*)pData;&amp;nbsp;&amp;nbsp; &lt;li&gt;jbyteArray jarray = env-&amp;gt;NewByteArray(nOutSize);&amp;nbsp;&amp;nbsp; &lt;li&gt;env-&amp;gt;SetByteArrayRegin(jarray, 0, nOutSize, by);&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;jbyteArray 转 char *  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;char* data = (char*)env-&amp;gt;GetByteArrayElements(strIn, 0);&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;char* 转jstring  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jstring WindowsTojstring(JNIEnv* env, char* str_tmp)&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt; jstring rtn=0;&amp;nbsp;&amp;nbsp; &lt;li&gt;int slen = (int)strlen(str_tmp);&amp;nbsp;&amp;nbsp; &lt;li&gt; unsigned short* buffer=0;&amp;nbsp;&amp;nbsp; &lt;li&gt;if(slen == 0)&amp;nbsp;&amp;nbsp; &lt;li&gt; {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; rtn = env-&amp;gt;NewStringUTF(str_tmp);&amp;nbsp;&amp;nbsp; &lt;li&gt; }&amp;nbsp;&amp;nbsp; &lt;li&gt;else &lt;li&gt; {&amp;nbsp;&amp;nbsp; &lt;li&gt;int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; buffer = (unsigned short*)malloc(length*2+1);&amp;nbsp;&amp;nbsp; &lt;li&gt;if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) &amp;gt; 0)&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp; rtn = env-&amp;gt;NewString((jchar*)buffer, length);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;li&gt; }&amp;nbsp;&amp;nbsp; &lt;li&gt;if(buffer)&amp;nbsp;&amp;nbsp; &lt;li&gt; {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; free(buffer);&amp;nbsp;&amp;nbsp; &lt;li&gt; }&amp;nbsp;&amp;nbsp; &lt;li&gt;return rtn;&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;下面这个没有用过，刚看到，也写进来，以后如果遇到可以验证下看。 &lt;br&gt;jstring 转 char* 或者 const char*  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;// jstring str &lt;li&gt;const char *key = env-&amp;gt;GetStringUTFChars(str, 0);&amp;nbsp;&amp;nbsp; &lt;li&gt;//jboolean isOffer &lt;li&gt;jsClient-&amp;gt;modify(key, isOffer);&amp;nbsp;&amp;nbsp; &lt;li&gt;env-&amp;gt;ReleaseStringUTFChars(str, key);&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;JNI 返回 jbyteArray  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj)&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jbyteArray firstMacArray = env-&amp;gt;NewByteArray( 6 );&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jbyte *bytes = env-&amp;gt;GetByteArrayElements( firstMacArray, 0);&amp;nbsp;&amp;nbsp; &lt;li&gt;for ( int i = 0; i &amp;lt; sizeof( pAdapterInfo-&amp;gt;Address ); i++ )&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytes[ i ] = pAdapterInfo-&amp;gt;Address[ i ];&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; env-&amp;gt;SetByteArrayRegion(firstMacArray, 0, 6, bytes );&amp;nbsp;&amp;nbsp; &lt;li&gt;return firstMacArray;&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//jstring to char*  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;char* jstringTostring(JNIEnv* env, jstring jstr)&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;char* rtn = NULL;&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jclass clsstring = env-&amp;gt;FindClass("java/lang/String");&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jstring strencode = env-&amp;gt;NewStringUTF("utf-8");&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jmethodID mid = env-&amp;gt;GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jbyteArray barr= (jbyteArray)env-&amp;gt;CallObjectMethod(jstr, mid, strencode);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jsize alen = env-&amp;gt;GetArrayLength(barr);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; jbyte* ba = env-&amp;gt;GetByteArrayElements(barr, JNI_FALSE);&amp;nbsp;&amp;nbsp; &lt;li&gt;if (alen &amp;gt; 0)&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtn = (char*)malloc(alen + 1);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(rtn, ba, alen);&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtn[alen] = 0;&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp; env-&amp;gt;ReleaseByteArrayElements(barr, ba, 0);&amp;nbsp;&amp;nbsp; &lt;li&gt;return rtn;&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//char* to jstring  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jstring stoJstring(JNIEnv* env, const char* pat)&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt;jclass strClass = env-&amp;gt;FindClass("Ljava/lang/String;");&amp;nbsp;&amp;nbsp; &lt;li&gt;jmethodID ctorID = env-&amp;gt;GetMethodID(strClass, "&amp;lt;init&amp;gt;", "([BLjava/lang/String;)V");&amp;nbsp;&amp;nbsp; &lt;li&gt;jbyteArray bytes = env-&amp;gt;NewByteArray(strlen(pat));&amp;nbsp;&amp;nbsp; &lt;li&gt;env-&amp;gt;SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);&amp;nbsp;&amp;nbsp; &lt;li&gt;jstring encoding = env-&amp;gt;NewStringUTF("utf-8");&amp;nbsp;&amp;nbsp; &lt;li&gt;return (jstring)env-&amp;gt;NewObject(strClass, ctorID, bytes, encoding);&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//将jstring类型转换成windows类型  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;char* jstringToWindows( JNIEnv *env, jstring jstr )&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt;int length = (env)-&amp;gt;GetStringLength(jstr );&amp;nbsp;&amp;nbsp; &lt;li&gt;const jchar* jcstr = (env)-&amp;gt;GetStringChars(jstr, 0 );&amp;nbsp;&amp;nbsp; &lt;li&gt;char* rtn = (char*)malloc( length*2+1 );&amp;nbsp;&amp;nbsp; &lt;li&gt;int size = 0;&amp;nbsp;&amp;nbsp; &lt;li&gt;size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );&amp;nbsp;&amp;nbsp; &lt;li&gt;if( size &amp;lt;= 0 )&amp;nbsp;&amp;nbsp; &lt;li&gt;return NULL;&amp;nbsp;&amp;nbsp; &lt;li&gt;(env)-&amp;gt;ReleaseStringChars(jstr, jcstr );&amp;nbsp;&amp;nbsp; &lt;li&gt;rtn[size] = 0;&amp;nbsp;&amp;nbsp; &lt;li&gt;return rtn;&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//将windows类型转换成jstring类型  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jstring WindowsTojstring( JNIEnv* env, char* str )&amp;nbsp;&amp;nbsp; &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt;jstring rtn = 0;&amp;nbsp;&amp;nbsp; &lt;li&gt;int slen = strlen(str);&amp;nbsp;&amp;nbsp; &lt;li&gt;unsigned short * buffer = 0;&amp;nbsp;&amp;nbsp; &lt;li&gt;if( slen == 0 )&amp;nbsp;&amp;nbsp; &lt;li&gt;rtn = (env)-&amp;gt;NewStringUTF(str );&amp;nbsp;&amp;nbsp; &lt;li&gt;else &lt;li&gt;{&amp;nbsp;&amp;nbsp; &lt;li&gt;int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );&amp;nbsp;&amp;nbsp; &lt;li&gt;buffer = (unsigned short *)malloc( length*2 + 1 );&amp;nbsp;&amp;nbsp; &lt;li&gt;if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) &amp;gt;0 )&amp;nbsp;&amp;nbsp; &lt;li&gt;rtn = (env)-&amp;gt;NewString( (jchar*)buffer, length );&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;li&gt;if( buffer )&amp;nbsp;&amp;nbsp; &lt;li&gt;free( buffer );&amp;nbsp;&amp;nbsp; &lt;li&gt;return rtn;&amp;nbsp;&amp;nbsp; &lt;li&gt;}&amp;nbsp;&amp;nbsp; &lt;li&gt;/*JNIEXPORT jstring JNICALL Java_test_cs_web_SWIFTAlianceCASmfTest_strcal &lt;li&gt;(JNIEnv *env, jclass obj, jstring jstr1, jstring jstr2) &lt;li&gt;{ &lt;li&gt;jbyteArray bytes = 0; &lt;li&gt;jthrowable exc; &lt;li&gt;char *pszResult = NULL;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;char *pszSTR1 = NULL; &lt;li&gt;char *pszSTR2 = NULL; &lt;li&gt; &lt;li&gt;pszSTR1 = jstringTostring(env, jstr1); &lt;li&gt;pszSTR2 = jstringTostring(env, jstr2); &lt;li&gt; &lt;li&gt; &lt;li&gt;int nlen = sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2)); &lt;li&gt;pszResult = (char*)malloc(nlen); &lt;li&gt;strcpy(pszResult, pszSTR1); &lt;li&gt;strcat(pszResult, pszSTR2); &lt;li&gt; &lt;li&gt;jstring jstrRe = stoJstring(env, pszResult); &lt;li&gt;free(pszSTR1); &lt;li&gt;free(pszSTR2); &lt;li&gt;free(pszResult); &lt;li&gt;return(jstrRe); &lt;li&gt;} &lt;li&gt;*/&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;jni object的使用 &lt;br&gt;每一个jni格式的dll中的object对应该java里面的一个类。 &lt;br&gt;如下例有一个 ObjData类，类中有成员bData ,Len &lt;br&gt;public class ObjData { &lt;br&gt;&amp;nbsp; public byte[]&amp;nbsp; bData; &lt;br&gt;&amp;nbsp; public int Len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;} &lt;br&gt;//------------------------jni获得传过来的Object类型的变量objDataIn-------- &lt;br&gt;jclass clazz =(env)-&amp;gt;FindClass("ObjData"); &lt;br&gt;//从传进来的对象中取出byte[]  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jfieldID byteData = (env)-&amp;gt;GetFieldID(clazz,"bData","[B");&amp;nbsp;&amp;nbsp; &lt;li&gt;jbyteArray pDataIn = (jbyteArray) (env)-&amp;gt;GetObjectField(objDataIn, byteData);&amp;nbsp;&amp;nbsp; &lt;li&gt;jsize theArrayLeng = env-&amp;gt;GetArrayLength(pDataIn);&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//byte[]转为BYTE[]  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jbyte * arrayBody = env-&amp;gt;GetByteArrayElements(pDataIn,0);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;BYTE * jDataIn = (BYTE *)arrayBody;&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//将BYTE数组转为jarray  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;jbyte* byte = (jbyte*)jDataOut;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;jbyteArray jarray = env-&amp;gt;NewByteArray(theArrayLeng);&amp;nbsp;&amp;nbsp; &lt;li&gt;env-&amp;gt;SetByteArrayRegion(jarray, 0, theArrayLeng, byte);&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;//给每一个实例的变量付值  &lt;p&gt;C代码 &lt;a href="http://provista.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://provista.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;(env)-&amp;gt;SetObjectField(objDataIn,byteData,jarray);&amp;nbsp;&amp;nbsp; &lt;li&gt;(env)-&amp;gt;SetIntField(objDataIn,pDataInLen,jDataInLen);&amp;nbsp;&amp;nbsp; &lt;li&gt;(env)-&amp;gt;ReleaseByteArrayElements(pDataIn, arrayBody, 0);&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;其他参考： &lt;br&gt;Java 通过JNI调用C或者CPP代码 &lt;br&gt;&lt;a href="http://blog.csdn.net/kenera/archive/2009/02/16/3895343.aspx"&gt;http://blog.csdn.net/kenera/archive/2009/02/16/3895343.aspx&lt;/a&gt;&lt;br&gt;&lt;a href="http://apps.hi.baidu.com/share/detail/15732549"&gt;http://apps.hi.baidu.com/share/detail/15732549&lt;/a&gt;&lt;br&gt;&lt;a href="http://dniit.blog.163.com/blog/static/28012894200842810332491/"&gt;http://dniit.blog.163.com/blog/static/28012894200842810332491/&lt;/a&gt;&lt;br&gt;&lt;a href="http://hi.baidu.com/liangwind/blog/item/7dcce2c9729d1d1e7f3e6f49.html"&gt;http://hi.baidu.com/liangwind/blog/item/7dcce2c9729d1d1e7f3e6f49.html&lt;/a&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2486878.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/05/07/2486878.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/04/03/2431480.html</id><title type="text">Application的使用(使用，及要注意的内存泄露问题)</title><summary type="text">http://www.cnblogs.com/chon/archive/2011/07/11/2102894.html What is Application Application和Actovotu,Service一样是android框架的一个系统组件，当android程序启动时系统会创建一个 application对象，用来存储系统的一些信息。通常我们是不需要指定一个Application的，...</summary><published>2012-04-03T14:54:00Z</published><updated>2012-04-03T14:54:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/04/03/2431480.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/04/03/2431480.html"/><content type="html">&lt;p&gt;&lt;a title="http://www.cnblogs.com/chon/archive/2011/07/11/2102894.html" href="http://www.cnblogs.com/chon/archive/2011/07/11/2102894.html"&gt;http://www.cnblogs.com/chon/archive/2011/07/11/2102894.html&lt;/a&gt; &lt;p&gt;&lt;strong&gt;What is Application&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Application和Actovotu,Service一样是android框架的一个系统组件，当android程序启动时系统会创建一个 application对象，用来存储系统的一些信息。通常我们是不需要指定一个Application的，这时系统会自动帮我们创建，如果需要创建自己的Application，也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。 &lt;p&gt;android系统会为每个程序运行时创建一个Application类的对象且仅创建一个，所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的，它的生命周期就等于这个程序的生命周期。因为它是全局的单例的，所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些，数据传递，数据共享等,数据缓存等操作。 &lt;p&gt;&lt;strong&gt;Data passing between components using Application&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;假如有一个Activity A, 跳转到 Activity B ,并需要推荐一些数据，通常的作法是Intent.putExtra() 让Intent携带，或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象，实现传递。但这样作有一个问题在于，Intent和Bundle所能携带的数据类型都是一些基本的数据类型，如果想实现复杂的数据传递就比较麻烦了，通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个进程当中为什么还要这么麻烦呢，只要把需要传递的对象的引用传递过去就可以了。 &lt;p&gt;基本思路是这样的。在Application中创建一个HashMap&amp;lt;String,Object&amp;gt; ，以字符串为索引，Object为value这样我们的HashMap就可以存储任何类型的对象了。在Activity A中把需要传递的对象放入这个HashMap，然后通过Intent或者其它途经再把这人索引的字符串传递给Activity B ,Activity B 就可以根据这个字符串在HashMap中取出这个对象了。只要再向下转个型 ，就实现了对象的传递。 &lt;p&gt;&lt;strong&gt;Data caching in Application&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我一般会习惯在application中建立两个HashMap&amp;lt;String,Object&amp;gt;一个用于数据的传递，一个用于缓存一些数据。比如有一个Activity需要从网站获取一些数据，获取完之后我们就可以把这个数据cache到Application 当中，当页面设置到其它Activity再回来的时候，就可以直接使用缓存好的数据了。但如果需要cache一些大量的数据，最好是cache一些 (软引用)SoftReference ，并把这些数据cache到本地rom上或者sd卡上。如果在application中的缓存不存在，从本地缓存查找，如果本地缓存的数据也不存在再从网络上获取。 &lt;p&gt;&lt;strong&gt;PitFalls&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。如果在Application的oncreate中执行比较耗时的操作，将直接影响的程序的启动时间。不些清理工作不能依靠onTerminate完成，因为android会尽量让你的程序一直运行，所以很有可能 onTerminate不会被调用。 &lt;p&gt;&lt;strong&gt;MemoryLeak&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在Java中内存泄漏是只，某个(某些)对象已经不在被使用应该被gc所回收，但有一个对象持有这个对象的引用而阻止这个对象被回收。比如我们通常会这样创建一个View TextView tv = new TextView(this);这里的this通常都是Activity。所以这个TextView就持有着这个Activity的引用。下面看张图 (Google IO 2011 ppt中抄得) &lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/311362/2011071111465488.png"&gt; &lt;p&gt;通常情况下，当用户转动手机的时候，android会重新调用OnCreate()方法生成一个新的Activity，原来的 Activity应该被GC所回收。但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个 View的引用放到了Application当中)，这时候原来的Activity将不能被GC所回收，Activity本身又持有很多对象的引用，所以整个Activity的内存被泄漏了。 &lt;p&gt;经常导致内存泄漏的一些原因： &lt;p&gt;keeping a long-lived reference to a Context.持有一个context的对象，从而gc不能回收。 &lt;p&gt;1，一个View，的作用域超出了所在的Activity的作用域，比如一个static的View或者 把一个View cache到了application当中 etc &lt;p&gt;2,某些与View关联的Drawable的作用域超出了Activity的作用域。 &lt;p&gt;3，Runnable对象：比如在一个Activity中启用了一个新线程去执行一个任务，在这期间这个Activity被系统回收了，但Runnalbe的任务还没有执行完毕并持有Activity的引用而泄漏，但这种泄漏一般来泄漏一段时间，只有Runnalbe的线程执行完闭，这个 Activity又可以被正常回收了。 &lt;p&gt;4，内存类的对象作用域超出Activity的范围：比如定义了一个内存类来存储数据，又把这个内存类的对象传给了其它Activity 或者Service等。因为内部类的对象会持有当前类的引用，所以也就持有了Context的引用。解决方法是如果不需要当前的引用把内部类写成 static或者，把内部类抽取出来变成一个单独的类，或者把避免内部对象作用域超出Activity的作用域。 &lt;p&gt;out Of Memery Error 在android中每一个程序所分到的内存大小是有限的，如果超过了这个数就会报Out Of Memory Error。android给程序分配的内存大小与手机硬件有关，以下是一些手机的数据： &lt;p&gt;G1:16M Droid:24 Nexus One:32M Xoom:48Ms &lt;p&gt;所以尽量把程序中的一些大的数据cache到本地文件。以免内存使用量超标。 &lt;p&gt;&lt;strong&gt;Snippets&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1,通过Application在两个Activity间传递数据 &lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/311362/2011071111461886.png"&gt; &lt;img src="http://pic002.cnblogs.com/images/2011/311362/2011071111463294.png"&gt; &lt;p&gt;记得数据传递完成之后，把存放在application的HashMap中的数据remove掉，以免发生内存的泄漏。 &lt;p&gt;如果有什么疑问，发现bug或者有更好的想法或者建议，或者附件无法下载。请发邮件至arthurbrown@163.com &lt;p&gt;&lt;a href="http://u.115.com/file/aqbgmxe6#%20ApplicationSnippet.zip"&gt;工程源码&lt;/a&gt; &lt;p&gt;&lt;ins&gt;&lt;ins&gt;&lt;/ins&gt;&lt;/ins&gt; &lt;p&gt;QQ:304811527 &lt;p&gt;Emal:arthurbrown@163.com &lt;p&gt;Android QQ Group:172448270 &lt;img src="http://www.cnblogs.com/leaven/aggbug/2431480.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/04/03/2431480.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/04/01/2427976.html</id><title type="text">android 4.0 downloader</title><summary type="text">guide follow :http://source.android.com/source/downloading.html=========================1. $ mkdir ~/bin$ PATH=~/bin:$PATH2. $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo &gt; ~/bin/repo$ chmod a+x ~/bin/repoor(if err: curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/</summary><published>2012-04-01T01:37:00Z</published><updated>2012-04-01T01:37:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/04/01/2427976.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/04/01/2427976.html"/><content type="html">&lt;p&gt;guide follow :&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;http://source.android.com/source/downloading.html&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;=========================&lt;/p&gt;&lt;p&gt;1.&amp;nbsp; &lt;/p&gt;&lt;p&gt;$ mkdir ~/bin&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;$ PATH=~/bin:$PATH&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. &lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo &amp;gt; ~/bin/repo&lt;br /&gt;$ chmod a+x ~/bin/repo&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;or(if err:&lt;span style="line-height: 16px; white-space: pre; background-color: #fafafa;"&gt; curl &lt;span style="color: #006600;"&gt;"http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo"&lt;/span&gt; &lt;span style="font-weight: bold; color: #666666;"&gt;&amp;gt;&lt;/span&gt; ~&lt;span style="font-weight: bold; color: #666666;"&gt;/&lt;/span&gt;bin&lt;span style="font-weight: bold; color: #666666;"&gt;/&lt;/span&gt;repo&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;3.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;code&gt;$ mkdir WORKING_DIRECTORY&lt;br /&gt;$ cd WORKING_DIRECTORY&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4. &lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;$ repo init -u https://android.googlesource.com/platform/manifest&lt;br /&gt;&lt;br /&gt;5.&lt;div&gt;  git config --global user.email "you@example.com"&lt;br /&gt;  git config --global user.name "Your Name"&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;6. &lt;br /&gt;&lt;div&gt;&lt;code&gt;$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1&lt;br /&gt;or &lt;/code&gt;&lt;div&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ repo init -u https://android.googlesource.com/platform/manifest -b &lt;/code&gt;android-4.0.3_r1&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;7. &lt;br /&gt;&lt;div&gt;&lt;code&gt;$ repo sync&lt;br /&gt;&lt;br /&gt;&lt;div&gt;当执行:repo sync 时，就出现：&lt;br /&gt; fatal: '../platform/abi/cpp.git' does not appear to be a git repository&lt;br /&gt; fatal: The remote end hung up unexpectedly&lt;br /&gt; error: Cannot fetch platform/abi/cpp  上面的错误，上网搜了很久，没找到像这个样子的，后来，看一个网友说到，删除旧版本，这提醒了我，我昨天用repo安装不同的版本，都在一个文件夹中，这时我查看一下那目录，没有想到有一个.repo/ 的文件夹，我把它删除了，再按&lt;a href="http://source.android.com/source/downloading.html"&gt;http://source.android.com/source/downloading.html&lt;/a&gt;这里的操作，最后成功了&lt;/div&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&amp;nbsp;&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/leaven/aggbug/2427976.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/04/01/2427976.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/31/2427240.html</id><title type="text">Ubuntu下包含2种远程桌面的方式：VINO-Server以及VNC Server</title><summary type="text">http://blog.csdn.net/chenvsa/article/details/7013760 其中Vino-Server是Ubuntu自带的远程桌面服务器，也就是在系统(System) —&gt; 首选项(Preferences) —&gt; 远程桌面(Remote Desktop)下，可以很容易开启，然后就可以使用VNC Viewer进行远程桌面连接。具体开通办法，可以参见《Ubuntu下开启...</summary><published>2012-03-31T08:13:00Z</published><updated>2012-03-31T08:13:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2427240.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2427240.html"/><content type="html">&lt;p&gt;&lt;a title="http://blog.csdn.net/chenvsa/article/details/7013760" href="http://blog.csdn.net/chenvsa/article/details/7013760"&gt;http://blog.csdn.net/chenvsa/article/details/7013760&lt;/a&gt;  &lt;p&gt;其中Vino-Server是Ubuntu自带的远程桌面服务器，也就是在系统(System) —&amp;gt; 首选项(Preferences) —&amp;gt; 远程桌面(Remote Desktop)下，可以很容易开启，然后就可以使用VNC Viewer进行远程桌面连接。具体开通办法，可以参见《&lt;a href="http://www.wangzhongyuan.com/archives/719.html"&gt;Ubuntu下开启远程桌面的方法&lt;/a&gt;》。不过，这种自带的Vino-Server方式有一个最显著的缺点：&lt;strong&gt;那就是当你重启机器之后，必须首先到远程服务器那边登录机器，进入系统（相当于创建了一个Session）之后，才能在本地使用远程桌面连接这个远程服务器&lt;/strong&gt;。这个缺点导致Vino-Server有时极为不方便。  &lt;p&gt;那么，我们如果要解决这个问题，可以通过安装VNC Server来解决。在Ubuntu下安装VNCServer的过程非常简单：  &lt;p&gt;&lt;strong&gt;(1)安装VNCServer &lt;br&gt;&lt;/strong&gt;使用ssh登录Ubuntu，&lt;strong&gt;执行命令&lt;/strong&gt;：sudo apt-get install vnc4server  &lt;p&gt;&lt;strong&gt;(2)关闭原来Ubuntu Server自带的远程桌面&lt;/strong&gt;&lt;br&gt;可以先使用VNCViewer连接到Ubuntu上，然后在系统(System) —&amp;gt; 首选项(Preferences) —&amp;gt; 远程桌面(Remote Desktop)下，去掉第一个勾。这个时候你的VNCViewer就会自动断开。  &lt;p&gt;&lt;strong&gt;(3)配置VNCServer &lt;br&gt;&lt;/strong&gt;在ssh到Ubuntu的命令行中，&lt;strong&gt;运行如下命令&lt;/strong&gt;：vncpasswd，注意不用加sudo。 &lt;br&gt;这个命令是为当前用户设定远程桌面密码的。 &lt;p&gt;&lt;strong&gt;(4)启动VNCServer &lt;br&gt;&lt;/strong&gt;vncserver -geometry 1280×800 -alwaysshared :1 &lt;br&gt;这个命令包含了3个参数，第一个参数geometry表示分辨率，你可以指定适合自己桌面的分辨率；第二个参数alwaysshared表示运行多个人同时连接到同一个桌面；第三个参数:1表示开启一个1号远程桌面，此时你可以使用ip:1来连接这个远程桌面。(&lt;strong&gt;注意：上面1280与800之间的连接符为英文字母x(xyz的x)，而不是中英文的乘号&lt;/strong&gt;!) &lt;/p&gt;然后会在当前用户的根目录下生成.vnc的文件夹，&lt;strong&gt;进入.vnc的文件之后，修改xstartup文件&lt;/strong&gt;： &lt;br&gt;vim .vnc/xstartup (假设你此时在用户根目录下) &lt;br&gt;注释掉 twm &amp;amp; (即在这一行的最开头加上一个#) ，在文件最后添加一行gnome-session &amp;amp;，保存退出。  &lt;p&gt;&lt;strong&gt;(5)使用VNCViewer连接这个远程桌面&lt;/strong&gt;&lt;br&gt;在VNCViewer中，输入ip加桌面号，即 X.X.X.X:1 即可连接刚才的远程桌面，密码为之前设定的密码。  &lt;p&gt;这样，当你再次重启服务器之后，就不必跑到服务器前登录系统，而可以首先使用ssh登录Ubuntu，执行以上第4步命令，就可以开启一个远程桌面，然后就可以使用VNCViewer连接这个远程桌面了。  &lt;p&gt;我也曾经尝试能否在Ubuntu下自动启动VNCServer，自动启动一个远程桌面，不过很遗憾，在网上查到的方法多是针对其他的Linux的方 法，在Ubuntu下目录结构完全不同，一些极少数在Ubuntu下自动启动VNCServer的文章也不适合Ubuntu 9.04 Server版，因此最终我没有在Ubuntu 9.04 Server上实现自动启动VNCServer的方法。就是每次重启机器之后，得先多一步ssh启动VNCServer的步骤。先这么用着吧。  &lt;p&gt;&lt;strong&gt;备注：另外，如果想要关闭一个远程桌面，可以使用如下命令&lt;/strong&gt;： &lt;br&gt;vncserver -kill :1 &lt;br&gt;其中，":1"表示的创建远程桌面时的桌面号。&lt;/p&gt; &lt;p&gt;修改分辨率：vncserver -geometry 1280×800&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2427240.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/31/2427240.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/31/2426952.html</id><title type="text">ａｎｄｒｏｉｄ４．０　　编译</title><summary type="text">http://android-sz.iteye.com/blog/1265613 进过几天的等待，几经波折终于把android 4.0 的代码下载下来。（http://android-sz.iteye.com/blog/1259206） 终于可以编译了，期待…… 编译环境： 1,系统: Ubuntu 10.10 (64bit)2,Jdk: java (64bit)3,交叉编译链: 自带 为了避免编...</summary><published>2012-03-31T06:20:00Z</published><updated>2012-03-31T06:20:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426952.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426952.html"/><content type="html">&lt;p&gt;&lt;a title="http://android-sz.iteye.com/blog/1265613" href="http://android-sz.iteye.com/blog/1265613"&gt;http://android-sz.iteye.com/blog/1265613&lt;/a&gt; &lt;p&gt;&lt;strong&gt;进过几天的等待&lt;/strong&gt;，几经波折终于把android 4.0 的代码下载下来。（&lt;a href="http://android-sz.iteye.com/blog/1259206"&gt;http://android-sz.iteye.com/blog/1259206&lt;/a&gt;） &lt;p&gt;终于可以编译了，期待…… &lt;p&gt;编译环境： &lt;p&gt;&lt;strong&gt;1,系统: Ubuntu 10.10 (64bit)&lt;br&gt;2,Jdk: java (64bit)&lt;br&gt;3,交叉编译链: 自带&lt;/strong&gt; &lt;p&gt;为了避免编译过程中出现错误，执行如下命令安装下面软件 &lt;p&gt;&lt;strong&gt;$:sudo apt-get install zlib1g-dev lib64z1-dev bison flex libncurses5-dev libgl1-mesa-dev gperf gnupg zip libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential&lt;/strong&gt; &lt;p&gt;个人习惯，修改一些配置文件。减少系统语言的种类，设置系统显示的样式及设置jdk变量。 &lt;p&gt;Html代码 &lt;a href="http://android-sz.iteye.com/"&gt;&lt;img alt="收藏代码" src="http://android-sz.iteye.com/images/icon_star.png"&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;envsetup.sh&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 ++-&amp;nbsp;&amp;nbsp; &lt;li&gt; target/product/languages_full.mk |&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 ++-&amp;nbsp;&amp;nbsp; &lt;li&gt; target/product/locales_full.mk&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 +-&amp;nbsp;&amp;nbsp; &lt;li&gt; 3 files changed, 5 insertions(+), 3 deletions(-)&amp;nbsp;&amp;nbsp; &lt;li&gt; &lt;li&gt;diff --git a/envsetup.sh b/envsetup.sh&amp;nbsp;&amp;nbsp; &lt;li&gt;index bab2d25..900b3f0 100644&amp;nbsp;&amp;nbsp; &lt;li&gt;--- a/envsetup.sh&amp;nbsp;&amp;nbsp; &lt;li&gt;+++ b/envsetup.sh&amp;nbsp;&amp;nbsp; &lt;li&gt;@@ -1046,7 +1046,8 @@ function set_java_home() {&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;li&gt;&amp;nbsp;&amp;nbsp;&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;li&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JAVA_HOME=/usr/lib/jvm/java-6-sun&amp;nbsp;&amp;nbsp; &lt;li&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #export JAVA_HOME=/usr/lib/jvm/java-6-sun&amp;nbsp;&amp;nbsp; &lt;li&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JAVA_HOME=/usr/local/jdk6/jdk1.6.0_24&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esac&amp;nbsp;&amp;nbsp; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&amp;nbsp;&amp;nbsp; &lt;li&gt;diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;index e494fad..77ddd93 100644&amp;nbsp;&amp;nbsp; &lt;li&gt;--- a/target/product/languages_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;+++ b/target/product/languages_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;@@ -21,5 +21,6 @@&amp;nbsp;&amp;nbsp; &lt;li&gt; &lt;li&gt; # Those are all the locales that have translations and are displayable&amp;nbsp;&amp;nbsp; &lt;li&gt; # by TextView in this branch.&amp;nbsp;&amp;nbsp; &lt;li&gt;-PRODUCT_LOCALES := en_US fr_FR it_IT es_ES de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA&amp;nbsp;&amp;nbsp; &lt;li&gt;+PRODUCT_LOCALES := zh_CN hdpi&amp;nbsp;&amp;nbsp; &lt;li&gt;+#en_US fr_FR it_IT es_ES de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA&amp;nbsp;&amp;nbsp; &lt;li&gt; # We don't have the fonts to display am_ET yet&amp;nbsp;&amp;nbsp; &lt;li&gt;diff --git a/target/product/locales_full.mk b/target/product/locales_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;index cab2b91..7b95d4a 100644&amp;nbsp;&amp;nbsp; &lt;li&gt;--- a/target/product/locales_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;+++ b/target/product/locales_full.mk&amp;nbsp;&amp;nbsp; &lt;li&gt;@@ -1,3 +1,3 @@&amp;nbsp;&amp;nbsp; &lt;li&gt;-PRODUCT_LOCALES := cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_NZ en_SG en_US es_ES fr_CA fr_CH fr_BE fr_FR it_CH it_IT ja_JP ko_KR nb_NO nl_BE nl_NL pl_PL pt_PT ru_RU sv_SE tr_TR zh_CN zh_HK zh_TW&amp;nbsp;&amp;nbsp; &lt;li&gt;+#PRODUCT_LOCALES := cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_NZ en_SG en_US es_ES fr_CA fr_CH fr_BE fr_FR it_CH it_IT ja_JP ko_KR nb_NO nl_BE nl_NL pl_PL pt_PT ru_RU sv_SE tr_TR zh_CN zh_HK zh_TW&amp;nbsp;&amp;nbsp; &lt;li&gt; &lt;li&gt; $(call inherit-product, build/target/product/languages_full.mk)&amp;nbsp; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;做完上面几步，可以开始编译了…… &lt;p&gt;1, 配置编译环境 &lt;p&gt;&lt;strong&gt;SOURCE_PATH$:source ./build/envsetup.sh&lt;/strong&gt; &lt;p&gt;执行了下面几个文件 &lt;p&gt;including device/samsung/maguro/vendorsetup.sh &lt;p&gt;including device/samsung/tuna/vendorsetup.sh &lt;p&gt;including device/ti/panda/vendorsetup.sh &lt;p&gt;including sdk/bash_completion/adb.bash &lt;p&gt;2, 设置编译选项 &lt;p&gt;&lt;strong&gt;SOURCE_PATH$:lunch&lt;/strong&gt; &lt;p&gt;You're building on Linux &lt;p&gt;Lunch menu... pick a combo: &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. full-eng &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. full_x86-eng &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. vbox_x86-eng &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. full_maguro-userdebug &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. full_tuna-userdebug &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. full_panda-eng &lt;p&gt;Which would you like? [full-eng] 1 &lt;p&gt;============================================ &lt;p&gt;PLATFORM_VERSION_CODENAME=REL &lt;p&gt;PLATFORM_VERSION=4.0.1 &lt;p&gt;TARGET_PRODUCT=full &lt;p&gt;TARGET_BUILD_VARIANT=eng &lt;p&gt;TARGET_BUILD_TYPE=release &lt;p&gt;TARGET_BUILD_APPS= &lt;p&gt;TARGET_ARCH=arm &lt;p&gt;TARGET_ARCH_VARIANT=armv7-a &lt;p&gt;HOST_ARCH=x86 &lt;p&gt;HOST_OS=linux &lt;p&gt;HOST_BUILD_TYPE=release &lt;p&gt;BUILD_ID=ITL41D &lt;p&gt;============================================ &lt;p&gt;呵呵，可以看到平台的配置。 &lt;p&gt;3,开始编译 &lt;p&gt;&lt;strong&gt;SOURCE_PATH$:make -j4&lt;/strong&gt; &lt;p&gt;启用4线程编译吧! &lt;p&gt;等待中&amp;nbsp; ………… &lt;p&gt;足足编译了4个小时，中间遇到磁盘不足。各位大能记得预留足够的磁盘空间。 &lt;p&gt;终于编译完了。是不是迫不及待想看看效果呢？ &lt;p&gt;4, 执行自己编译出来的android 4.0 吧！ &lt;p&gt;设置sdk环境变量 &lt;p&gt;&lt;strong&gt;SOURCE _PATH$:export PATH=~/Android/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86/tools:$PATH&lt;/strong&gt; &lt;p&gt;执行编译出来的img &lt;p&gt;&lt;strong&gt;SOURCE_PATH$: $OUT/emulator -system system.img -data userdata.img -ramdisk ramdisk.img&lt;/strong&gt; &lt;p&gt;5, 图出来咯 &lt;p&gt;启动 &lt;p&gt;&lt;img title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/590801/de6c878d-ecf3-398f-a772-a7e6a4680b55.png" width="700" height="490"&gt; &lt;p&gt;进入系统 &lt;p&gt;&lt;img title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/590803/fb204e2a-47a3-3872-93c3-7ebcd709cbbf.png" width="700" height="490"&gt; &lt;p&gt;查看一下编译信息 &lt;p&gt;&lt;img title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/590823/c1428a06-acab-3205-955f-cb4c1271ae1e.png" width="700" height="498"&gt; &lt;p&gt;ok 大功告成！ &lt;p&gt;可以更深一步研究Android 4.0 &lt;p&gt;转载请注明出处，谢谢！ &lt;img src="http://www.cnblogs.com/leaven/aggbug/2426952.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426952.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/31/2426950.html</id><title type="text">android 4.0  编译</title><summary type="text">http://blog.csdn.net/junlineliu/article/details/6988233 1、初始化编译环境（ubuntu11.04 64bit） $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"$ sudo apt-get update$ sudo apt-get install sun-java6-jdk$sudo apt-get install git-core gnupg flex bison gperf build-essential \ z</summary><published>2012-03-31T06:18:00Z</published><updated>2012-03-31T06:18:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426950.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426950.html"/><content type="html">&lt;p&gt;&lt;a title="http://blog.csdn.net/junlineliu/article/details/6988233" href="http://blog.csdn.net/junlineliu/article/details/6988233"&gt;http://blog.csdn.net/junlineliu/article/details/6988233&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、初始化编译环境（ubuntu11.04 64bit）&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;code&gt;$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ sudo apt-get update&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ sudo apt-get install sun-java6-jdk&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$sudo apt-get install git-core gnupg flex bison gperf build-essential \&lt;br /&gt;&lt;/code&gt;&lt;code&gt; zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \&lt;br /&gt;&lt;/code&gt;&lt;code&gt; x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \&lt;br /&gt;&lt;/code&gt;&lt;code&gt; libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \&lt;br /&gt;&lt;/code&gt;&lt;code&gt; libxml2-utils&lt;/code&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、下载代码&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;p&gt;&lt;code&gt;$ mkdir ~/bin&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ PATH=~/bin:$PATH&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo &amp;gt; ~/bin/repo&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ chmod a+x ~/bin/repo&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ mkdir WORKING_DIRECTORY&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ cd WORKING_DIRECTORY&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ repo sync&lt;/code&gt; &lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;3、编译代码&lt;/p&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;code&gt;$ source build/envsetup.sh&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ lunch full-eng&lt;br /&gt;&lt;/code&gt;&lt;code&gt;$ make&lt;/code&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;此处有比较详细的介绍&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;下面介绍一下编译时可能发生的错误：&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt; 网上有人说 android4.0编译需要16G内存，简直是开玩笑&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt; 其实2G内存+5G交换分区就可以完成编译了。&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt; 硬盘最少有15G空间&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;详细信息：&lt;a href="http://source.android.com/source/initializing.html"&gt;http://source.android.com/source/initializing.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2426950.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426950.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/31/2426931.html</id><title type="text">ANDROID 2.3 HOTPLUG  input设备event处理以及hotplug检测</title><summary type="text">http://wb127.blog.51cto.com/2232662/793116 android平台2.3.4，发现插上usb鼠标和键盘开机，那么都能正常使用，一旦拔出以后再插回去，就不能使用了。 首先检测/dev/input下的设备节点是否正常，发现拔出和插入设备，节点文件都能正常删除和创建。 # ls /dev/input/ -altotal 8drwxrwxrwx 2 root root...</summary><published>2012-03-31T06:08:00Z</published><updated>2012-03-31T06:08:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426931.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426931.html"/><content type="html">&lt;p&gt;&lt;a title="http://wb127.blog.51cto.com/2232662/793116" href="http://wb127.blog.51cto.com/2232662/793116"&gt;http://wb127.blog.51cto.com/2232662/793116&lt;/a&gt; &lt;p&gt;android平台2.3.4，发现插上usb鼠标和键盘开机，那么都能正常使用，一旦拔出以后再插回去，就不能使用了。 &lt;p&gt;首先检测/dev/input下的设备节点是否正常，发现拔出和插入设备，节点文件都能正常删除和创建。 &lt;p&gt;# ls /dev/input/ -al&lt;br&gt;total 8&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ./&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 default&amp;nbsp; default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ../&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 63 Feb 28&amp;nbsp; 2012 mice &lt;p&gt;插入鼠标： &lt;p&gt;# ls /dev/input/ -al&lt;br&gt;total 8&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ./&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 default&amp;nbsp; default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ../&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 64 Feb 29&amp;nbsp; 2012 event0&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 63 Feb 28&amp;nbsp; 2012 mice&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 32 Feb 29&amp;nbsp; 2012 mouse0 &lt;p&gt;再插入键盘： &lt;p&gt;# ls /dev/input/ -al&lt;br&gt;total 8&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ./&lt;br&gt;drwxrwxrwx&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 default&amp;nbsp; default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Feb 29&amp;nbsp; 2012 ../&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 64 Feb 29&amp;nbsp; 2012 event0&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 65 Feb 29&amp;nbsp; 2012 event1&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 63 Feb 28&amp;nbsp; 2012 mice&lt;br&gt;crw-r-----&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13,&amp;nbsp; 32 Feb 29&amp;nbsp; 2012 mouse0 &lt;p&gt;直接cat /dev/input/event0,然后晃动鼠标，能看见有接收到消息。说明kernel这一层的input系统工作正常。问题应该在android内部。 &lt;p&gt;打开logcat，查看拔插消息，发现如下打印： &lt;p&gt;如果鼠标正常时拔除：&lt;br&gt;E/EventHub( 1202): remove device: /dev/input/mouse0 not found&lt;br&gt;I/EventHub( 1202): Removed device: path=/dev/input/event0 name=Logitech USB Optical Mouse id=0x10001 (of 0x2) index=3 fd=76 classes=0x8&lt;br&gt;I/InputReader( 1202): Device removed: id=0x10001, name=Logitech USB Optical Mouse, sources=00010004 &lt;p&gt;如果已经拔出过，再次插入拔出时： &lt;p&gt;E/EventHub( 1202): remove device: /dev/input/mouse0 not found&lt;br&gt;E/EventHub( 1202): remove device: /dev/input/event0 not found &lt;p&gt;插入鼠标时：&lt;br&gt;E/EventHub( 1202): could not open /dev/input/mouse0, Permission denied&lt;br&gt;E/EventHub( 1202): could not open /dev/input/event0, Permission denied &lt;p&gt;android的设备检测由两部分来合作：&lt;br&gt;1.Init - system/core/init/负责处理uevent消息并在/dev下建立相关节点文件&lt;br&gt;system/core/init/devices.c&lt;br&gt;2.EventHub - frameworks/base/libs/ui/处理/dev/input/下的节点文件，监测是否有文件新建（IN_CREATE）&lt;br&gt;frameworks/base/libs/ui/EventHub.cpp &lt;p&gt;当init使用mknod()在/dev下建立节点文件,文件的owner和group都是root。然后根据需要使用chown()改变起 ower和group属性。对于/dev/input/下的节点文件，group变为input。但是EventHub随时随刻都在监测/dev /input/event*，在init创建节点但是还没有执行chown时，此时EventHub没有权限去打开。 &lt;p&gt;为了验证这个理论，你可以自己写一个模块，在其初始化函数里面在/dev/input使用evdev创建节点文件event*，然后insmod这个模块，你会在logcat里面看见对应的event*无法打开，和我们开头的出错信息一样：&lt;br&gt;E/EventHub(&amp;nbsp; 953): could not open /dev/input/event3, Permission denied &lt;p&gt;以下是修改内容： &lt;p&gt;--- old/system/init/devices.c &lt;p&gt;+++ new/system/init/devices.c &lt;p&gt;@@ -209,8 +209,10 @@ static void make_device(const char *path, int block, int major, int minor) &lt;p&gt;mode = get_device_perm(path, &amp;amp;uid, &amp;amp;gid) | (block ? S_IFBLK : S_IFCHR); &lt;p&gt;dev = makedev(major, minor); &lt;p&gt;- mknod(path, mode, dev); &lt;p&gt;- chown(path, uid, -1); &lt;p&gt;+ unlink("/dev/.initdev"); &lt;p&gt;+ mknod("/dev/.initdev", mode, dev); &lt;p&gt;+ chown("/dev/.initdev", uid, -1); &lt;p&gt;+ rename("/dev/.initdev", path); &lt;p&gt;} &lt;p&gt;--- old/frameworks/base/libs/ui/EventHub_old.cpp&amp;nbsp;&amp;nbsp;&amp;nbsp; 2012-02-29 23:48:42.000000000 +0800&lt;br&gt;+++ new/frameworks/base/libs/ui/EventHub.cpp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2012-02-29 23:49:15.000000000 +0800&lt;br&gt;@@ -515,7 +515,7 @@&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mDevices[0] = NULL;&lt;br&gt; #ifdef HAVE_INOTIFY&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mFDs[0].fd = inotify_init();&lt;br&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; res = inotify_add_watch(mFDs[0].fd, device_path, IN_DELETE | IN_CREATE);&lt;br&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; res = inotify_add_watch(mFDs[0].fd, device_path, IN_DELETE | IN_CREATE | IN_MOVED_TO);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(res &amp;lt; 0) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGE("could not add watch for %s, %s\n", device_path, strerror(errno));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;@@ -955,7 +955,7 @@&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //printf("%d: %08x \"%s\"\n", event-&amp;gt;wd, event-&amp;gt;mask, event-&amp;gt;len ? event-&amp;gt;name : "");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(event-&amp;gt;len) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(filename, event-&amp;gt;name);&lt;br&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(event-&amp;gt;mask &amp;amp; IN_CREATE) {&lt;br&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(event-&amp;gt;mask &amp;amp; (IN_CREATE | IN_MOVED_TO))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; openDevice(devname);&lt;br&gt;&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; else {&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2426931.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426931.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/31/2426859.html</id><title type="text">android SD卡自动挂载</title><summary type="text">http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html SD card porting一、进程启动和配置文件的分析 vold的全称是volume daemon。实际上是负责完成系统的CDROM, USB大容量存储，MMC卡等扩展存储的 挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个 v...</summary><published>2012-03-31T05:40:00Z</published><updated>2012-03-31T05:40:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426859.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426859.html"/><content type="html">&lt;p&gt;&lt;a title="http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html" href="http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html"&gt;http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html&lt;/a&gt; &lt;p&gt;SD card porting&lt;br&gt;一、进程启动和配置文件的分析&lt;br&gt;&amp;nbsp; vold的全称是volume daemon。实际上是负责完成系统的CDROM, USB大容量存储，MMC卡等扩展存储的&lt;br&gt;&amp;nbsp; 挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个&lt;br&gt;&amp;nbsp; vold系统和GNU/Linux的之间存在很大的差异，这里主要是分析Android上的vold系统的处理过程。&lt;br&gt;&amp;nbsp; 自Android 2.2开始，vold又做了大改动，升级为vold 2.0，之前的配置文件是&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; system/etc/vold.conf，vold 2.0变为system/etc/vold.fstab。&lt;br&gt;&amp;nbsp; 1、启动vold&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在init.rc中启动VOLD这个守护线程和创建socket的命令如下： &lt;p&gt;&lt;a href="http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html#"&gt;?&lt;/a&gt; &lt;p&gt;&lt;code&gt;service vold /system/bin/vold&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;socket vold stream &lt;/code&gt;&lt;code&gt;0660&lt;/code&gt; &lt;code&gt;root mount&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;ioprio be &lt;/code&gt;&lt;code&gt;2&lt;/code&gt; &lt;p&gt;　2、配置vold.fstab&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vold.fstab文件的格式是： &lt;p&gt;&lt;a href="http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html#"&gt;?&lt;/a&gt; &lt;p&gt;&lt;code&gt;Format: dev_mount &amp;lt;label&amp;gt; &amp;lt;mount_point&amp;gt; &amp;lt;part&amp;gt; &amp;lt;sysfs_path1...&amp;gt;&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;label:&amp;nbsp;&amp;nbsp;&amp;nbsp; -Label &lt;/code&gt;&lt;code&gt;for&lt;/code&gt; &lt;code&gt;the volume&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;mount_point&amp;nbsp; -Where the volume will be mounted&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;part&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -Partition #(&lt;/code&gt;&lt;code&gt;1&lt;/code&gt; &lt;code&gt;based), or &lt;/code&gt;&lt;code&gt;'auto'&lt;/code&gt; &lt;code&gt;for&lt;/code&gt; &lt;code&gt;first usable partition.&lt;/code&gt; &lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;sysfs_path&amp;gt; -List of sysfs paths to source devices&lt;/code&gt; &lt;p&gt;例如：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dev_mount sdcard /mnt/sdcard 1 /devices/platform/mxsdhci.0/mmc_host/mmc0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 自Android 2.2后，SD mount的位置变为/mnt/sdcard。&lt;br&gt;二、控制流程分析&lt;br&gt;&amp;nbsp; Vold关于SD card settings的代码位于：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; packages/apps/Settings/src/com/android/settings/deviceinfo/Memory.java&lt;br&gt;&amp;nbsp; Vold上层MountService的代码位于：&lt;br&gt;frameworks/base/services/java/com/android/server/MountService.java&lt;br&gt;&amp;nbsp; Vold底层处理的代码位于：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; system/vold/&lt;br&gt;&amp;nbsp; 1、Vold设计架构&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Setting&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MountService&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommandListener&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VolumeManager&amp;nbsp; - NetlinkManager&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Volume&amp;nbsp; -&amp;nbsp; DirectVolume&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br&gt;SD/USB device&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MountService会接收来之Setting的变化，及来自底层VolumeManager的信息，并对之分析判，然后&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过doMountVolume命令到底层。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vold初始化时，会创建class NetlinkManager和VolumeManager，class NetlinkManager接收&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 来自底层的信息，然后传交给VolumeManager处理；&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 重要类class VolumeManager 仅有一个实例，它主要负责vold的管理操作，管理多个sd卡，usb各种&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 操作；重要类class Volume 可有多个实例， 挂载多少个sd卡、usb，它就有多少个。重要类class&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectVolume 封装了很多的方法和属性；重要类class CommandListener主要收到上层&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MountService通过doMountVolume发来的命令，分析后，转交给VolumeManager处理；&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VolumeManager处理信息后，或报告给上层MountService,或交给volume执行具体操作（挂载&lt;br&gt;SD,USB）.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp; 2、Vold代码实现过程大致分为三步：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1）.创建链接：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在vold作为一个守护进程，一方面接受驱动的信息，并把信息传给应用层；另一方面接受上层的命令并&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; （1）vold socket: 负责vold与应用层的信息传递；&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2）访问udev的socket: 负责vold与底层的信息传递；&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这两个链接都是在进程的一开始完成创建的。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2）.引导：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这里主要是在vold启动时，对现有外设存储设备的处理。首先，要加载并解析vold.fstab，&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 并检查挂载点是否已经被挂载（注：这里检查挂载点的用意不是很清楚！）； 其次，执行MMC卡挂&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 载； 最后，处理USB大容量存储。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3）.事件处理：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这里通过对两个链接的监听，完成对动态事件的处理，以及对上层应用操作的响应&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2426859.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/31/2426859.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leaven/archive/2012/03/29/2423553.html</id><title type="text">android4.0模拟器EditText不自动弹出软键盘</title><summary type="text">编辑你的AVD，添加 "Keyboard Support" 并且把它的值改为 no. http://www.eoeandroid.com/forum.php?mod=viewthread&amp;tid=114939&amp;page=1#pid1309261</summary><published>2012-03-29T08:14:00Z</published><updated>2012-03-29T08:14:00Z</updated><author><name>海王</name><uri>http://www.cnblogs.com/leaven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leaven/archive/2012/03/29/2423553.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leaven/archive/2012/03/29/2423553.html"/><content type="html">&lt;p&gt;编辑你的AVD，添加 "Keyboard Support" 并且把它的值改为 no.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.eoeandroid.com/forum.php?mod=viewthread&amp;amp;tid=114939&amp;amp;page=1#pid1309261" href="http://www.eoeandroid.com/forum.php?mod=viewthread&amp;amp;tid=114939&amp;amp;page=1#pid1309261"&gt;http://www.eoeandroid.com/forum.php?mod=viewthread&amp;amp;tid=114939&amp;amp;page=1#pid1309261&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leaven/aggbug/2423553.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leaven/archive/2012/03/29/2423553.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
