<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>liulang&#039;s blog &#187; 移动开发</title>
	<atom:link href="http://www.liulang.cq.cn/category/mobile/feed" rel="self" type="application/rss+xml" />
	<link>http://www.liulang.cq.cn</link>
	<description>既然选择了远方，便只顾风雨兼程……</description>
	<lastBuildDate>Thu, 10 Jun 2010 11:41:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Android TTS  语音朗读 的开发</title>
		<link>http://www.liulang.cq.cn/20100518/android-tts.html</link>
		<comments>http://www.liulang.cq.cn/20100518/android-tts.html#comments</comments>
		<pubDate>Tue, 18 May 2010 08:38:18 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=266</guid>
		<description><![CDATA[1、首先要tts是否有所需语言的语音数据，如果没有需安装它


Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);   
private TextToSpeech mTts;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS [...]]]></description>
			<content:encoded><![CDATA[<p>1、首先要tts是否有所需语言的语音数据，如果没有需安装它<br />
<span id="more-266"></span></p>
<p><code><br />
Intent checkIntent = new Intent();<br />
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);<br />
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);   </p>
<p>private TextToSpeech mTts;<br />
protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br />
    if (requestCode == MY_DATA_CHECK_CODE) {<br />
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {<br />
            // success, create the TTS instance<br />
            mTts = new TextToSpeech(this, this);<br />
        } else {<br />
            // missing data, install it<br />
            Intent installIntent = new Intent();<br />
            installIntent.setAction(<br />
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);<br />
            startActivity(installIntent);<br />
        }<br />
    }<br />
} </code></p>
<p>2、设置地区（语言）<br />
<code><br />
mTts.setLanguage(Locale.US);<br />
 </code></p>
<p>3、判断是否支持某地区的语言<br />
mTts.isLanguageAvailable(Locale.FRANCE))<br />
或 </p>
<p>mTts.isLanguageAvailable(new Locale(&#8220;spa&#8221;, &#8220;ESP&#8221;)))  </p>
<p>或 </p>
<p>mTts.isLanguageAvailable(new Locale(&#8220;spa&#8221;))  </p>
<p>如果没有语言数据，会返回TextToSpeech.LANG_MISSING_DATA，否则返回ACTION_CHECK_TTS_DATA </p>
<p>4、处理发音<br />
<code><br />
String myText1 = "Did you sleep well?";<br />
String myText2 = "I hope so, because it's time to wake up.";<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);<br />
</code></p>
<p>5、加参数 </p>
<p><code><br />
HashMap<String, String> myHashAlarm = new HashMap();<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>6、加完成监听 </p>
<p><code></p>
<p>mTts.setOnUtteranceCompletedListener(this);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "end of wakeup message ID");<br />
// myHashAlarm now contains two optional parameters<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);   </p>
<p>public void onUtteranceCompleted(String uttId) {<br />
if (uttId == "end of wakeup message ID") {<br />
    playAnnoyingMusic();<br />
}<br />
}  </code></p>
<p>7、将发音录入文件<br />
<code></p>
<p>HashMap<String, String> myHashRender = new HashMap();<br />
String wakeUpText = "Are you up yet?";<br />
String destFileName = "/sdcard/myAppCache/wakeUp.wav";<br />
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);   </p>
<p>mTts.addSpeech(wakeUpText, destFileName);<br />
mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>8、关闭tts<br />
<code></p>
<p>mTts.shutdown();<br />
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100518/android-tts.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu9.10下编译Android源代码</title>
		<link>http://www.liulang.cq.cn/20100427/androidsource.html</link>
		<comments>http://www.liulang.cq.cn/20100427/androidsource.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 07:34:04 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=245</guid>
		<description><![CDATA[本文将为大家介绍的是如何设置Android源码的编译环境，包括Linux下的配置。主要基于Android 1.5环境，希望对大家了解Android开发有所帮助。 
本次编译过程主要参考官方文档（http://source.Android.com/download)和网上相关资料（如http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx) 
编译环境：Ubuntu9.10 
1、安装一些环境 

sudo apt-get install build-essential  
 sudo apt-get install make  
 sudo apt-get install gcc  
 sudo apt-get install g++  
 sudo apt-get install libc6-dev  
   
 sudo apt-get install patch  
 sudo apt-get install texinfo  
 sudo apt-get install libncurses-dev  
   
 sudo apt-get install git-core gnupg  
 sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl  
 sudo apt-get install ncurses-dev   
 sudo apt-get install zlib1g-dev  
 sudo apt-get install valgrind  
 sudo apt-get install python2.5 

 
安装java环境 


sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts sun-java6-jdk 


 
注：官方文档说如果用sun-java6-jdk可出问题，得要用sun-java5-jdk。经测试发现，如果仅仅make（make不包括make sdk)，用sun-java6-jdk是没有问题的。而make sdk，就会有问题，严格来说是在make doc出问题，它需要的javadoc版本为1.5。 
因此，我们安装完sun-java6-jdk后最好再安装sun-java5-jdk，或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装，并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话，除了javadoc工具是用1.5版本，其它均用1.6版本：  


sudo apt-get install sun-java5-jdk 


 
修改javadoc的link 


cd /etc/alternatives  
sudo rm javadoc.1.gz  
sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz  
sudo rm javadoc  
sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc 


 
2、设置环境变量 


vim ~/.bashrc 


 
在.bashrc中新增或整合PATH变量，如下 


#java 程序开发/运行的一些环境变量  
JAVA_HOME=/usr/lib/jvm/java-6-sun  
JRE_HOME=${JAVA_HOME}/jre  
export Android_JAVA_HOME=$JAVA_HOME  
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH  
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin  
export JAVA_HOME;  
export JRE_HOME;  
export CLASSPATH;  
HOME_BIN=~/bin/  
export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN};   
#echo $PATH; 


 
最后，同步这些变化： 

source ~/.bashrc 

3、安装repo（用来更新Android源码) 
创建~/bin目录，用来存放repo程序，如下： 

$ cd ~  
$ mkdir bin 

并加到环境变量PATH中，在第2步中已经加入 
下载repo脚本并使其可执行： 

$ curl http://Android.git.kernel.org/repo &#62;~/bin/repo  
$ chmod a+x ~/bin/repo 

4、下载 Android源码并更新之 
建议不要用repo来下载（Android源码超过1G，非常慢)，直接在网上下载http://www.Androidin.com/bbs/pub/cupcake.tar.gz。而且解压出来的 cupcake下也有.repo文件夹，可以通过repo sync来更新cupcake代码： 

tar -xvf  cupcake.tar.gz  

