<?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>不然你要我怎么样 &#187; Android</title>
	<atom:link href="http://www.xiangmocheng.com/category/android/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xiangmocheng.com</link>
	<description>彪悍的代码不需要注释</description>
	<lastBuildDate>Wed, 30 Nov 2011 11:47:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>使用gdb在Android Emulator中进行调试c程序</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-debug-c-program-in-android-emulator-by-gdb/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-debug-c-program-in-android-emulator-by-gdb/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 13:42:39 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[GDB]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e4%bd%bf%e7%94%a8gdb%e5%9c%a8android-emulator%e4%b8%ad%e8%bf%9b%e8%a1%8c%e8%b0%83%e8%af%95c%e7%a8%8b%e5%ba%8f.html</guid>
		<description><![CDATA[参考文章：Debug Native c/c++ Application for Android(Step by Step) 和Google Android Debugging Utilities 首先，我们需要一个含有调试信息的exe文件，一般这个文件存在于out/target/product/generic/obj/EXECUTABLES/yourexefile_intermediates/LINKED/libomstts目录下，这里以我们前面文章中生成的helloworld为例。 1. 下载Android Debugging Utilities gdb and gdb-server (6.8) 2. 启动Android Emulator模拟器 $ emulator @1.5_R2 3. 把gdb和调试文件以及源代码放到模拟器上 $ adb push gdb /data/bin $ adb push helloworld /data/bin 以helloworld为例，源代码要放在/data/bin/development/hello目录下。 有的文章说将以上文件放在/system/bin目录下，但后果是一旦关掉模拟器，这些的文件就消失了，下次又要重传~所以推荐放在/data/bin目录下。 4. 启动shell $adb shell 如果提示文件系统不可写的话，执行： ＃mount -o remount 5. 因为Android文件系统没有/bin/sh, 所以这里有两种解决方法（推荐第二种方法）： (1). 拷贝一个bash文件(点击下载)到/bin目录下： #mkdir [...]]]></description>
			<content:encoded><![CDATA[<p>参考文章：<a href="http://www.cppblog.com/luonjtu/archive/2009/02/19/74310.html" target="_blank">Debug Native c/c++ Application for Android(Step by Step)</a></p>
<p>和<a href="http://ortegaalfredo.googlepages.com/android" target="_blank">Google Android Debugging Utilities</a></p>
<p>首先，我们需要一个含有调试信息的exe文件，一般这个文件存在于out/target/product/generic/obj/EXECUTABLES/<span style="color: #ff0000;">yourexefile</span>_intermediates/LINKED/libomstts目录下，这里以我们<a title="【转贴】Android编译环境(1) – 编译Native C的helloworld模块" href="http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module/" target="_blank">前面文章</a>中生成的helloworld为例。</p>
<p>1. 下载Android Debugging Utilities</p>
<p><a href="http://ortegaalfredo.googlepages.com/android-gdb-6.8.tar.bz2" target="_blank">gdb and gdb-server (6.8)</a></p>
<p>2. 启动Android Emulator模拟器</p>
<p>$ emulator @1.5_R2</p>
<p>3. 把gdb和调试文件以及源代码放到模拟器上</p>
<p>$ adb push gdb /data/bin</p>
<p>$ adb push helloworld /data/bin</p>
<p>以helloworld为例，源代码要放在/data/bin<span style="color: #ff0000;">/development/hello</span>目录下。</p>
<p>有的文章说将以上文件放在/system/bin目录下，但后果是一旦关掉模拟器，这些的文件就消失了，下次又要重传~所以推荐放在/data/bin目录下。</p>
<p>4. 启动shell</p>
<p>$adb shell</p>
<p>如果提示文件系统不可写的话，执行：</p>
<p>＃mount -o remount</p>
<p>5. 因为Android文件系统没有/bin/sh, 所以这里有两种解决方法（推荐第二种方法）：</p>
<p>(1). 拷贝一个bash文件(<a href="http://www.xiangmocheng.com/downloads/bash.tar.bz2" target="_blank">点击下载</a>)到/bin目录下：</p>
<p>#mkdir /bin</p>
<p>$adb push bash /bin</p>
<p>(2). 或者设置SHELL的路径：</p>
<p>#export SHELL=/system/bin/sh</p>
<p>6. 进入/data/bin目录，运行gdb，可以开始调试程序了</p>
<p>#cd /data/bin</p>
<p>#./gdb helloworld
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-debug-c-program-in-android-emulator-by-gdb/">使用gdb在Android Emulator中进行调试c程序</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-debug-c-program-in-android-emulator-by-gdb/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>【转贴】Android编译环境(2) &#8211; 手工编译C模块</title>
		<link>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module-manually/</link>
		<comments>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module-manually/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 12:51:46 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Native]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91android%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%832-%e6%89%8b%e5%b7%a5%e7%bc%96%e8%af%91c%e6%a8%a1%e5%9d%97.html</guid>
		<description><![CDATA[原文点击这里 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Android编译环境提供了”showcommands”选项来显示编译命令行，我们可以通过打开这个选项来查看一些编译时的细节。当然，在这之前要把上一篇中的helloworld模块clean: # make clean-helloworld 上面的“make clean-$(LOCAL_MODULE)”是Android编译环境提供的make clean的方式。 接下来使用showcommands选项重新编译helloworld: # make helloworld showcommands build/core/product_config.mk:229: WARNING: adding test OTA key target thumb C: helloworld &#60;= development/hello/hello.c prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc  -I system/core/include   -I hardware/libhardware/include   -I hardware/ril/include   -I dalvik/libnativehelper/include   -I frameworks/base/include   -I external/skia/include   -I out/target/product/generic/obj/include   -I bionic/libc/arch-arm/include   -I bionic/libc/include   -I bionic/libstdc++/include   -I bionic/libc/kernel/common   -I bionic/libc/kernel/arch-arm   -I bionic/libm/include   -I bionic/libm/include/arch/arm   [...]]]></description>
			<content:encoded><![CDATA[<p>原文点击<a href="http://www.top-e.org/jiaoshi/html/?161.html" target="_blank">这里</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Android编译环境提供了”showcommands”选项来显示编译命令行，我们可以通过打开这个选项来查看一些编译时的细节。当然，在这之前要把上一篇中的helloworld模块clean:</p>
<p># make clean-helloworld</p>
<p>上面的“make clean-$(LOCAL_MODULE)”是Android编译环境提供的make clean的方式。</p>
<p>接下来使用showcommands选项重新编译helloworld:</p>
<table class="MsoTableGrid" style="border: medium none; margin: auto auto auto 23.4pt; background: none repeat scroll 0% 0% #b3b3b3; width: 378pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="504">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 378pt; background-color: transparent;" width="504" valign="top">
<p># make helloworld showcommands</p>
<p>build/core/product_config.mk:229: WARNING: adding test OTA key</p>
<p>target thumb C: helloworld &lt;= development/hello/hello.c</p>
<p>prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc  -I system/core/include   -I hardware/libhardware/include   -I hardware/ril/include   -I dalvik/libnativehelper/include   -I frameworks/base/include   -I external/skia/include   -I out/target/product/generic/obj/include   -I bionic/libc/arch-arm/include   -I bionic/libc/include   -I bionic/libstdc++/include   -I bionic/libc/kernel/common   -I bionic/libc/kernel/arch-arm   -I bionic/libm/include   -I bionic/libm/include/arch/arm   -I bionic/libthread_db/include   -I development/hello   -I out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates  -c  -fno-exceptions<br />
-Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic<br />
-mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector<br />
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__<br />
-include system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID<br />
-fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG -O2 -g<br />
-Wstrict-aliasing=2 -finline-functions<br />
-fno-inline-functions-called-once -fgcse-after-reload<br />
-frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os<br />
-fomit-frame-pointer -fno-strict-aliasing -finline-limit=64      -MD -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o development/hello/hello.c</p>
<p>target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)</p>
<p>prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++<br />
-nostdlib -Bdynamic -Wl,-T,build/core/armelf.x<br />
-Wl,-dynamic-linker,/system/bin/linker -Wl,&#8211;gc-sections<br />
-Wl,-z,nocopyreloc -o<br />
out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld<br />
-Lout/target/product/generic/obj/lib<br />
-Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lstdc++ -lm  out/target/product/generic/obj/lib/crtbegin_dynamic.o         out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o       -Wl,&#8211;no-undefined<br />
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a<br />
out/target/product/generic/obj/lib/crtend_android.o</p>
<p>target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)</p>
<p>out/host/linux-x86/bin/acp<br />
-fpt<br />
out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld<br />
out/target/product/generic/symbols/system/bin/helloworld</p>
<p>target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)</p>
<p>out/host/linux-x86/bin/soslim<br />
&#8211;strip &#8211;shady &#8211;quiet<br />
out/target/product/generic/symbols/system/bin/helloworld &#8211;outfile<br />
out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld</p>
<p>Install: out/target/product/generic/system/bin/helloworld</p>
<p>out/host/linux-x86/bin/acp<br />
-fpt<br />
out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld<br />
out/target/product/generic/system/bin/helloworld</td>
</tr>
</tbody>
</table>
<p>从上面的命令行可以看到，Android编译环境所用的交叉编译工具链是prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc，-I和-L参数指定了所用的C库头文件和动态库文件路径分别是bionic/libc/include 和out/target/product/generic/obj/lib，其他还包括很多编译选项以及-D所定义的预编译宏。</p>
<p>我们可以利用上面的编译命令，稍加简化来手工编译helloworld程序。先手工删除上次编译得到的helloworld程序：</p>
<table class="MsoTableGrid" style="border: medium none; margin: auto auto auto 23.4pt; background: none repeat scroll 0% 0% #b3b3b3; width: 378pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="504">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 378pt; background-color: transparent;" width="504" valign="top">
<p># rm out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o</p>
<p># rm out/target/product/generic/system/bin/helloworld</td>
</tr>
</tbody>
</table>
<p>再用gcc编译，生成目标文件：</p>
<table class="MsoTableGrid" style="border: medium none; margin: auto auto auto 23.4pt; background: none repeat scroll 0% 0% #b3b3b3; width: 378pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="504">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 378pt; background-color: transparent;" width="504" valign="top">#<br />
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -I<br />
bionic/libc/arch-arm/include -I bionic/libc/include -I<br />
bionic/libc/kernel/common   -I bionic/libc/kernel/arch-arm -c  -fno-exceptions<br />
-Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic<br />
-mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector<br />
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__<br />
-include system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID<br />
-fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG -O2 -g<br />
-Wstrict-aliasing=2 -finline-functions<br />
-fno-inline-functions-called-once -fgcse-after-reload<br />
-frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os<br />
-fomit-frame-pointer -fno-strict-aliasing -finline-limit=64      -MD -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o development/hello/hello.c</td>
</tr>
</tbody>
</table>
<p>与Android.mk编译参数比较，上面主要减少了不必要的-I参数。</p>
<p>接下来生成可执行文件：</p>
<table class="MsoTableGrid" style="border: medium none; margin: auto auto auto 23.4pt; background: none repeat scroll 0% 0% #b3b3b3; width: 378pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="504">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 378pt; background-color: transparent;" width="504" valign="top">#<br />
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -nostdlib<br />
-Bdynamic -Wl,-T,build/core/armelf.x<br />
-Wl,-dynamic-linker,/system/bin/linker -Wl,&#8211;gc-sections<br />
-Wl,-z,nocopyreloc -o<br />
out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld<br />
-Lout/target/product/generic/obj/lib<br />
-Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lm  out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o<br />
out/target/product/generic/obj/lib/crtbegin_dynamic.o<br />
-Wl,&#8211;no-undefined<br />
./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a<br />
out/target/product/generic/obj/lib/crtend_android.o</td>
</tr>
</tbody>
</table>
<p>这里值得留意的是参数“-Wl,-dynamic-linker,/system/bin/linker”，它指定了Android专用的动态链接器/system/bin/linker，而不是通常所用的ld.so。</p>
<p>生成的可执行程序可用file和readelf命令来查看一下：</p>
<table class="MsoTableGrid" style="border: medium none; margin: auto auto auto 23.4pt; background: none repeat scroll 0% 0% #b3b3b3; width: 378pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="504">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 378pt; background-color: transparent;" width="504" valign="top">
<p># file out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld</p>
<p>out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld:<br />
ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked<br />
(uses shared libs), not stripped</p>
<p>#  readelf -d out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld |grep NEEDED</p>
<p>0&#215;00000001 (NEEDED)                     Shared library: [libc.so]</p>
<p>0&#215;00000001 (NEEDED)                     Shared library: [libm.so]</td>
</tr>
</tbody>
</table>
<p>这是ARM格式的动态链接可执行文件，运行时需要libc.so和libm.so。“not stripped”表示它还没被STRIP。嵌入式系统中为节省空间通常将编译完成的可执行文件或动态库进行STRIP，即去掉其中多余的符号表信息。在前面“make helloworld showcommands”命令的最后我们也可以看到，Android编译环境中使用了out/host/linux-x86/bin/soslim工具进行STRIP。</p>
<p>有关Android Toolchain的其他一些内容可参考：<a href="http://www.top-e.org/jiaoshi/html/?151.html" target="_self"><strong>Android Toolchain与Bionic Libc</strong></a></p>
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module-manually/">【转贴】Android编译环境(2) &#8211; 手工编译C模块</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module-manually/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转贴】Android编译环境(1) &#8211; 编译Native C的helloworld模块</title>
		<link>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module/</link>
		<comments>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 12:37:27 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Native]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91android%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%831-%e7%bc%96%e8%af%91native-c%e7%9a%84helloworld%e6%a8%a1%e5%9d%97.html</guid>
		<description><![CDATA[原文点击这里 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; Android 编译环境本身比较复杂，且不像普通的编译环境：只有顶层目录下才有Makefile文件，而其他的每个component都使用统一标准的 Android.mk. Android.mk文件本身是比较简单的，不过它并不是我们熟悉的Makefile，而是经过了Android自身编译系统的很多处理，因此要真正理清楚其中的联系还比较复杂，不过这种方式的好处在于，编写一个新的Android.mk来给Android增加一个新的Component会比较简单。编译Java程序可以直接采用Eclipse的集成环境来完成，这里就不重复了。我们主要针对C/C++来说明，下面通过一个小例子来说明，如何在Android 中增加一个C程序的Hello World： 1. 在$(YOUR_ANDROID)/development目录下创建hello目录，其中$(YOUR_ANDROID)指Android源代码所在的目录。 $ mkdir $(YOUR_ANDROID)/development/hello 2. 在$(YOUR_ANDROID)/development/hello/目录编写hello.c文件，hello.c的内容当然就是经典的HelloWorld程序： 3.在$(YOUR_ANDROID)/development/hello/目录编写Android.mk文件。这是Android Makefile的标准命名，不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法，针对helloworld程序的Android.mk文件内容如下： 注意上面LOCAL_SRC_FILES用来指定源文件，LOCAL_MODULE指定要编译的模块的名字，下一步骤编译时就要用到。include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件，如果想编译成动态库则可用BUILD_SHARED_LIBRARY，这些可以在$(YOUR_ANDROID)/build/core/config.mk查到。 4. 回到Android源代码顶层目录进行编译： # cd $(YOUR_ANDROID) &#38;&#38; make helloworld 注意make helloworld中的目标名helloworld就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下： target thumb C: helloworld &#60;= development/hello/hello.c target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld) target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld) target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld) Install: out/target/product/generic/system/bin/helloworld 5．如上面的编译结果所示，编译后的可执行文件存放在out/target/product/generic/system/bin/helloworld，通过”adb push”将它传送到模拟器上，再通过”adb shell”登录到模拟器终端，就可以执行了 转载请注明： 转载自不然你要我怎么样 本文链接地址: [...]]]></description>
			<content:encoded><![CDATA[<p>原文点击<a href="http://www.top-e.org/jiaoshi/html/?157.html" target="_blank">这里</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Android 编译环境本身比较复杂，且不像普通的编译环境：只有顶层目录下才有Makefile文件，而其他的每个component都使用统一标准的 Android.mk. Android.mk文件本身是比较简单的，不过它并不是我们熟悉的Makefile，而是经过了Android自身编译系统的很多处理，因此要真正理清楚其中的联系还比较复杂，不过这种方式的好处在于，编写一个新的Android.mk来给Android增加一个新的Component会比较简单。编译Java程序可以直接采用Eclipse的集成环境来完成，这里就不重复了。我们主要针对C/C++来说明，下面通过一个小例子来说明，如何在Android 中增加一个C程序的Hello World：</p>
<p>1. 在<strong>$(YOUR_ANDROID)/development</strong>目录下创建<strong>hello</strong>目录，其中<strong>$(YOUR_ANDROID)</strong>指Android源代码所在的目录。</p>
<p><strong>$ mkdir $(YOUR_ANDROID)/development/hello</strong></p>
<p>2. 在<strong>$(YOUR_ANDROID)/development/hello/</strong>目录编写<strong>hello.c</strong>文件，hello.c的内容当然就是经典的HelloWorld程序：</p>
<pre class="brush: cpp; title: ; notranslate">int main()
{
printf(&quot;Hello World!\n&quot;);
return 0;
}</pre>
<p>3.在<strong>$(YOUR_ANDROID)/development/hello/</strong>目录编写<strong>Android.mk</strong>文件。这是Android Makefile的标准命名，不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法，针对helloworld程序的Android.mk文件内容如下：</p>
<pre class="brush: cpp; title: ; notranslate">LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
hello.c

LOCAL_MODULE := helloworld
include $(BUILD_EXECUTABLE)</pre>
<p>注意上面LOCAL_SRC_FILES用来指定源文件，LOCAL_MODULE指定要编译的模块的名字，下一步骤编译时就要用到。include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件，如果想编译成动态库则可用BUILD_SHARED_LIBRARY，这些可以在<strong>$(YOUR_ANDROID)/build/core/config.mk</strong>查到。</p>
<p>4. 回到Android源代码顶层目录进行编译：</p>
<p><strong># cd $(YOUR_ANDROID) &amp;&amp; make helloworld</strong></p>
<p>注意make helloworld中的目标名helloworld就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下：</p>
<p><strong>target thumb C: helloworld &lt;= development/hello/hello.c<br />
target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)<br />
target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)<br />
target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)<br />
Install: out/target/product/generic/system/bin/helloworld</strong></p>
<p>5．如上面的编译结果所示，编译后的可执行文件存放在<strong>out/target/product/generic/system/bin/helloworld</strong>，通过”adb push”将它传送到模拟器上，再通过”adb shell”登录到模拟器终端，就可以执行了
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module/">【转贴】Android编译环境(1) &#8211; 编译Native C的helloworld模块</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/android-build-environment-how-to-compile-native-c-module/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【转贴】如何构建Android 1.5系统映像</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-build-android-system-image/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-build-android-system-image/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 12:33:21 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91%e5%a6%82%e4%bd%95%e6%9e%84%e5%bb%baandroid-15%e7%b3%bb%e7%bb%9f%e6%98%a0%e5%83%8f.html</guid>
		<description><![CDATA[本文转自William Hua的Blog，原文在此。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 上一篇文章讲到如何构建Android的kernel映像，我们都知道，系统要运行起来光有kernel映像是不够的，今天我就来说一说如何构建Android的系统映像。 请先参考如何取得Android源代码一文，通过repo来取得当前最新的android主线代码（或者拿名为android-SDK-1.5_r1的tag也无妨）。 1、Host OS编译环境准备 在取得android源代码和编译内核的过程中，我们已经至少安装了cURL、 git-core、ncurses-dev、 build-essential等软件包（Python2.5已经捆绑在Ubuntu8.04中），不过这还不够，要完成Android代码树的编译，我 们还需要flex、bison、gperf、valgrind(可选)、libsdl-dev、libesd0-dev、libwxgtk2.6- dev、zlib1g-dev等软件包，好在apt-get可以帮我们一次搞定。 sudo apt-get install flex bison gperf valgrind libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev 另外，编译过程中还需要用到JDK 5.0（注意JDK6.0不被支持），请到Sun的官方网站下载后安装。 2、工具链和环境变量 把JDK5.0加进$PATH，如： $export PATH=$PATH:/home/william/jdk5.0/bin 然后可以用java -version来确认java的版本 除此之外，编译内核所作的环境变量和工具链的设置在编译系统映像时并不需要，这都由android的编译脚本搞定了。 3、关于编译选项 在build/core目录下的envsetup.mk定义了target的体系结构和OS，默认为arm和linux，我们暂时不涉及移植，所以不需要修改。 4、开始编译 做完上面的准备，在代码树的根目录下敲make就可以了，编译的过程大约需要持续1~2个小时，总计需要大约3.5G的可用空间。 5、测试生成的image 编译完成以后如果想在模拟器中运行，除了kernel的映像文件以外，所需的其他3个映像文件分别是：（位于out/target/product/generic/目录） ramdisk.img: 包含了在模拟器中启动Android所需的文件系统 system.img: 初始的Android系统映像，包含了程序和库文件 userdata.img: 初始的用户数据映像文件 模拟器会首先到指定的AVD所在的目录查找是否有userdata映像存在，如果没有的话就会基于初始的userdata.img来创建一个，加载这3个 映像文件后，它会把system.img和userdata.img分别挂载载到ramdisk文件系统中的system和userdata目录下。所有 的用户数据都会被保存在AVD目录下的userdata-qemu.img中，初始的用户数据映像文件并不会被修改。 通过命令行参数启动模拟器，加载我们编译的系统映像的方法： 首先设定ANDROID_PRODUCT_OUT环境变量，指向out/target/product/generic/目录（Update:实验证明这一步是没有必要的），然后运行 emulator @1.5_L2 -system system.img -ramdisk ramdisk.img [...]]]></description>
			<content:encoded><![CDATA[<p>本文转自<a href="http://www.williamhua.com/" target="_blank">William Hua的Blog</a>，原文<a href="http://www.williamhua.com/2009/04/30/how-to-build-android-15-system-image/" target="_blank">在此</a>。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>上一篇文章讲到<a href="http://www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/">如何构建Android的kernel映像</a>，我们都知道，系统要运行起来光有kernel映像是不够的，今天我就来说一说如何构建Android的系统映像。</p>
<p>请先参考<a href="http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/">如何取得Android源代码</a>一文，通过repo来取得当前最新的android主线代码（或者拿名为android-SDK-1.5_r1的tag也无妨）。</p>
<p><strong>1、Host OS编译环境准备</strong><br />
在取得android源代码和编译内核的过程中，我们已经至少安装了cURL、 git-core、ncurses-dev、<br />
build-essential等软件包（Python2.5已经捆绑在Ubuntu8.04中），不过这还不够，要完成Android代码树的编译，我<br />
们还需要flex、bison、gperf、valgrind(可选)、libsdl-dev、libesd0-dev、libwxgtk2.6-<br />
dev、zlib1g-dev等软件包，好在apt-get可以帮我们一次搞定。<br />
<strong>sudo apt-get install flex bison gperf valgrind libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev</strong></p>
<p>另外，编译过程中还需要用到JDK 5.0（注意JDK6.0不被支持），请到<a onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" href="http://java.sun.com/javase/downloads/index_jdk5.jsp">Sun的官方网站</a>下载后安装。</p>
<p><strong>2、工具链和环境变量</strong><br />
把JDK5.0加进$PATH，如：<br />
<strong>$export PATH=$PATH:/home/william/jdk5.0/bin</strong><br />
然后可以用java -version来确认java的版本</p>
<p><em>除此之外，编译内核所作的环境变量和工具链的设置在编译系统映像时并不需要，这都由android的编译脚本搞定了。</em></p>
<p><strong>3、关于编译选项</strong><br />
在build/core目录下的envsetup.mk定义了target的体系结构和OS，默认为arm和linux，我们暂时不涉及移植，所以不需要修改。</p>
<p><strong>4、开始编译</strong><br />
做完上面的准备，在代码树的根目录下敲make就可以了，编译的过程大约需要持续1~2个小时，总计需要大约3.5G的可用空间。</p>
<p><strong>5、测试生成的image</strong><br />
编译完成以后如果想在模拟器中运行，除了kernel的映像文件以外，所需的其他3个映像文件分别是：（位于out/target/product/generic/目录）<br />
<strong>ramdisk.img</strong>: 包含了在模拟器中启动Android所需的文件系统<br />
<strong>system.img</strong>: 初始的Android系统映像，包含了程序和库文件<br />
<strong>userdata.img</strong>: 初始的用户数据映像文件<br />
模拟器会首先到指定的AVD所在的目录查找是否有userdata映像存在，如果没有的话就会基于初始的userdata.img来创建一个，加载这3个<br />
映像文件后，它会把system.img和userdata.img分别挂载载到ramdisk文件系统中的system和userdata目录下。所有<br />
的用户数据都会被保存在AVD目录下的userdata-qemu.img中，初始的用户数据映像文件并不会被修改。</p>
<p>通过命令行参数启动模拟器，加载我们编译的系统映像的方法：<br />
<del datetime="2009-05-05T08:10:24+00:00">首先设定ANDROID_PRODUCT_OUT环境变量，指向out/target/product/generic/目录</del>（Update:实验证明这一步是没有必要的），然后运行<br />
<strong>emulator @1.5_L2 -system system.img -ramdisk ramdisk.img</strong><br />
或者我们加上-kernel参数，用自己编出来的kernel来启动</p>
<p>系统成功启动的截图：<br />
<img class="ngg-singlepic ngg-none" src="http://www.xiangmocheng.com/wp-content/gallery/2009/android-emulator.png" alt="android-emulator" /></p>
<p>编译Android系统映像虽然花费了不少的时间，不过总体来说还是比较简单的，Android的build system帮助我们搞定了大部分的设置。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-build-android-system-image/">【转贴】如何构建Android 1.5系统映像</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-build-android-system-image/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转贴】如何构建Android 1.5 Linux内核映像</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-build-android-linux-kernel-image/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-build-android-linux-kernel-image/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 12:30:02 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91%e5%a6%82%e4%bd%95%e6%9e%84%e5%bb%baandroid-15-linux%e5%86%85%e6%a0%b8%e6%98%a0%e5%83%8f.html</guid>
		<description><![CDATA[本文转自William Hua的Blog，原文在此。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 和一般的Linux系统开发流程一样，Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。本文的目的就在于构建出可以在Android自带的ARM QEMU模拟器上运行的内核映像，希望对于大家做内核的移植和系统构建有帮助。 请先参考我的另一篇文章如何取得Android源代码，确保正确地拿到了Android kernel/common项目的 Goldfish分支（该分支用于构建运行在emulator上的系统内核，而主线则是用于构建运行在实际设备上的内核代码）上的内核代码。另外，需要提 醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉编译编译，Windows并没有被支持，以下将以Ubuntu 8.04为Host OS来说明。 Android对Linux Kernel做了不少的改进，比如添加对yaffs2文件系统的支持，改进蓝牙的支持，改进电源管理机制，以及为模拟器版本添加的Goldfish平台等等，不过内核的编译方式和标准的kernel并没有区别。 这里唯一需要注意的是，Android 1.0_r2以后，整个项目的sourcecode就全部转移到git了，Google Code上不会再有更新，请确保从Git上拿到了android-goldfish-2.6.27分支上的内核代码。 1、在Host OS上准备编译环境 尽管很多人安装完Ubuntu后第一件事情就是装上build-essential，不过我在这里还是要提醒一下大家，另外做menuconfig的时候ncurses-devel库也是必须的。运行以下命令，一次搞定： sudo apt-get install build-essential ncurses-dev 2、准备交叉编译工具链 Android代码树中有一个prebuilt项目，包含了我们编译内核所需的交叉编译工具，如果你拿了完整的Android 1.5代码树，它就会在prebuilt目录下。如果没有拿完整的代码树也没有关系，只要用Git clone一个或者到从GitWeb下载一个prebuilt项目，如果是从GitWeb下载的话记得解压缩就行。 3、设定环境变量 把刚才下载的prebuilt中的arm-eabi编译器加入$PATH $export PATH=$PATH:/home/william/android-source/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin 设定目标arch为arm $export ARCH=arm 4、设定交叉编译参数 打开kernel目录下的Makefile文件，把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器 CROSS_COMPILE ?= arm-eabi- 把 LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ $(call ld-option, -Wl$(comma)–build-id,)) 这一行注释掉，并且添加一个空的LDFLAGS_BUILD_ID定义，如下: LDFLAGS_BUILD_ID = 下面的这段解释来自陈罡的blog 把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项，主要是用于在生成的elf可执行 文件中加入一个内置的id，这样在core [...]]]></description>
			<content:encoded><![CDATA[<p>本文转自<a href="http://www.williamhua.com/" target="_blank">William Hua的Blog</a>，原文<a href="http://www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/" target="_blank">在此</a>。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>和一般的Linux系统开发流程一样，Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。本文的目的就在于构建出可以在Android自带的ARM QEMU模拟器上运行的内核映像，希望对于大家做内核的移植和系统构建有帮助。</p>
<p>请先参考我的另一篇文章<a title="如何取得Android源代码" href="http://www.xiangmocheng.com/2009/06/how-to-get-android-source-code/">如何取得Android源代码</a>，确保正确地拿到了Android <a onclick="javascript:pageTracker._trackPageview('/outbound/article/android.git.kernel.org');" href="http://android.git.kernel.org/?p=kernel/common.git;a=summary">kernel/common项目</a>的<br />
Goldfish分支（该分支用于构建运行在emulator上的系统内核，而主线则是用于构建运行在实际设备上的内核代码）上的内核代码。另外，需要提<br />
醒一下大家的是Android的sourcecode目前只能在Linux或者Mac<br />
OS下做交叉编译编译，Windows并没有被支持，以下将以Ubuntu 8.04为Host OS来说明。</p>
<p>Android对Linux Kernel做了不少的改进，比如添加对yaffs2文件系统的支持，改进蓝牙的支持，改进电源管理机制，以及为模拟器版本添加的Goldfish平台等等，不过内核的编译方式和标准的kernel并没有区别。<br />
这里唯一需要注意的是，Android 1.0_r2以后，整个项目的sourcecode就全部转移到git了，<a onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');" href="http://code.google.com/p/android/">Google Code</a>上不会再有更新，请确保从Git上拿到了android-goldfish-2.6.27分支上的内核代码。</p>
<p><strong>1、在Host OS上准备编译环境</strong><br />
尽管很多人安装完Ubuntu后第一件事情就是装上build-essential，不过我在这里还是要提醒一下大家，另外做menuconfig的时候ncurses-devel库也是必须的。运行以下命令，一次搞定：<br />
<strong>sudo apt-get install build-essential ncurses-dev</strong></p>
<p><strong>2、准备交叉编译工具链</strong><br />
Android代码树中有一个prebuilt项目，包含了我们编译内核所需的交叉编译工具，如果你拿了完整的Android 1.5代码树，它就会在prebuilt目录下。如果没有拿完整的代码树也没有关系，只要用Git clone一个或者到从GitWeb下载一个<a onclick="javascript:pageTracker._trackPageview('/outbound/article/android.git.kernel.org');" href="http://android.git.kernel.org/?p=platform/prebuilt.git;a=summary">prebuilt项目</a>，如果是从GitWeb下载的话记得解压缩就行。</p>
<p><strong>3、设定环境变量</strong><br />
把刚才下载的prebuilt中的arm-eabi编译器加入$PATH<br />
<strong>$export PATH=$PATH:/home/william/android-source/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin</strong></p>
<p>设定目标arch为arm<br />
<strong>$export ARCH=arm </strong></p>
<p><strong>4、设定交叉编译参数</strong><br />
打开kernel目录下的Makefile文件，把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器<br />
<strong>CROSS_COMPILE ?= arm-eabi-</strong></p>
<p>把<br />
<strong>LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\<br />
$(call ld-option, -Wl$(comma)–build-id,))</strong><br />
这一行注释掉，并且添加一个空的LDFLAGS_BUILD_ID定义，如下:<br />
<strong>LDFLAGS_BUILD_ID = </strong><br />
下面的这段解释来自<a onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.chinaunix.net');" href="http://blog.chinaunix.net/u/26691/">陈罡的blog</a></p>
<blockquote><p>把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项，主要是用于在生成的elf可执行<br />
文件中加入一个内置的id，这样在core<br />
dump，或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免，每次都把整个文件做一遍效验，然后才能<br />
得到该文件的是由哪次build产生的。对于内核开发者来说，这是很不错的想法，可以节约定位模块版本和其影响的时间。目前，该功能还出于early<br />
stage的状态，未来的android或许会支持，但至少目前的版本是不支持的。<br />
对这个–build-id选项感兴趣的朋友，可以访问下面的网址，它的作者已经解释得非常明白了：</p>
<p>http://fedoraproject.org/wiki/Releases/FeatureBuildId</p></blockquote>
<p><strong>5、从1.5_r1捆绑的SDK中获得内核配置文件</strong><br />
大家都知道，内核编译中有一步make menuconfig，用于配置kernel，这里我们可以先获取官方的配置，如果必要的话再作改动。先启动模拟器，然后通过adb pull命令（该命令用于从设备上复制文件到本地）即可完成。<br />
<strong>$adb pull /proc/config.gz  ~/</strong><br />
现在我们用gunzip把config.gz解开，把得到的config文件移动到kernel source所在的目录，然后重命名为.config即可。<br />
<strong>$ gunzip config.gz<br />
$ mv config ~/sources/goldfish-kernel/.config</strong></p>
<p><strong>6、开始编译</strong><br />
因为我们之前已经吧1.5_r1中的.config复制到了kernel目录下，如果需要修改配置，可以使用<br />
<strong>make menuconfig</strong><br />
修改并保存配置，如果没有特殊需要的话就可以直接用<br />
<strong>make</strong><br />
命令来编译内核了</p>
<p><strong>7、测试生成的zImage</strong><br />
编译内核的过程应该很顺利，因为默认的配置对内核作了大幅的精简，大约5~6分钟就可以编译完成了，会在最终会在arch/arm/boot目录下面生成一个zImage，这个就是我们所要的运行在模拟器上的内核映像了。<br />
下面我们就在模拟器中测试一下我们所生成的zImage。<br />
<strong>emulator @1.5_L2 -kernel ./zImage</strong><br />
其中1.5_L2是我之前创建的<a onclick="javascript:pageTracker._trackPageview('/outbound/article/developer.android.com');" href="http://developer.android.com/guide/developing/tools/avd.html">AVD</a>，如果想输出kernel log，请加上-show-kernel参数。</p>
<p>一切顺利的话，我们应该可以看到Android顺利启动了。<br />
<img src="http://lh4.ggpht.com/_pq5z0vEqyaA/Sfl2kUFB9yI/AAAAAAAAB64/CpAx87np514/s576/new-kernel.gif" alt="" /></p>
<p>通过adb shell，我们可以查看version信息，如下图：<br />
<img src="http://lh3.ggpht.com/_pq5z0vEqyaA/SfkYdL7FDrI/AAAAAAAAB6k/u5ou4qkekKo/s576/version.png" alt="" /></p>
<p><strong>关于为实际设备编译kernel</strong><br />
如果要为一个实际的设备比如说G1重新编译内核映像，步骤和上述为一个运行在模拟器上的内核映像步骤基本一致，只是所需要的源代码应当来自主线而不是goldfish分支。另外，编译完成以后载入映像的方式也不同，需要通过USB将映像烧入nand flash。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-build-android-linux-kernel-image/">【转贴】如何构建Android 1.5 Linux内核映像</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-build-android-linux-kernel-image/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转贴】Android Building System 分析</title>
		<link>http://www.xiangmocheng.com/2009/06/android-building-system/</link>
		<comments>http://www.xiangmocheng.com/2009/06/android-building-system/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 01:48:08 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91android-building-system-%e5%88%86%e6%9e%90.html</guid>
		<description><![CDATA[by thinker，原文参见这里 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 想要了解一個系統，我常會從 makefile 或是 building system 下手，以了解系統組成元素為何? 目錄結構為何? 對於Android ，我也不例外。透過了解 building system，我們能知道如何新增、修改、刪除程式，並保有完整性，順利編譯出結果。 設定檔 Android building system包括幾種重要的設定檔， Android.mk AndroidProducts.mk target_-.mk, host_-.mk and -.mk BoardConfig.mk buildspec.mk Android.mk 是 module 和 package 的設定檔，每個 module/package的目錄下都會有一個 Android.mk。所謂的 module 是指系統的 native code ，相對於用 Java 寫成的 Androidapplication 稱為 package。 AndroidProducts.mk 則設定 product 配置。 product 即特定系統版本，透過編譯不同 product ，產生不同軟體配置內容，安裝不同的 application。Product 可視為特定專案，產生特定規格系統。 BoardConfig.mk [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: mceinline;"><span style="font-family: Verdana, Arial, Helvetica, sans-serif;">by thinker，</span>原文参见</span><a href="http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/393" target="_blank"><span style="font-family: mceinline;">这里</span></a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>想要了解一個系統，我常會從 makefile 或是 building system 下手，以了解系統組成元素為何? 目錄結構為何? 對於<a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a> ，我也不例外。透過了解 building system，我們能知道如何新增、修改、刪除程式，並保有完整性，順利編譯出結果。</p>
<p><span style="font-size: 21px; font-weight: bold;">設定檔</span></p>
<p><a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a> building system包括幾種重要的設定檔，</p>
<ul>
<li> <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk</li>
<li> AndroidProducts.mk</li>
<li> target_<os>-<arch>.mk, host_<os>-<arch>.mk and <os>-<arch>.mk</li>
<li> BoardConfig.mk</li>
<li> buildspec.mk</li>
</ul>
<p><a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 是 module 和 package 的設定檔，每個 module/package的目錄下都會有一個 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk。所謂的 module 是指系統的 native code ，相對於用 Java 寫成的 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>application 稱為 package。</p>
<p>AndroidProducts.mk 則設定 product 配置。 product 即特定系統版本，透過編譯不同 product ，產生不同軟體配置內容，安裝不同的 application。Product 可視為特定專案，產生特定規格系統。</p>
<p>BoardConfig.mk 是為 product 主板做設定，像是 driver 選擇、設定。*<os>-<arch>.mk 則是針對選擇的作業系統和 CPU 架構，進行相關設定。</p>
<p>buildspec.mk 是位於 source 根目錄下，為進行編譯者所做之額外設定。例如，可在此選擇要產生的 product 、平台、額外的 module/package 等。</p>
<p><span style="font-size: 21px; font-weight: bold;">參數</span></p>
<p>build/envsetup.sh 實作一個 mm 指令，以編譯單一 module，不需編譯整個 source tree。ONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用方法是在執行 make 時，將該變數指定為 module 的 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk。</p>
<ul>
<li> make ONE_SHOT_MAKEFILE=
<path to Androiod.mk></li>
</ul>
<p>透過定義 CREATE_MODULE_INFO_FILE ， building system 會將所有 module 資訊列在 $(PRODUCT_OUT)/module-info.txt 檔案裡。</p>
<ul>
<li> make CREATE_MODULE_INFO_FILE=true</li>
</ul>
<p>設定 BUILD_TINY_ANDROID=true ， building system 產生一個簡單的 image ，以測試硬體的可用度。此功能用於移植的早期階段，以快速 bring up 。</p>
<p>HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 產生 binary的目的為 debug 或 release 。透過設定此二變數，能產生包含 debug information的 binry 。</p>
<ul>
<li> debug</li>
<li> release</li>
</ul>
<p>這些參數，也可設於 buildspec.mk 裡，以避免開發過程不斷的重新指定。</p>
<h3>Goals</h3>
<p>一般編輯整個 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a> 系統，就是使用 droid 這個 goal。 droid 會產生一個完整的系統，包括 bootloader、kernel、系統程式、模組和<a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/%E6%87%89%E7%94%A8">應用</a>程式。</p>
<p>showcommands 和 droid 功能相同，但 droid 在編譯過程不顯示所使用的指令。透過 showcommands 這個 goal， building system 顯示過程中每一個步驟的詳細指令。</p>
<h2>Makefile 的流程</h2>
<ul>
<li> 初始化相關變數</li>
<li> 偵測編譯環境和目標環境</li>
<li> 決定目標 product</li>
<li> 讀取 product 的設定</li>
<li> 讀取 product 所指定之目標平台架構設定
<ul>
<li> 選擇 toolchain</li>
<li> 指定編譯參數 (*<os>-<arch>.mk)</li>
</ul>
</li>
<li> 清除輸出目錄</li>
<li> 設定/檢查版本編號</li>
<li> 讀取所有 BoardConfig.mk 檔案</li>
<li> 讀取所有 module 的設定</li>
<li> 根據設定，產生必需的 rule</li>
<li> 產生 image</li>
</ul>
<p>以上的主要流程都是由 build/core/main.mk 所安排。</p>
<h3>初始化和偵測</h3>
<p>由 build/core/config.mk 所進行。build/core/envsetup.mk 檢查 developer 的設定 (buildspec.mk) ，並檢查執行環境，以決定輸出目錄、項目。build/core/config.mk 本身還依據參數，決定解譯時的相關參數。像是 compiler的路徑、flags， lex 、yacc 的路徑參數等。</p>
<p>關於 product 的相關設定，則是由 build/core/product_config.mk 所處理，使用 build/core/product.mk 提供之 macro 載入。根據 AndroidProduct.mk 的內容，product_config.mk 決定了</p>
<ul>
<li> PRODUCT_TAGS</li>
<li> OTA_PUBLIC_KEYS</li>
<li> PRODUCT_POLICY</li>
<li> &#8230;&#8230;</li>
</ul>
<h3>Product 設定的讀取</h3>
<p><a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a> product 的設定來自於 build/target/product/AndroidProduct.mk 和vendor 子目錄下的 AndroidProduct.mk 。 building system 透過 find 指令，找出所有可能的 AndroidProduct.mk。 AndroidProduct.mk 裡定義PRODUCT_MAKEFILES 變數，列舉所有實際定義 product 的 makefile。</p>
<p>這些 makefile 各自定義獨立的 product 。product 相關參數，存成PRODUCTS.
<path of makefile>.<variable> 形式的變數。並將 makefile 路徑存在 PRODUCTS 變數。因此，透過 PRODUCTS 能取得所有的 product 路徑/名稱，並透過 PRODUCTS.
<path of makefile>.<variable> 形式的變數取得內容。</p>
<h3>Module 設定的讀取</h3>
<p>Module 是指 native code 的軟體元件，而 Java application 則被稱為 package。build/core/definitions.mk 定義 module/package 相關 macro ，讀取、檢查module/package 定義檔；分散 source tree 各處的 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 檔案。build/core/main.mk 使用 find 指令，在這些子目錄下找出所有 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk ，並將路徑存在 subdir_makefiles 變數裡。最後，include 這些檔案。</p>
<p>這些 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 會 include 定義成變數 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等，和其目的相配的 makefile。這些 makefile 會變 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 定義之內容，存成ALL_MODULES.
<path of <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk>.<variable> 形式。例如，<a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 定義了 LOCAL_MODULE_SUFFIX ，變會存成ALL_MODULES.
<path of <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk>.LOCAL_MODULE_SUFFIX 。而 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 路徑，當樣會存於 ALL_MODULES 變數裡。</p>
<p>Search <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 的路徑，基本上會是整個 source tree 。但會依特定的 goal ，選擇性只找尋特定目錄。例如 SDK 只需特定目錄下的 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 。</p>
<h3>Board Level 設定</h3>
<p>和目標平台主板相關之設定，例如使用了什麼裝置、driver 等，或是是否需要編譯bootloader 、 kernel 等，都是在BoardConfig.mk 裡設定。同樣，每張主板可以有不同設定，存在不同目錄下的 BoardConfig.mk ，以 find 尋找如下檔案:</p>
<ul>
<li> build/target/board/$(TARGET_DEVICE)/BoardConfig.mk</li>
<li> vendor/*/$(TARGET_DEVICE)/BoardConfig.mk</li>
</ul>
<p>TARGET_DEVICE 是 product 所定義，因此同一個 BoardConfig.mk 可被多個product 所使用。一個 TARGET_DEVICE ，通常只有一個 BoardConfig.mk 。BoardConfig.mk 會被直接 include 到 building system 的 name space 裡。因此，一些 module 的 enable/disable ，可以在 BoardConfig.mk 以對映不同的主板。</p>
<h3>Rules</h3>
<p>在 module 的定義檔 <a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a>.mk 裡，可定義 module 的 tag， LOCAL_MODULE_TAGS，以分類這些 module。每一個 product 可以指定需要的 tag (PRODUCT_TAGS)，使 building system只編譯標示這些 tag 的 module。在 build/core/main.mk 裡，所有標示特定 tag的 module 收集為 ALL_DEFAULT_INSTALLED_MODULES ，並 includebuild/core/Makefile 處理。build/core/Makefile 為這些 module 產生 rule ，並使產生 image 的 goal depend on這些 rule ，使這些 module 被編譯。</p>
<h2>結論</h2>
<p><a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android">Android</a> 的 building system 其實不是那麼複雜。在了解之後，也不是那麼難修改。但， GNU make 的一些語法，所 building system 使用一些不是那麼直覺的用法，使的 building system 較難了解。但，花點心思就能克服。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/android-building-system/">【转贴】Android Building System 分析</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/android-building-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发环境的建立(3)——获取Android源代码【转贴】</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-get-android-source-code/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-get-android-source-code/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 08:18:30 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/android%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e5%bb%ba%e7%ab%8b3%e2%80%94%e2%80%94%e8%8e%b7%e5%8f%96android%e6%ba%90%e4%bb%a3%e7%a0%81%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91.html</guid>
		<description><![CDATA[本文转自William Hua的Blog，原文在此。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; Git 是 Linux Torvalds 为了帮助管理 Linux内核开发而开发的一个开放源码的分布式版本控制软件，它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库（repository），许多个工作目录（working copy），而像Git这样的分布式版本控制系统中（其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等），每一个工作目录都包含一个完整仓库，它们可以支持离线工作，本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮，单服务器系统一旦服务器出现问题整个系统就不能运行了，分布式系统通常不会因为一两个节点而受到影响。 因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成，所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库，使得Git的使用更加简单。 这几天William为了拿Android最新的sourcecode，学习了一下git和repo的一些基本操作，整理了一个如何取得Android代码的How-To，今天把他贴上来。 1、Git的安装 在Ubuntu 8.04上安装git只要设定了正确的更新源，然后使用apt-get就可以了，有什么依赖问题，就让它自己解决吧。其中cURL是一个利用URL语法在命令行下工作的文件传输工具，会在后面安装Repo的时候用到。 sudo apt-get install git-core curl 2、安装Repo 首先确保在当前用户的主目录下创建一个/bin目录（如果没有的话），然后把它(~/bin)加到PATH环境变量中 接下来通过cURL来下载Repo脚本，保存到~/bin/repo文件中 curl http://android.git.kernel.org/repo &#62;~/bin/repo 别忘了给repo可执行权限 chmod a+x ~/bin/repo 3、初始化版本库 如果是想把Android当前主线上最新版本的所有的sourcecode拿下来，我们需要repo的帮助。 先建立一个目录，比如~/android，进去以后用repo init命令即可。 repo init -u git://android.git.kernel.org/platform/manifest.git 这个过程会持续很长的时间（至少可以好好睡一觉），具体要多少时间就取决于网络条件了（今天我尝试的时候发现这个过程很短，此时并没有下载源代码。下载代码需要在此命令完成后运行repo sync） 最后会看到 repo initialized in /android这样的提示，就说明本地的版本库已经初始化完毕，并且包含了当前最新的sourcecode。 如果想拿某个branch而不是主线上的代码，我们需要用-b参数制定branch名字，比如： repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake 另一种情况是，我们只需要某一个project的代码，比如kernel/common，就不需要repo了，直接用Git即可。 git [...]]]></description>
			<content:encoded><![CDATA[<p>本文转自<a href="http://www.williamhua.com/" target="_blank">William Hua的Blog</a>，原文<a href="http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/" target="_blank">在此</a>。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Git 是 Linux Torvalds 为了帮助管理 Linux内核开发而开发的一个开放源码的分布式版本控制软件，它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库（repository），许多个工作目录（working copy），而像Git这样的分布式版本控制系统中（其他主要的分布式版本控制系统还有<a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.bitkeeper.com');" href="http://www.bitkeeper.com/">BitKeeper</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.selenic.com');" href="http://www.selenic.com/mercurial">Mercurial</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.gnu.org');" href="http://www.gnu.org/software/gnu-arch/">GNU Arch</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/bazaar-vcs.org');" href="http://bazaar-vcs.org/">Bazaar</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/darcs.net');" href="http://darcs.net/">Darcs</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/svk.bestpractical.com');" href="http://svk.bestpractical.com/view/HomePage">SVK</a>、<a onclick="javascript:pageTracker._trackPageview('/outbound/article/monotone.ca');" href="http://monotone.ca/">Monotone</a>等），每一个工作目录都包含一个完整仓库，<strong>它们可以支持离线工作，本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮，单服务器系统一旦服务器出现问题整个系统就不能运行了，分布式系统通常不会因为一两个节点而受到影响</strong>。</p>
<p>因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成，所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库，使得Git的使用更加简单。</p>
<p>这几天William为了拿Android最新的sourcecode，学习了一下git和repo的一些基本操作，整理了一个如何取得Android代码的How-To，今天把他贴上来。</p>
<p><strong>1、Git的安装</strong><br />
在Ubuntu 8.04上安装git只要设定了正确的更新源，然后使用apt-get就可以了，有什么依赖问题，就让它自己解决吧。其中cURL是一个利用URL语法在命令行下工作的文件传输工具，会在后面安装Repo的时候用到。<br />
<strong>sudo apt-get install git-core curl</strong></p>
<p><strong>2、安装Repo</strong><br />
首先确保在当前用户的主目录下创建一个/bin目录（如果没有的话），然后把它(~/bin)加到PATH环境变量中<br />
接下来通过cURL来下载Repo脚本，保存到~/bin/repo文件中<br />
<strong>curl http://android.git.kernel.org/repo &gt;~/bin/repo</strong></p>
<p>别忘了给repo可执行权限<br />
<strong>chmod a+x ~/bin/repo</strong></p>
<p><strong>3、初始化版本库</strong><br />
如果是想把Android当前主线上最新版本的所有的sourcecode拿下来，我们需要repo的帮助。<br />
先建立一个目录，比如~/android，进去以后用repo init命令即可。<br />
<strong>repo init -u git://android.git.kernel.org/platform/manifest.git</strong><br />
<span style="text-decoration: line-through;">这个过程会持续很长的时间（至少可以好好睡一觉），具体要多少时间就取决于网络条件了</span>（<span style="color: #ff0000;">今天我尝试的时候发现这个过程很短，此时并没有下载源代码。下载代码需要在此命令完成后运行repo sync</span>）<br />
最后会看到 repo initialized in /android这样的提示，就说明本地的版本库已经初始化完毕，并且包含了当前最新的sourcecode。</p>
<p>如果想拿某个branch而不是主线上的代码，我们需要用-b参数制定branch名字，比如：<br />
<strong>repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake</strong></p>
<p>另一种情况是，我们只需要某一个project的代码，比如kernel/common，就不需要repo了，直接用Git即可。<br />
<strong>git clone git://android.git.kernel.org/kernel/common.git</strong><br />
这也需要不少的时间，因为它会把整个Linux Kernel的代码复制下来。</p>
<p>如果需要某个branch的代码，用git checkout即可。比如我们刚刚拿了kernel/common.get的代码，那就先进入到common目录，然后用下面的命令：<br />
<strong>git checkout origin/android-goldfish-2.6.27 -b goldfish</strong><br />
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支，代码则已经与android-goldgish-2.6.27同步。我们可以通过git branch来列出本地的所有分支。</p>
<p><strong>4、同步版本库</strong><br />
使用<strong>epo sync</strong>命令，我们把整个Android代码树做同步到本地，同样，我们可以用类似<br />
<strong>repo sync project1 project2 … </strong><br />
这样的命令来同步某几个项目</p>
<p>如果是同步Android中的单个项目，只要在项目目录下执行简单的<br />
<strong>git pull</strong><br />
即可。</p>
<p><strong>5、通过GitWeb下载代码</strong><br />
另外，如果只是需要主线上某个项目的代码，也可以通过<a onclick="javascript:pageTracker._trackPageview('/outbound/article/android.git.kernel.org');" href="http://android.git.kernel.org/">GitWeb</a>下载，在shortlog利用关键字来搜索特定的版本，或者找几个比较新的tag来下载还是很容易的。</p>
<p>Git最初是为Linux内核开发而设计，所以对其他平台的支持并不好，尤其是Windows平台，必须要有Cygwin才可以。现在，得益于<a onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');" href="http://code.google.com/p/msysgit/">msysgit</a>项目，我们已经可以不需要Cygwin而使用Git了。另外，<a onclick="javascript:pageTracker._trackPageview('/outbound/article/sourceforge.net');" href="http://sourceforge.net/projects/gitextensions/">Git Extensions</a>是一个非常好用的Windows Shell扩展，它能与资源管理器紧密集成，甚至提供了Visual Studio插件。它的官方网站上有一分不错的<a onclick="javascript:pageTracker._trackPageview('/outbound/article/sourceforge.net');" href="http://sourceforge.net/project/showfiles.php?group_id=246547&amp;package_id=300816&amp;release_id=674434">说明文档</a>，感兴趣的朋友可以看一看。</p>
<p>至于Git的参考文档，我推荐<a onclick="javascript:pageTracker._trackPageview('/outbound/article/www-cs-students.stanford.edu');" href="http://www-cs-students.stanford.edu/%7Eblynn/gitmagic/">Git Magic</a>，这里还有一个<a onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');" href="http://docs.google.com/View?id=dfwthj68_675gz3bw8kj#__07735763982479649">Git Magic的中文版</a>。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-get-android-source-code/">Android开发环境的建立(3)——获取Android源代码【转贴】</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-get-android-source-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android开发环境的建立(2)——安装Android SDK 1.5</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-install-the-android-sdk-1-5/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-install-the-android-sdk-1-5/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 08:10:34 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/android%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e5%bb%ba%e7%ab%8b2%e2%80%94%e2%80%94%e5%ae%89%e8%a3%85android-sdk-15.html</guid>
		<description><![CDATA[1.下载SDK 到Android Developers下载linux版本的SDK，要用代理，推荐Hotspot Shield，心中再次问候下伟大的GFW。 下载完成后解压，配置android sdk 环境变量： $ sudo gedit /home/yourusername/.bashrc 添加下面这行代码(路径大家按照自己的存放目录修改)： export PATH=/home/yourusername/android-sdk-linux_x86-1.5_r1/tools:$PATH 2.配置Java开发环境 参见这里 1).下载安装JDK: $ sudo apt-get install sun-java5-jdk or $ sudo apt-get install sun-java6-jdk 版本不同而已。推荐下载JDK5.0，目前系统镜像的编译不支持JDK6.0. For Ubuntu 9.10(added 20100416) 由于Ubuntu 9.10上没有jdk5的源，所以不能直接安装，对此有两种方法可以解决： 方法1：从sun网站上下载安装 下载地址： http://java.sun.com/javase/downloads/5u21/jdk，个人倾向安装在 ~/bin目录下 安装： $ cd ~/bin/ $ chmod 777 jdk-1_5_0_21-linux-i586.bin $ ./jdk-1_5_0_21-linux-i586.bin 添加到环境变量： $ sudo gedit ~/.bashrc 加入 [...]]]></description>
			<content:encoded><![CDATA[<p>1.下载SDK</p>
<p>到<a href="http://developer.android.com/sdk/1.5_r1/index.html" target="_blank">Android Developers</a>下载linux版本的SDK，要用代理，<span style="text-decoration: line-through;">推荐<a href="http://hotspotshield.com/hotspot-shield-download.php" target="_blank">Hotspot Shield</a>，心中再次问候下伟大的GFW。</span></p>
<p>下载完成后解压，配置android sdk 环境变量：<br />
$ sudo gedit /home/<span style="color: #ff0000;">yourusername</span>/.bashrc</p>
<p>添加下面这行代码(路径大家按照自己的存放目录修改)：<br />
export PATH=/home/<span style="color: #ff0000;">yourusername</span>/android-sdk-linux_x86-1.5_r1/tools:$PATH</p>
<p>2.配置Java开发环境</p>
<p>参见<a href="http://wiki.ubuntu.org.cn/Qref/More#JAVA_.E7.8E.AF.E5.A2.83.E9.85.8D.E7.BD.AE.E5.8F.8A.E7.9B.B8.E5.85.B3" target="_blank">这里</a></p>
<p>1).下载安装JDK:<br />
$ sudo apt-get install sun-java5-jdk<br />
or<br />
$ sudo apt-get install sun-java6-jdk</p>
<p>版本不同而已。推荐下载JDK5.0，目前系统镜像的编译不支持JDK6.0.</p>
<p><span style="color: #000080;">For Ubuntu 9.10(added 20100416)</span></p>
<p><span style="color: #000080;">由于Ubuntu 9.10上没有jdk5的源，所以不能直接安装，对此有两种方法可以解决：</span></p>
<p><span style="color: #000080;">方法1：从sun网站上下载安装</span></p>
<p><span style="color: #000080;">下载地址： http://java.sun.com/javase/downloads/5u21/jdk，个人倾向安装在 ~/bin目录下</span></p>
<p><span style="color: #000080;">安装：</span></p>
<p><span style="color: #000080;">$ cd ~/bin/<br />
$ chmod 777 jdk-1_5_0_21-linux-i586.bin<br />
$ ./jdk-1_5_0_21-linux-i586.bin</span></p>
<p><span style="color: #000080;">添加到环境变量：</span></p>
<p><span style="color: #000080;">$ sudo gedit ~/.bashrc</span></p>
<p><span style="color: #000080;">加入<br />
export PATH=~/bin/jdk1.5.0_21/bin：$PATH</span></p>
<p><span style="color: #000080;">方法2：从Ubuntu 9.04 源安装</span></p>
<p><span style="color: #000080;">$ sudo gedit /etc/apt/sources.list</span></p>
<p><span style="color: #000080;">添加jdk5源:</span></p>
<p><span style="color: #000080;">deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse<br />
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse</span></p>
<p><span style="color: #000080;">这里有另外一组源：</span></p>
<p><span style="color: #000080;">deb http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse<br />
deb-src http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse<br />
deb http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse<br />
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse<br />
deb http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse<br />
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse<br />
deb http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse<br />
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse<br />
save the file and close gedit. Next sync your sources by running</span></p>
<p><span style="color: #000080;">更新源，安装：</span></p>
<p><span style="color: #000080;">$ sudo apt-get update<br />
$ sudo apt-get install sun-java5-jdk</span></p>
<p>2).如果安装有多个JDK，需要设置当前默认Java解释器：<br />
sudo update-alternatives &#8211;config java</p>
<p><del datetime="2010-04-16T10:11:58+00:00">3).配置环境变量(可选)：<br />
sudo gedit /etc/environment<br />
添加如下两行：<br />
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib<br />
JAVA_HOME=/usr/lib/jvm/java-6-sun</del></p>
<p><del>sudo gedit /etc/jvm<br />
在下面的代码添加到顶部：<br />
/usr/lib/jvm/java-6-sun</del></p>
<p>设置完成后可以在终端输入java -version测试一下。</p>
<p>3.创建AVD(android virtual device)<br />
android 1.5 中，emulator是不可以直接使用的，必须先创建avd才能使用emulator,</p>
<p>1).查看当前支持版本(在列出的版本中我们需要记住id值，这个值在第2步中使用)：<br />
android list targets<br />
2).创建AVD(最后的2表示创建1.5版本的avd)：<br />
android create avd &#8211;name youravdname &#8211;target 2<br />
3).查看是否创建成功(如果成功会显示刚才我们创建的avd信息)：<br />
android list avd<br />
4).启动模拟器：<br />
emulator-avd youravdname<br />
（在模拟器中打开中文输入法:Menu-&gt;Settings-&gt;Local &amp; text-&gt;android keyboard，将android keyboard后面的勾去掉就可以了）</p>
<p>4.在Eclipse中搭建android开发环境</p>
<p>1).到http://www.eclipse.org/downloads/下载Eclipse IDE，有JavaEE，Java和RCP，这里选择 Eclipse IDE for Java EE Developers for Linux 32bit下载,如果用的是 x86_64系统的，请选择 Linux 64bit，下载完成后解压即可。</p>
<p>2).安装 Android Eclipse开发插件<br />
在Eclipse内依次选择 Help&#8211;Software Updates&#8230;项，转换到 Available Software标签,然后单击“ Add Site&#8230;”项，在地址文本框中输入http://dl-ssl.google.com/Android/eclipse/, 然后单击“Install”按钮。</p>
<p>返 回 到 “Available Software”页签项 , 选 择“Developer Tools”(这应该是自动检查Android Development Tools和Android Editors),然后单击“ Install&#8230;”项。<br />
在安装的界面中,确认“Android Development Tools”和“Android Editors”已经检查,然后单击“ Next”按钮,单击“Finish”按钮,完成安装。</p>
<p>5.设置SDK路径：<br />
在Eclipse中导入android程序后，必须设置sdk版本(工程/属性)，否则会出现错误。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-install-the-android-sdk-1-5/">Android开发环境的建立(2)——安装Android SDK 1.5</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-install-the-android-sdk-1-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发环境的建立(1)——Win7下安装Ubuntu9.04</title>
		<link>http://www.xiangmocheng.com/2009/06/how-to-install-ubuntu9-04-on-windows-7/</link>
		<comments>http://www.xiangmocheng.com/2009/06/how-to-install-ubuntu9-04-on-windows-7/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 08:08:28 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/android%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e5%bb%ba%e7%ab%8b1%e2%80%94%e2%80%94win7%e4%b8%8b%e5%ae%89%e8%a3%85ubuntu904.html</guid>
		<description><![CDATA[这几天活很紧~所以准备把家里的电脑也装上开发环境。 安装Ubuntu9.04： 目前的系统是XP+Win7 RC，安装在Win7下进行。 1). 分区准备：准备一个10G左右的分区，最少5G。可以用PartitionMagic从现有磁盘分区里划分，建议为其单独准备一个新分区。 注意格式化新盘的时候一定要删掉卷标“新加卷”那三个字（wubi安装Ubuntu，安装盘卷标不能有中文），否则会安装失败。 2). 下载光盘镜像ubuntu-9.04-desktop-i386.iso，用虚拟光驱Alcohol 120%加载，双击出现wubi，点击“Install inside Windows”，选择要安装的磁盘，使用的空间大小，用户名称和密码。重启就开始安装了。 安装过程中把网线拔掉。 3). 安装完成后，插上网线，这时会提示你语言包不全，此时不要更新也不要关掉这个窗口，先设置更新源。 4). 更新好软件源后，此时再更新语言包。建议同时安装英文语言包。 5). 最后更新软件包，Over。 其他常用设置： 添加终端加到右键菜单：sudo apt-get install nautilus-open-terminal 添加以管理员身份打开文件或文件夹到右键菜单：sudo apt-get install nautilus-gksu 下载最新版本的Firefox，常用插件：Xmarks，FireGestures，Easy DragToGo 更多常用设置点击这里。 转载请注明： 转载自不然你要我怎么样 本文链接地址: Android开发环境的建立(1)——Win7下安装Ubuntu9.04]]></description>
			<content:encoded><![CDATA[<p>这几天活很紧~所以准备把家里的电脑也装上开发环境。</p>
<p>安装Ubuntu9.04：</p>
<p>目前的系统是XP+Win7 RC，安装在Win7下进行。</p>
<p>1). 分区准备：准备一个10G左右的分区，最少5G。可以用<a href="http://www.crsky.com/Soft/94.html" target="_blank">PartitionMagic</a>从现有磁盘分区里划分，建议为其单独准备一个新分区。</p>
<p>注意格式化新盘的时候一定要删掉卷标“新加卷”那三个字（wubi安装Ubuntu，安装盘卷标不能有中文），否则会安装失败。</p>
<p>2). 下载光盘镜像ubuntu-9.04-desktop-i386.iso，用虚拟光驱Alcohol 120%加载，双击出现wubi，点击“Install inside Windows”，选择要安装的磁盘，使用的空间大小，用户名称和密码。重启就开始安装了。</p>
<p>安装过程中把网线拔掉。</p>
<p>3). 安装完成后，插上网线，这时会提示你语言包不全，此时不要更新也不要关掉这个窗口，先<a href="http://wiki.ubuntu.org.cn/index.php?title=Qref/Jaunty&amp;variant=zh-cn" target="_blank">设置更新源</a>。</p>
<p>4). 更新好软件源后，此时再更新语言包。建议同时安装英文语言包。</p>
<p>5). 最后更新软件包，Over。</p>
<p>其他常用设置：</p>
<p>添加终端加到右键菜单：sudo apt-get install nautilus-open-terminal</p>
<p>添加以管理员身份打开文件或文件夹到右键菜单：sudo apt-get install nautilus-gksu</p>
<p>下载最新版本的<a href="http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-i686/zh-CN/" target="_blank">Firefox</a>，常用插件：Xmarks，FireGestures，Easy DragToGo</p>
<p>更多常用设置点击<a title="Ubuntu常用设置" href="http://www.xiangmocheng.com/2009/12/ubuntu-setting/" target="_blank">这里</a>。
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/06/how-to-install-ubuntu9-04-on-windows-7/">Android开发环境的建立(1)——Win7下安装Ubuntu9.04</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/06/how-to-install-ubuntu9-04-on-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