repo sync（更新很慢，用了3个小时) 
5、编译Android源码,并得到~/project/Android/cupcake/out 目录 
进入Android源码目录： 
make 
这一过程很久（2个多小时) 
6、在模拟器上运行编译好Android 
Android SDK的emulator程序在Android-sdk-linux_x86-1.0_r2/tools/下，emulator是需要加载一些image的，默认加载Android-sdk-linux_x86-1.0_r2/tools/lib/images下的kernel-qemu（内核) ramdisk.img  system.img  userdata.img 
编译好Android之后，emulator在~/project/Android/cupcake/out/host/linux-x86/bin下， ramdisk.img  system.img  userdata.img则在~/project/Android/cupcake/out/target/product/generic下 
cd ~/project/Android/cupcake/out/host/linux-x86/bin 
增加环境变量 


vim ~/.bashrc 


在.bashrc中新增环境变量，如下 


#java 程序开发/运行的一些环境变量  
export Android_PRODUCT_OUT=~/project/Android/cupcake2/out/target/product/generic  
 Android_PRODUCT_OUT_BIN=~/project/Android/cupcake2/out/host/linux-x86/bin  
export PATH=${PATH}:${Android_PRODUCT_OUT_BIN}; 


最后，同步这些变化： 


source ~/.bashrc  
emulator -image system.img -data userdata.img -ramdisk ramdisk.img 


最后进入Android桌面，就说明成功了。 
out/host/linux-x86/bin下生成许多有用工具（包括Android [...]]]></description>
			<content:encoded><![CDATA[<p>本文将为大家介绍的是如何设置Android源码的编译环境，包括Linux下的配置。主要基于Android 1.5环境，希望对大家了解Android开发有所帮助。 </p>
<p>本次编译过程主要参考官方文档（http://source.Android.com/download)和网上相关资料（如http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx) </p>
<p>编译环境：Ubuntu9.10 </p>
<p><strong><strong>1、安装一些环境<span id="more-245"></span></strong> </p>
<pre>
<li>sudo apt-get install build-essential  </li>
<li> sudo apt-get install make  </li>
<li> sudo apt-get install gcc  </li>
<li> sudo apt-get install g++  </li>
<li> sudo apt-get install libc6-dev  </li>
<li>   </li>
<li> sudo apt-get install patch  </li>
<li> sudo apt-get install texinfo  </li>
<li> sudo apt-get install libncurses-dev  </li>
<li>   </li>
<li> sudo apt-get install git-core gnupg  </li>
<li> sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl  </li>
<li> sudo apt-get install ncurses-dev   </li>
<li> sudo apt-get install zlib1g-dev  </li>
<li> sudo apt-get install valgrind  </li>
<li> sudo apt-get install python2.5 </li>
</pre>
<p> </p>
<p>安装java环境 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts sun-java6-jdk </span></span></li>
</ol>
</pre>
<p> </p>
<p>注：官方文档说如果用sun-java6-jdk可出问题，得要用sun-java5-jdk。经测试发现，如果仅仅make（make不包括make sdk)，用sun-java6-jdk是没有问题的。而make sdk，就会有问题，严格来说是在make doc出问题，它需要的javadoc版本为1.5。 </p>
<p>因此，我们安装完sun-java6-jdk后最好再安装sun-java5-jdk，或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装，并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话，除了javadoc工具是用1.5版本，其它均用1.6版本：  </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>sudo apt-get install sun-java5-jdk </span></span></li>
</ol>
</pre>
<p> </p>
<p>修改javadoc的link </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>cd /etc/alternatives  </span></span></li>
<li><span>sudo rm javadoc.1.gz  </span></li>
<li class="alt"><span>sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz  </span></li>
<li><span>sudo rm javadoc  </span></li>
<li class="alt"><span>sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc </span></li>
</ol>
</pre>
<p> </p>
<p>2、设置环境变量 </p>
<pre>
<ol class="dp-c">
<li class="alt"><span><span>vim ~/.bashrc </span></span></li>
</ol>
</pre>
<p> </p>
<p>在.bashrc中新增或整合PATH变量，如下 </p>
<pre>
<ol class="dp-c">
<li class="alt"><span><span class="preprocessor"><span style="color: #808080;">#java 程序开发/运行的一些环境变量 </span></span><span> </span></span></li>
<li><span>JAVA_HOME=/usr/lib/jvm/java-6-sun  </span></li>
<li class="alt"><span>JRE_HOME=${JAVA_HOME}/jre  </span></li>
<li><span>export Android_JAVA_HOME=$JAVA_HOME  </span></li>
<li class="alt"><span>export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH  </span></li>
<li><span>export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin  </span></li>
<li class="alt"><span>export JAVA_HOME;  </span></li>
<li><span>export JRE_HOME;  </span></li>
<li class="alt"><span>export CLASSPATH;  </span></li>
<li><span>HOME_BIN=~/bin/  </span></li>
<li class="alt"><span>export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN}; </span><span class="preprocessor"> </span> </li>
<li><span><span class="preprocessor"><span style="color: #808080;">#echo $PATH;</span></span><span> </span></span></li>
</ol>
</pre>
<p> </p>
<p>最后，同步这些变化： </p>
<pre>
<li>source ~/.bashrc </li>
</pre>
<p><strong>3、安装repo（用来更新Android源码)</strong> </p>
<p>创建~/bin目录，用来存放repo程序，如下： </p>
<pre>
<li>$ cd ~  </li>
<li>$ mkdir bin </li>
</pre>
<p>并加到环境变量PATH中，在第2步中已经加入 </p>
<p>下载repo脚本并使其可执行： </p>
<pre>
<li>$ curl http://Android.git.kernel.org/repo <strong><span style="color: #006699;">&gt;</span></strong>~/bin/repo  </li>
<li>$ chmod a+x ~/bin/repo </li>
</pre>
<p><strong>4、下载 Android源码并更新之</strong> </p>
<p>建议不要用repo来下载（Android源码超过1G，非常慢)，直接在网上下载http://www.Androidin.com/bbs/pub/cupcake.tar.gz。而且解压出来的 cupcake下也有.repo文件夹，可以通过repo sync来更新cupcake代码： </p>
<pre>
<li>tar -xvf  cupcake.tar.gz  </li>
</pre>
<p>repo sync（更新很慢，用了3个小时) </p>
<p><strong>5、编译Android源码,并得到~/project/Android/cupcake/out 目录</strong> </p>
<p>进入Android源码目录： </p>
<p>make </p>
<p>这一过程很久（2个多小时) </p>
<p><strong>6、在模拟器上运行编译好Android</strong> </p>
<p>Android SDK的emulator程序在Android-sdk-linux_x86-1.0_r2/tools/下，emulator是需要加载一些image的，默认加载Android-sdk-linux_x86-1.0_r2/tools/lib/images下的kernel-qemu（内核) ramdisk.img  system.img  userdata.img </p>
<p>编译好Android之后，emulator在~/project/Android/cupcake/out/host/linux-x86/bin下， ramdisk.img  system.img  userdata.img则在~/project/Android/cupcake/out/target/product/generic下 </p>
<p>cd ~/project/Android/cupcake/out/host/linux-x86/bin </p>
<p>增加环境变量 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>vim ~/.bashrc </span></span></li>
</ol>
</pre>
<p>在.bashrc中新增环境变量，如下 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>#java 程序开发/运行的一些环境变量  </span></span></li>
<li><span>export </span><span class="attribute"><span style="color: #ff0000;">Android_PRODUCT_OUT</span></span><span>=~/project/Android/cupcake2/out/target/product/generic  </span></li>
<li class="alt"><span> </span><span class="attribute"><span style="color: #ff0000;">Android_PRODUCT_OUT_BIN</span></span><span>=~/project/Android/cupcake2/out/host/linux-x86/bin  </span></li>
<li><span>export </span><span class="attribute"><span style="color: #ff0000;">PATH</span></span><span>=${PATH}:${Android_PRODUCT_OUT_BIN}; </span></li>
</ol>
</pre>
<p>最后，同步这些变化： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>source ~/.bashrc  </span></span></li>
<li><span>emulator -image system.img -data userdata.img -ramdisk ramdisk.img </span></li>
</ol>
</pre>
<p>最后进入Android桌面，就说明成功了。 </p>
<p>out/host/linux-x86/bin下生成许多有用工具（包括Android SDK/tools的所有工具)，因此，可以把eclipse中Android SDK的路径指定到out/host/linux-x86/bin进行开发 </p>
<p><strong>7、编译linux kernel</strong> </p>
<p>直接make Android源码时，并没有make linux kernel。因此是在运行模拟器，所以不用编译 linux kernel。如果要移值Android，或增删驱动，则需要编译 linux kernellinux kernel的编译将在以后的文章中介绍。 </p>
<p><strong>8、编译模块</strong>Android中的一个应用程序可以单独编译，编译后要重新生成system.img在源码目录下执行 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>. build/envsetup.sh （.后面有空格) </span></span></li>
</ol>
</pre>
<p>就多出一些命令： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>- croot:   Changes directory to the top of the tree.  </span></span></li>
<li><span>- m:       Makes from the top of the tree.  </span></li>
<li class="alt"><span>- mm:      Builds all of the modules in the current directory.  </span></li>
<li><span>- mmm:     Builds all of the modules in the supplied directories.  </span></li>
<li class="alt"><span>- cgrep:   Greps on all local C/C++ files.  </span></li>
<li><span>- jgrep:   Greps on all local Java files.  </span></li>
<li class="alt"><span>- resgrep: Greps on all local res/*.xml files.  </span></li>
<li><span>- godir:   Go to the directory containing a file. </span></li>
</ol>
</pre>
<p>可以加—help查看用法我们可以使用mmm来编译指定目录的模块，如编译联系人： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>mmm packages/apps/Contacts/ </span></span></li>
</ol>
</pre>
<p>编完之后生成两个文件： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>out/target/product/generic/data/app/ContactsTests.apk  </span></span></li>
<li><span>out/target/product/generic/system/app/ Contacts.apk </span></li>
</ol>
</pre>
<p>可以使用make snod重新生成system.img再运行模拟器 </p>
<p><strong>9、编译SDK</strong>直接执行make是不包括make sdk的。make sdk用来生成SDK，这样，我们就可以用与源码同步的SDK来开发 Android了。 </p>
<p>1)修改/frameworks/base/include/utils/Asset.h‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’原因是Eclipse编译工程需要大于1.3M的buffer </p>
<p>2)编译ADT。注意，我们是先执行2)，再执行3)。因为在执行./build_server.sh时，会把生成的SDK清除了。用上了新的源码，adt这个调试工具也得自己来生成，步骤如下：进入cupcake源码的development/tools/eclipse/scripts目录，执行：export ECLIPSE_HOME=你的eclipse路径./build_server.sh 你想放ADT的路径 </p>
<p>3)执行make sdk。注意，这里需要的javadoc版本为1.5，所以你需要在步骤1中同时安装sun-java5-jdkmake sdk编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/，此目录下有Android-sdk_eng.xxx_linux-x86.zip和Android-sdk_eng.xxx_linux-x86目录。Android-sdk_eng.xxx_linux-x86就是SDK目录实际上，当用mmm命令编译模块时，一样会把SDK的输出文件清除，因此，最好把Android-sdk_eng.xxx_linux-x86移出来 </p>
<p><strong>4)关于环境变量、Android工具的选择</strong>目前的Android工具有：A、我们从网上下载的SDK（ tools下有许多Android工具，lib/images下有img映像)B、我们用make sdk编译出来的SDK（ tools下也有许多Android工具，lib/images下有img映像)C、我们用make编译出来的out目录（ tools下也有许多Android工具，lib/images下有img映像)那么我们应该用那些工具和img呢？首先，我们不会用A选项的工具和img，因为一般来说它比较旧，也源码不同步。测试发现，如果使用B选项的工具和img，Android模拟器窗口变小（可能是skin加载不了)，而用C选项的工具和img则不会有此问题。有些Android工具依赖Android.jar（比如Android)，因此，我们在eclipse中使用B选项的工具（SDK)，使用C选项的img。其实，从emulator -help-build-images也可以看出，Android_PRODUCT_OUT是指向C选项的img目录的不过，除了用A选项的工具和img，用B或C的模拟器都不能加载sdcard，原因还不清楚。 </p>
<p><strong>5)安装、配置ADT</strong>安装、配置ADT请参考官方文档 </p>
<p>6)创建Android Virtual Device编译出来的SDK是没有AVD（Android Virtual Device)的，我们可以通过Android工具查看：Android list输出为： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>Available Android targets:  </span></span></li>
<li><span>[1] Android 1.5  </span></li>
<li class="alt"><span>     API level: 3  </span></li>
<li><span>     Skins: HVGA-P, QVGA-L, HVGA-L, HVGA (default), QVGA-P  </span></li>
<li class="alt"><span>Available Android Virtual Devices: </span></li>
</ol>
</pre>
<p>表明没有AVD。如果没有AVD，eclipse编译工程时会出错（Failed to find a AVD compatible with target &#8216;Android 1.5&#8242;. Launch aborted.)创建AVD：Android create avd -t 1 -c ~/sdcard.img -n myavd可以Android –help来查看上面命令选项的用法。创建中有一些选项，默认就行了再执行Android list，可以看到AVD存放的位置以后每次运行emulator都要加-avd myavd或@myavd选项，这里eclipse才会在你打开的emulator中调试程序 </p>
<p><strong>注意：</strong>这样，SDK和ADT就生成了，就按照官方文档把他们整合到Eclipse，这里不再细说了。建个Android的新工程，试试你自己编译的sdk。 </p>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100427/androidsource.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dalvik 十件事</title>
		<link>http://www.liulang.cq.cn/20100303/dalvik-ten.html</link>
		<comments>http://www.liulang.cq.cn/20100303/dalvik-ten.html#comments</comments>
		<pubDate>Wed, 03 Mar 2010 03:47:36 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=240</guid>
		<description><![CDATA[Android(OPhone)系统的模拟器为Dalvik，DEX文件格式为Android操作系统上的Dalvik虚拟机可执行文件即Dalvik VM executes 的缩写。
下文翻译自John R. Rose在Google I/O上的介绍，《The top ten things I learned about Android and the Dalvik VM》，略有删节。其英文博客原文地址为：http://blogs.sun.com/jrose/entry/with_android_and_dalvik_at  。
1.Android是Linux/JVM 的简化版，他们重写了libc，减小到200k，重做了速度-空间的优化，扔掉了c++的例外和c级别的wide char的支持。
2.该平台的一个特别的地方是他们在减少私有页面开销时花费了很大的功夫。
3.他们不用OpenJDK而是使用Harmony的主要原因是GPL。
4.Android 1.0 的虚拟机是很简单的：一个类似资源分配（malloc-like）的堆和一个解释器。
5.不使用JVM字节码的关键理由是解释器的复杂性和脏页面的印记。
6.虚拟机使用dex文件就像java cards使用自己的内部指令集一样。据说它可以在手机上得到局部优化运行。该工具链使用class文件，有一个叫dx的工具可以把jar转换成dex的汇编文件。
7.dx之类的工具可以强制植入手机，使java代码可以继续生成字节码，然后还要转换成虚拟机可以执行的格式。
8.dx将class文件转换成静态单一赋值形式(SSA:Static Single Assignment)， 然后转换成dex文件。该过程中没有优化（optimizations are missing）。
9.dex格式的常数pool通常是合并的带类型的，具有32位的索引。它很有可能会促进java的class文件标准的升级。
10.人们感激Sun之前做的java服务性工作，但是并不能看到Sun对人们未来的导引。
]]></description>
			<content:encoded><![CDATA[<p style="padding: 0px; margin: 0px;"><span>Android(OPhone)系统的模拟器为Dalvik，DEX文件格式为Android操作系统上的Dalvik虚拟机可执行文件即Dalvik VM executes 的缩写。</span></p>
<p style="padding: 0px; margin: 0px;"><span>下文翻译自John R. Rose在Google I/O上的介绍，《The top ten things I learned about Android and the Dalvik VM》，略有删节。其英文博客原文地址为：http://blogs.sun.com/jrose/entry/with_android_and_dalvik_at  。</span></p>
<p>1.Android是Linux/JVM 的简化版，他们重写了libc，减小到200k，重做了速度-空间的优化，扔掉了c++的例外和c级别的wide char的支持。<br />
2.该平台的一个特别的地方是他们在减少私有页面开销时花费了很大的功夫。<br />
3.他们不用OpenJDK而是使用Harmony的主要原因是GPL。<br />
4.Android 1.0 的虚拟机是很简单的：一个类似资源分配（malloc-like）的堆和一个解释器。<br />
5.不使用JVM字节码的关键理由是解释器的复杂性和脏页面的印记。<br />
6.虚拟机使用dex文件就像java cards使用自己的内部指令集一样。据说它可以在手机上得到局部优化运行。该工具链使用class文件，有一个叫dx的工具可以把jar转换成dex的汇编文件。<br />
7.dx之类的工具可以强制植入手机，使java代码可以继续生成字节码，然后还要转换成虚拟机可以执行的格式。<br />
8.dx将class文件转换成静态单一赋值形式(SSA:Static Single Assignment)， 然后转换成dex文件。该过程中没有优化（optimizations are missing）。<br />
9.dex格式的常数pool通常是合并的带类型的，具有32位的索引。它很有可能会促进java的class文件标准的升级。<br />
10.人们感激Sun之前做的java服务性工作，但是并不能看到Sun对人们未来的导引。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100303/dalvik-ten.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android permission 访问权限大全</title>
		<link>http://www.liulang.cq.cn/20091206/android-permission-all.html</link>
		<comments>http://www.liulang.cq.cn/20091206/android-permission-all.html#comments</comments>
		<pubDate>Sun, 06 Dec 2009 15:26:09 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=187</guid>
		<description><![CDATA[程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下:
android.permission.ACCESS_CHECKIN_PROPERTIES
允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)
android.permission.ACCESS_COARSE_LOCATION
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)
android.permission.ACCESS_FINE_LOCATION
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)
android.permission.ACCESS_MOCK_LOCATION
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)
android.permission.ACCESS_NETWORK_STATE
允许程序访问有关GSM网络信息(Allows applications [...]]]></description>
			<content:encoded><![CDATA[<p>程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下:</p>
<p>android.permission.ACCESS_CHECKIN_PROPERTIES<br />
允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)<span id="more-187"></span></p>
<p>android.permission.ACCESS_COARSE_LOCATION<br />
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)</p>
<p>android.permission.ACCESS_FINE_LOCATION<br />
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)</p>
<p>android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br />
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)</p>
<p>android.permission.ACCESS_MOCK_LOCATION<br />
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)</p>
<p>android.permission.ACCESS_NETWORK_STATE<br />
允许程序访问有关GSM网络信息(Allows applications to access information about networks)</p>
<p>android.permission.ACCESS_SURFACE_FLINGER<br />
允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features)</p>
<p>android.permission.ACCESS_WIFI_STATE<br />
允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)</p>
<p>android.permission.ADD_SYSTEM_SERVICE<br />
允许程序发布系统级服务(Allows an application to publish system-level services).</p>
<p>android.permission.BATTERY_STATS<br />
允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics)</p>
<p>android.permission.BLUETOOTH<br />
允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices)</p>
<p>android.permission.BLUETOOTH_ADMIN<br />
允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices)</p>
<p>android.permission.BRICK<br />
请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)</p>
<p>android.permission.BROADCAST_PACKAGE_REMOVED<br />
允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed)</p>
<p>android.permission.BROADCAST_STICKY<br />
允许一个程序广播常用intents(Allows an application to broadcast sticky intents)</p>
<p>android.permission.CALL_PHONE<br />
允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认(Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.)</p>
<p>android.permission.CALL_PRIVILEGED<br />
允许一个程序拨打任何号码，包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed)</p>
<p>android.permission.CAMERA<br />
请求访问使用照相设备(Required to be able to access the camera device. )</p>
<p>android.permission.CHANGE_COMPONENT_ENABLED_STATE<br />
允许一个程序是否改变一个组件或其他的启用或禁用(Allows an application to change whether an application component (other than its own) is enabled or not. )</p>
<p>android.permission.CHANGE_CONFIGURATION<br />
允许一个程序修改当前设置，如本地化(Allows an application to modify the current configuration, such as locale. )</p>
<p>android.permission.CHANGE_NETWORK_STATE<br />
允许程序改变网络连接状态(Allows applications to change network connectivity state)</p>
<p>android.permission.CHANGE_WIFI_STATE<br />
允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)</p>
<p>android.permission.CLEAR_APP_CACHE<br />
允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. )</p>
<p>android.permission.CLEAR_APP_USER_DATA<br />
允许一个程序清除用户设置(Allows an application to clear user data)</p>
<p>android.permission.CONTROL_LOCATION_UPDATES<br />
允许启用禁止位置更新提示从无线模块(Allows enabling/disabling location update notifications from the radio. )</p>
<p>android.permission.DELETE_CACHE_FILES<br />
允许程序删除缓存文件(Allows an application to delete cache files)</p>
<p>android.permission.DELETE_PACKAGES<br />
允许一个程序删除包(Allows an application to delete packages)</p>
<p>android.permission.DEVICE_POWER<br />
允许访问底层电源管理(Allows low-level access to power management)</p>
<p>android.permission.DIAGNOSTIC<br />
允许程序RW诊断资源(Allows applications to RW to diagnostic resources. )</p>
<p>android.permission.DISABLE_KEYGUARD<br />
允许程序禁用键盘锁(Allows applications to disable the keyguard )</p>
<p>android.permission.DUMP<br />
允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.)</p>
<p>android.permission.EXPAND_STATUS_BAR<br />
允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序(Allows an application to expand or collapse the status bar. )</p>
<p>android.permission.FACTORY_TEST<br />
作为一个工厂测试程序，运行在root用户(Run as a manufacturer test application, running as the root user. )</p>
<p>android.permission.FLASHLIGHT<br />
访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight )</p>
<p>android.permission.FORCE_BACK<br />
允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. )</p>
<p>android.permission.FOTA_UPDATE<br />
暂时不了解这是做什么使用的，android开发网分析可能是一个预留权限.</p>
<p>android.permission.GET_ACCOUNTS<br />
访问一个帐户列表在Accounts Service中(Allows access to the list of accounts in the Accounts Service)</p>
<p>android.permission.GET_PACKAGE_SIZE<br />
允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )</p>
<p>android.permission.GET_TASKS<br />
允许一个程序获取信息有关当前或最近运行的任务，一个缩略的任务状态，是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.)</p>
<p>android.permission.HARDWARE_TEST<br />
允许访问硬件(Allows access to hardware peripherals. )</p>
<p>android.permission.INJECT_EVENTS<br />
允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流，android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.)</p>
<p>android.permission.INSTALL_PACKAGES<br />
允许一个程序安装packages(Allows an application to install packages. )</p>
<p>android.permission.INTERNAL_SYSTEM_WINDOW<br />
允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. )</p>
<p>android.permission.INTERNET<br />
允许程序打开网络套接字(Allows applications to open network sockets)</p>
<p>android.permission.MANAGE_APP_TOKENS<br />
允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中(Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. )</p>
<p>android.permission.MASTER_CLEAR目前还没有明确的解释，android开发网分析可能是清除一切数据，类似硬格机</p>
<p>android.permission.MODIFY_AUDIO_SETTINGS<br />
允许程序修改全局音频设置(Allows an application to modify global audio settings)</p>
<p>android.permission.MODIFY_PHONE_STATE<br />
允许修改话机状态，如电源，人机接口等(Allows modification of the telephony state – power on, mmi, etc. )</p>
<p>android.permission.MOUNT_UNMOUNT_FILESYSTEMS<br />
允许挂载和反挂载文件系统可移动存储(Allows mounting and unmounting file systems for removable storage. )</p>
<p>android.permission.PERSISTENT_ACTIVITY<br />
允许一个程序设置他的activities显示(Allow an application to make its activities persistent. )</p>
<p>android.permission.PROCESS_OUTGOING_CALLS<br />
允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls)</p>
<p>android.permission.READ_CALENDAR<br />
允许程序读取用户日历数据(Allows an application to read the user’s calendar data.)</p>
<p>android.permission.READ_CONTACTS<br />
允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.)</p>
<p>android.permission.READ_FRAME_BUFFER<br />
允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data)</p>
<p>android.permission.READ_INPUT_STATE<br />
允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. )</p>
<p>android.permission.READ_LOGS<br />
允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. )</p>
<p>android.permission.READ_OWNER_DATA<br />
允许程序读取所有者数据(Allows an application to read the owner’s data)</p>
<p>android.permission.READ_SMS<br />
允许程序读取短信息(Allows an application to read SMS messages.)</p>
<p>android.permission.READ_SYNC_SETTINGS<br />
允许程序读取同步设置(Allows applications to read the sync settings)</p>
<p>android.permission.READ_SYNC_STATS<br />
允许程序读取同步状态(Allows applications to read the sync stats)</p>
<p>android.permission.REBOOT<br />
请求能够重新启动设备(Required to be able to reboot the device. )</p>
<p>android.permission.RECEIVE_BOOT_COMPLETED<br />
允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )</p>
<p>android.permission.RECEIVE_MMS<br />
允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. )</p>
<p>android.permission.RECEIVE_SMS<br />
允许程序监控一个将收到短信息，记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.)</p>
<p>android.permission.RECEIVE_WAP_PUSH<br />
允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. )</p>
<p>android.permission.RECORD_AUDIO<br />
允许程序录制音频(Allows an application to record audio)</p>
<p>android.permission.REORDER_TASKS<br />
允许程序改变Z轴排列任务(Allows an application to change the Z-order of tasks)</p>
<p>android.permission.RESTART_PACKAGES<br />
允许程序重新启动其他程序(Allows an application to restart other applications)</p>
<p>android.permission.SEND_SMS<br />
允许程序发送SMS短信(Allows an application to send SMS messages)</p>
<p>android.permission.SET_ACTIVITY_WATCHER<br />
允许程序监控或控制activities已经启动全局系统中Allows an application to watch and control how activities are started globally in the system.</p>
<p>android.permission.SET_ALWAYS_FINISH<br />
允许程序控制是否活动间接完成在处于后台时Allows an application to control whether activities are immediately finished when put in the background.</p>
<p>android.permission.SET_ANIMATION_SCALE<br />
修改全局信息比例(Modify the global animation scaling factor.)</p>
<p>android.permission.SET_DEBUG_APP<br />
配置一个程序用于调试(Configure an application for debugging.)</p>
<p>android.permission.SET_ORIENTATION<br />
允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation (actually rotation) of the screen.)</p>
<p>android.permission.SET_PREFERRED_APPLICATIONS<br />
允许一个程序修改列表参数PackageManager.addPackageToPreferred() 和PackageManager.removePackageFromPreferred()方法(Allows an application to modify the list of preferred applications with the PackageManager.addPackageToPreferred() and PackageManager.removePackageFromPreferred() methods.)</p>
<p>android.permission.SET_PROCESS_FOREGROUND<br />
允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.)</p>
<p>android.permission.SET_PROCESS_LIMIT<br />
允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. )</p>
<p>android.permission.SET_TIME_ZONE<br />
允许程序设置时间区域(Allows applications to set the system time zone)</p>
<p>android.permission.SET_WALLPAPER<br />
允许程序设置壁纸(Allows applications to set the wallpaper )</p>
<p>android.permission.SET_WALLPAPER_HINTS<br />
允许程序设置壁纸hits(Allows applications to set the wallpaper hints)</p>
<p>android.permission.SIGNAL_PERSISTENT_PROCESSES<br />
允许程序请求发送信号到所有显示的进程中(Allow an application to request that a signal be sent to all persistent processes)</p>
<p>android.permission.STATUS_BAR<br />
允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.</p>
<p>android.permission.SUBSCRIBED_FEEDS_READ<br />
允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. )</p>
<p>android.permission.SUBSCRIBED_FEEDS_WRITE<br />
系统暂时保留改设置,android开发网认为未来版本会加入该功能。</p>
<p>android.permission.SYSTEM_ALERT_WINDOW<br />
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT，显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )</p>
<p>android.permission.VIBRATE<br />
允许访问振动设备(Allows access to the vibrator)</p>
<p>android.permission.WAKE_LOCK<br />
允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming)</p>
<p>android.permission.WRITE_APN_SETTINGS<br />
允许程序写入API设置(Allows applications to write the apn settings)</p>
<p>android.permission.WRITE_CALENDAR<br />
允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )</p>
<p>android.permission.WRITE_CONTACTS<br />
允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. )</p>
<p>android.permission.WRITE_GSERVICES<br />
允许程序修改Google服务地图(Allows an application to modify the Google service map. )</p>
<p>android.permission.WRITE_OWNER_DATA<br />
允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.)</p>
<p>android.permission.WRITE_SETTINGS<br />
允许程序读取或写入系统设置(Allows an application to read or write the system settings. )</p>
<p>android.permission.WRITE_SMS<br />
允许程序写短信(Allows an application to write SMS messages)</p>
<p>android.permission.WRITE_SYNC_SETTINGS<br />
允许程序写入同步设置(Allows applications to write the sync settings)</p>
<p>android平台上的权限许可分得很细，如果软件无法正常执行时看看是不是缺少相关的permission声明，最终我们还需要使用 android sign tools签名生成的apk文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20091206/android-permission-all.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>嵌入式编程感想：会用C语言的是真男人!(转自csdn)</title>
		<link>http://www.liulang.cq.cn/20090916/c.html</link>
		<comments>http://www.liulang.cq.cn/20090916/c.html#comments</comments>
		<pubDate>Wed, 16 Sep 2009 04:05:15 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=145</guid>
		<description><![CDATA[几个月前笔者跟两个年轻企业家在巴尔的摩吃了顿愉快的午餐，这两个年轻人最近才从霍普金斯大学(Johns HopkinsUniversity)计算机科学系毕业，创办了一家业绩快速成长的顾问公司；他们的公司擅长以一种称为Ruby on Rails(又称Ruby)的语言，撰写以网页为中心的数据库(web-centric databases)软件。我们边吃饭边谈一些工作上的话题，其中一个年轻人下了个令我难忘的评论：“用C语言写程序是真正的男人！”这句话是他跟同学在将可用的编程语言进行分类时所发明的；而即使优秀如他，也当场承认他不符合以上“真正的男人”条件。看来，这句话不仅反映了C语言的高难度，也显示对较年轻的设计工程师来说，C语言真的不好掌握。
对现代的计算机科系学生来说，学习C语言就像选修一门用拉丁文来上的课那样；但C语言并不是已经过时的设计语言，且在方兴未艾的嵌入式软件开发领域维持着主导地位。下面的图一是美国版EETimes子网站Embedded Systems Design十三年来针对嵌入式软件所应用之设计语言的调查统计表。

图1
从图一可看出，C语言在1997~2009年之间都是嵌入式软件开发使用最多的语言；近五年来，C与C++语言更瓜分了大部分原属汇编语言(assembly)的版图，其中较高阶的C++发展速度虽不如预期，但仍在嵌入式软件设计领域维持27%左右的占有率。整体看来，C++语言使用率在90年代晚期加速上升，在2001年达到高峰，然后稍微下滑、之后维持稳定。
无论如何，嵌入式软件设计师不会在短时间内放弃使用C语言，原因有很多个：首先，C语言编译器支持大多数的8位、16位与32位CPU；其次，C语言在处理器与驱动程序层级，兼具高低级语言的特色。
当然，如果仅获得一小群人数逐渐减少的程序设计师支持，C语言难以继续作为重要的设计语言而存活；而既然C语言仍然如此重要，也意味着嵌入式软件设计师并不会减少。目前每年新上市的CPU有98%都是嵌入式的，这类新型CPU的长期发展性也非常乐观。图二显示美国那斯达克指数与新CPU出货量变化的消长关系。

图1
嵌入式软件设计教育断层
但在C语言在全世界各地的重要性日益增加的同时，学校里却越来越少学生愿意去学如何使用该种设计语言；这反映了嵌入式系统设计领域日益严重的「教育断层」问题。美国的高等教育机构在提供实用的、嵌入式软件设计必备的技能教育方面非常失败，相关开发技巧非得在工作岗位上才能学得到。

图3
从图三可以看出，在电子工程相关科系，只有一小部分课程是与嵌入式软件开发有关的；而计算机科学系所提供的嵌入式软件开发相关课程也只多一点点。现在有不少美国大学虽提供额外的计算机工程学分，但大多数还是来自现有电子工程、计算机科学系的课程与教授，并没有太多有关嵌入式软件开发的新内容。而在职训练也很少提供嵌入式软件开发课程。
如果以上我所举出的，有关C语言将在可见的未来继续保有重要性、特别是在嵌入式软件设计领域的种种证据属实，那麻烦就真的大了──因为现在的年轻程序设计师虽然都很聪明，他们恐怕不知道该如何使用C语言写程序，甚至不想学。
总有人得写那些需求量越来越大的嵌入式软件──新一代设计语言可能帮得上忙，却无法支持所有那些发展资历已数十年、未来数十年也会继续被应用的CPU架构；既然这样的趋势难以避免，我们这个圈子需要培育年轻一代的C语言程序设计师。但该怎么做呢？若状况持续发展下去，又会产生怎样的结果？
【备注】我确信那位年轻人并没有性别歧视，「真正的女人」当然也会使用C语言！
(参考原文：Real men program in C，by Michael Barr，本文作者为嵌入式系统设计领域的专家，目前经营一家嵌入式系统顾问公司Netrino) 
]]></description>
			<content:encoded><![CDATA[<p>几个月前笔者跟两个年轻<span onclick="tagshow(event)">企业</span>家在巴尔的摩吃了顿愉快的午餐，这两个年轻人最近才从霍普金斯大学(Johns HopkinsUniversity)计算机科学系毕业，创办了一家业绩快速成长的顾问公司；他们的公司擅长以一种称为Ruby on Rails(又称Ruby)的语言，撰写以网页为中心的数据库(web-centric databases)软件。我们边吃饭边谈一些工作上的话题，其中一个年轻人下了个令我难忘的评论：“用C语言写程序是真正的男人！”这句话是他跟同学在将可用的编程语言进行分类时所发明的；而即使优秀如他，也当场承认他不符合以上“真正的男人”条件。看来，这句话不仅反映了C语言的高难度，也显示对较年轻的<span onclick="tagshow(event)">设计</span><span onclick="tagshow(event)">工程师</span>来说，C语言真的不好掌握。<span id="more-145"></span><br />
对现代的计算机科系学生来说，学习C语言就像选修一门用拉丁文来上的课那样；但C语言并不是已经过时的设计语言，且在方兴未艾的嵌入式<a href="http://www.eetchina.com/SEARCH/ART/%C8%ED%BC%FE%BF%AA%B7%A2.HTM" target="_blank">软件开发</a>领域维持着主导地位。下面的图一是美国版EETimes子网站Embedded Systems Design十三年来针对嵌入式软件所应用之设计语言的调查统计表。</p>
<p align="center"><img id="img_0.18412698801691102" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_1.jpg" alt="" width="500" height="248" /><br />
图1</p>
<p>从图一可看出，C语言在1997~2009年之间都是嵌入式软件开发使用最多的语言；近五年来，C与C++语言更瓜分了大部分原属汇编语言(assembly)的版图，其中较高阶的C++<span onclick="tagshow(event)">发展</span>速度虽不如预期，但仍在嵌入式软件设计领域维持27%左右的占有率。整体看来，C++语言使用率在90年代晚期加速上升，在2001年达到高峰，然后稍微下滑、之后维持稳定。</p>
<p>无论如何，嵌入式软件设计师不会在短时间内放弃使用C语言，原因有很多个：首先，C语言编译器支持大多数的8位、16位与32位CPU；其次，C语言在处理器与驱动程序层级，兼具高低级语言的特色。<br />
当然，如果仅获得一小群人数逐渐减少的程序设计师支持，C语言难以继续作为重要的设计语言而存活；而既然C语言仍然如此重要，也意味着嵌入式软件设计师并不会减少。目前每年新上市的CPU有98%都是嵌入式的，这类新型CPU的长期发展性也非常乐观。图二显示美国那斯达克指数与新CPU出货量变化的消长关系。</p>
<p align="center"><img id="img_0.5899680351830119" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_2.jpg" alt="" width="500" height="322" /><br />
图1</p>
<p><strong>嵌入式软件设计教育断层</strong><br />
但在C语言在全世界各地的重要性日益增加的同时，学校里却越来越少学生愿意去学如何使用该种设计语言；这反映了嵌入式系统设计领域日益严重的「教育断层」问题。美国的高等教育机构在提供实用的、嵌入式软件设计必备的技能教育方面非常失败，相关开发技巧非得在工作岗位上才能学得到。</p>
<p align="center"><img id="img_0.7748926879695955" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_3.jpg" alt="" width="500" height="345" /><br />
图3</p>
<p>从图三可以看出，在电子工程相关科系，只有一小部分课程是与嵌入式软件开发有关的；而计算机科学系所提供的嵌入式软件开发相关课程也只多一点点。现在有不少美国大学虽提供额外的计算机工程学分，但大多数还是来自现有电子工程、计算机科学系的课程与教授，并没有太多有关嵌入式软件开发的新内容。而在职训练也很少提供嵌入式软件开发课程。</p>
<p>如果以上我所举出的，有关C语言将在可见的未来继续保有重要性、特别是在嵌入式软件设计领域的种种证据属实，那麻烦就真的大了──因为现在的年轻程序设计师虽然都很聪明，他们恐怕不知道该如何使用C语言写程序，甚至不想学。<br />
总有人得写那些<span onclick="tagshow(event)">需求</span>量越来越大的嵌入式软件──新一代设计语言可能帮得上忙，却无法支持所有那些发展资历已数十年、未来数十年也会继续被应用的CPU架构；既然这样的趋势难以避免，我们这个圈子需要培育年轻一代的C语言程序设计师。但该怎么做呢？若状况持续发展下去，又会产生怎样的结果？<br />
【备注】我确信那位年轻人并没有性别歧视，「真正的女人」当然也会使用C语言！<br />
(参考原文：<a href="http://www.embedded.com/columns/barrcode/218600142?printable=true" target="_blank">Real men program in C</a>，by Michael Barr，本文作者为嵌入式系统设计领域的专家，目前经营一家嵌入式系统顾问公司Netrino)<span id="_marker"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090916/c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Palm Pre (Mojo SDK)开发环境的搭建</title>
		<link>http://www.liulang.cq.cn/20090909/palmprewebo.html</link>
		<comments>http://www.liulang.cq.cn/20090909/palmprewebo.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 02:40:44 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=139</guid>
		<description><![CDATA[Palm Pre (Mojo SDK)开发环境的搭建:(Web OS视频)
http://www.boobooke.com/v/bbk3424

]]></description>
			<content:encoded><![CDATA[<p>Palm Pre (Mojo SDK)开发环境的搭建:(Web OS视频)</p>
<p><a style="word-wrap: break-word; color: #006699; text-decoration: none; line-height: normal;" title="点击观看" href="http://www.boobooke.com/v/bbk3424" target="_blank">http://www.boobooke.com/v/bbk3424</a></p>
<p><embed src="http://a.alimama.cn/widget/yr1/yr1fixed_468_60.swf" flashvars="catid=&#038;count=20&#038;sz=12&#038;type=2&#038;i=mm_14126698_0_0" width="468" height="60" quality="high" wmode="transparent" bgcolor="#ffffff" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090909/palmprewebo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web OS体验安装视频</title>
		<link>http://www.liulang.cq.cn/20090908/webosinstal.html</link>
		<comments>http://www.liulang.cq.cn/20090908/webosinstal.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 08:31:20 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=135</guid>
		<description><![CDATA[欢迎收看：
Web OS体验及安装环境视频讲解
http://www.boobooke.com/v/bbk3423/
]]></description>
			<content:encoded><![CDATA[<p>欢迎收看：</p>
<p>Web OS体验及安装环境视频讲解</p>
<p><a href="http://www.boobooke.com/v/bbk3423/" target="_blank">http://www.boobooke.com/v/bbk3423/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090908/webosinstal.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android的adb命令使用</title>
		<link>http://www.liulang.cq.cn/20090810/androidadbcmd.html</link>
		<comments>http://www.liulang.cq.cn/20090810/androidadbcmd.html#comments</comments>
		<pubDate>Mon, 10 Aug 2009 14:39:39 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=88</guid>
		<description><![CDATA[
adb(Android Debug Bridge)是Android 提供的一个通用的调试工具，借助这个工具，我们可以管理设备或手机 模拟器 的状态 。还可以进行以下的操作：
1、快速更新设备或手机模拟器中的代码，如应用或Android系统升级；
2、在设备上运行shell命令；

3、管理设备或手机模拟器上的预定端口；
4、在设备或手机模拟器上复制或粘贴文件；
以下为一些常用的操作：
1、安装 应用到模拟器：
adb install
比较遗憾的是，Android并没有提供一个卸载 应用的命令，只能自己手动删除 ：
adb shell
cd /data/app
rm app.apk
2、进入设备或模拟器的shell：
adb shell
通过上面的命令，就可以进入设备或模拟器的shell环境中，在这个Linux Shell中，你可以执行各种Linux 的命令，另外如果只想执行一条shell命令，可以采用以下的方式：
adb shell [command]
如：adb shell dmesg会打印出内核的调试信息。
3、发布端口：
可以设置任意的端口号，做为主机 向模拟器或设备的请求端口。如：
adb forward tcp:5555 tcp:8000
4、复制文件 ：
可向一个设备或从一个设备中复制文件，
复制一个文件或目录到设备或模拟器上：
adb push
如：adb push test.txt /tmp/test.txt
从设备或模拟器上复制一个文件或目录：
adb pull
如：adb pull /addroid/lib/libwebcore.so .
5、搜索模拟器/设备的实例：
取得当前运行的模拟器/设备的实例的列表及每个实例的状态：
adb devices
6、查看bug报告：
adb bugreport
7、记录无线通讯日志：
一般来说，无线通讯的日志非常多，在运行时没必要去记录，但我们还是可以通过命令，设置记录：
adb shell
logcat -b radio
8、获取设备的ID和序列号：
adb get-product
adb get-serialno
9、访问数据库SQLite3
adb shell
sqlite3
10、通过gsm call命令可以像Android 模拟器打电话 ，除了在EclipseADT 的DDMS中通过按钮Dial外，还可以通过DDMS外壳调用gsm call命令直接拨打，我们首先需要启动AndroidEmulator，然后在cmd环境下执行telnet localhost 5554 下面就可以向Android模拟器 拨号，参数为gsmcall &#60; phoneNum&#62; ，比如给10086打电话 为gsm [...]]]></description>
			<content:encoded><![CDATA[<p><embed src="http://a.alimama.cn/widget/yr1/yr1fixed_468_60.swf" flashvars="catid=&#038;count=20&#038;sz=12&#038;type=2&#038;i=mm_14126698_0_0" width="468" height="60" quality="high" wmode="transparent" bgcolor="#ffffff" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></p>
<p>adb(Android Debug Bridge)是Android 提供的一个通用的调试工具，借助这个工具，我们可以管理设备或手机 模拟器 的状态 。还可以进行以下的操作：<br />
1、快速更新设备或手机模拟器中的代码，如应用或Android系统升级；<br />
2、在设备上运行shell命令；</p>
<p><span id="more-88"></span><br />
3、管理设备或手机模拟器上的预定端口；<br />
4、在设备或手机模拟器上复制或粘贴文件；</p>
<p>以下为一些常用的操作：<br />
1、安装 应用到模拟器：<br />
adb install<br />
比较遗憾的是，Android并没有提供一个卸载 应用的命令，只能自己手动删除 ：<br />
adb shell<br />
cd /data/app<br />
rm app.apk<br />
2、进入设备或模拟器的shell：<br />
adb shell<br />
通过上面的命令，就可以进入设备或模拟器的shell环境中，在这个Linux Shell中，你可以执行各种Linux 的命令，另外如果只想执行一条shell命令，可以采用以下的方式：<br />
adb shell [command]<br />
如：adb shell dmesg会打印出内核的调试信息。<br />
3、发布端口：<br />
可以设置任意的端口号，做为主机 向模拟器或设备的请求端口。如：<br />
adb forward tcp:5555 tcp:8000<br />
4、复制文件 ：<br />
可向一个设备或从一个设备中复制文件，<br />
复制一个文件或目录到设备或模拟器上：<br />
adb push<br />
如：adb push test.txt /tmp/test.txt<br />
从设备或模拟器上复制一个文件或目录：<br />
adb pull<br />
如：adb pull /addroid/lib/libwebcore.so .<br />
5、搜索模拟器/设备的实例：<br />
取得当前运行的模拟器/设备的实例的列表及每个实例的状态：<br />
adb devices<br />
6、查看bug报告：<br />
adb bugreport<br />
7、记录无线通讯日志：<br />
一般来说，无线通讯的日志非常多，在运行时没必要去记录，但我们还是可以通过命令，设置记录：<br />
adb shell<br />
logcat -b radio<br />
8、获取设备的ID和序列号：<br />
adb get-product<br />
adb get-serialno<br />
9、访问数据库SQLite3<br />
adb shell<br />
sqlite3</p>
<p>10、通过gsm call命令可以像Android 模拟器打电话 ，除了在EclipseADT 的DDMS中通过按钮Dial外，还可以通过DDMS外壳调用gsm call命令直接拨打，我们首先需要启动AndroidEmulator，然后在cmd环境下执行telnet localhost 5554 下面就可以向Android模拟器 拨号，参数为gsmcall &lt; phoneNum&gt; ，比如给10086打电话 为gsm call +10086</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090810/androidadbcmd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发环境搭建及第一个HelloWorld程序</title>
		<link>http://www.liulang.cq.cn/20090714/androidconfigandhelloworld.html</link>
		<comments>http://www.liulang.cq.cn/20090714/androidconfigandhelloworld.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:26:31 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=3</guid>
		<description><![CDATA[Android开发环境搭建
http://www.boobooke.com/v/bbk2635
Android上第一个HelloWorld程序
http://www.boobooke.com/v/bbk2636
]]></description>
			<content:encoded><![CDATA[<p>Android开发环境搭建</p>
<p><a href="http://www.boobooke.com/v/bbk2635" target="_blank">http://www.boobooke.com/v/bbk2635</a></p>
<p>Android上第一个HelloWorld程序</p>
<p><a href="http://www.boobooke.com/v/bbk2636" target="_blank">http://www.boobooke.com/v/bbk2636</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090714/androidconfigandhelloworld.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
