<?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>阿偉的個人天地</title>
	<atom:link href="http://cwhuang.info/feed" rel="self" type="application/rss+xml" />
	<link>http://cwhuang.info</link>
	<description>阿偉的研究記錄：Eee PC、Android、Linux、Open Source 和其它</description>
	<lastBuildDate>Sat, 06 Mar 2010 19:32:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>趕快開發熱門的 Android 應用程式吧!</title>
		<link>http://cwhuang.info/2010/03/google-mobile-phone-for-android-developer</link>
		<comments>http://cwhuang.info/2010/03/google-mobile-phone-for-android-developer#comments</comments>
		<pubDate>Sat, 06 Mar 2010 19:32:47 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=896</guid>
		<description><![CDATA[如果你在開發 Android 的應用程式，或即將打算開發，趕快加緊你的腳步吧! 只要在 Android Market 上，擁有評價 3.5 顆星以上，或是超過 5000 次以上的唯一下載次數，就有資格拿到 Google Nexus One 或 Motorola Droid 手機。不過僅有在這兩支手機已通過認證國家的開發者才有機會拿到。還好台灣也是其中之一。
差不多在三月三號，也就是我拿到小禮物那天，符合資格的開發者就已經收到這個通知信了。像我的朋友 LIME IME 的作者就得到通知。

Google 提供免費手機給開發者
Google 拉攏開發商 免費賺到一隻 Nexus One

雖然一開始有人以為是詐騙信，不過在求證 Google 後似乎已經得到了證實。看來 Google 為了力拼 Android 的佔有率，不惜砸下重金，以拉攏全世界的開發者，對抗競爭者(Apple?)。
當然這個機會目前是給已在 Android Market 經營出良好成績的開發者。如果現在才要開始寫還有機會得到手機嗎? 我也不知道啦。但我想應該是很有機會的&#8230; 只可惜我大部分的工作都是在做 Android 底層的移植，極少在寫上層的應用程式。不然我也想來試試&#8230;
老實說 Google 這樣的做法真的很聰明(或者說很邪惡?)。雖然說看似要花不少錢，但是跟 Google 一年的營收比起來真是不足微道。更何況它的效益驚人。因為開發者都是 power user，能帶來良好口碑和一票的用戶。這比其它的行銷方式更有效。
其實我當年在 ASUS 透過 EeeCommunity 計劃推動捐贈 Eee PC 給 Linux 社群的開發者就有同樣的意圖。只是我們的規模和強度完全無法和 Google [...]]]></description>
			<content:encoded><![CDATA[<p>如果你在開發 Android 的應用程式，或即將打算開發，趕快加緊你的腳步吧! 只要在 <a href="http://www.android.com/market">Android Market</a> 上，擁有評價 3.5 顆星以上，或是超過 5000 次以上的唯一下載次數，就有資格拿到 Google Nexus One 或 Motorola Droid 手機。不過僅有在這兩支手機已通過認證國家的開發者才有機會拿到。還好台灣也是其中之一。</p>
<p>差不多在三月三號，也就是我拿到<a href="/?p=877">小禮物</a>那天，符合資格的開發者就已經收到這個通知信了。像我的朋友 LIME IME 的作者就得到通知。</p>
<ul>
<li><a href="http://android.toload.net/2010/03/google.html">Google 提供免費手機給開發者</a></li>
<li><a href="http://www.jackforfun.com/2010/03/google-device-seeding-program-for-top.html">Google 拉攏開發商 免費賺到一隻 Nexus One</a></li>
</ul>
<p>雖然一開始有人以為是詐騙信，不過在求證 Google 後似乎已經得到了證實。看來 Google 為了力拼 Android 的佔有率，不惜砸下重金，以拉攏全世界的開發者，對抗競爭者(Apple?)。</p>
<p>當然這個機會目前是給已在 Android Market 經營出良好成績的開發者。如果現在才要開始寫還有機會得到手機嗎? 我也不知道啦。但我想應該是很有機會的&#8230; 只可惜我大部分的工作都是在做 Android 底層的移植，極少在寫上層的應用程式。不然我也想來試試&#8230;</p>
<p>老實說 Google 這樣的做法真的很聰明(或者說很邪惡?)。雖然說看似要花不少錢，但是跟 Google 一年的營收比起來真是不足微道。更何況它的效益驚人。因為開發者都是 power user，能帶來良好口碑和一票的用戶。這比其它的行銷方式更有效。</p>
<p>其實我當年在 ASUS 透過 EeeCommunity 計劃推動捐贈 Eee PC 給 Linux 社群的開發者就有同樣的意圖。只是我們的規模和強度完全無法和 Google 現在的做法相提並論&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/03/google-mobile-phone-for-android-developer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google 的小禮物</title>
		<link>http://cwhuang.info/2010/03/a-small-gift-from-google</link>
		<comments>http://cwhuang.info/2010/03/a-small-gift-from-google#comments</comments>
		<pubDate>Wed, 03 Mar 2010 15:55:38 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=877</guid>
		<description><![CDATA[一個多月前收到關於 Google Android Developer Lab 的消息。那時幾乎已經是報名的最後一天，趕緊上網填了資料寄出。過年前就收到通知，我得到參加的資格。也沒多想，直接記在行事曆當中。
今天就是這個 Developer Lab 在台北舉辦的日子。不過事情很多，加上這個會議從中午 12 點半就開始，連午飯都來不及吃。其實一開始有點不太想去。但為了有機會和 Android 開發者近距離接觸，還是決定參加。還好去了，否則可就後悔莫及。
報到時，領到一張綠色貼紙，被要求貼在胸前。我不是很喜歡在身上亂貼東西，不過還是照辦了。遇到在台北 Google 工作的朋友，他告訴我，等會將發小禮物。我問每個人都有嗎? 要是用抽獎的，我一定抽不到啦。他說是的，每個人都有。我心想 Google 給的禮物應該不會太差吧? 但了不起就是 T-恤之類的紀念品吧?
想不到，Google 的這個禮物還真不小哩! 接近中場休息時，台上的講者宣佈，Google 將贈送每位參加者一支 Android 手機。因為是用英文講的，我還以為我聽錯了。直到主持人用中文再宣佈一次，並要大家到外面排隊領手機，我們才知道這不是在開玩笑。工作人員在我們胸前的綠色貼紙上蓋了章。而我們拿到手的，竟然就是我哈很久的，最新的 Google Android 手機 Nexus One。市價將近台幣兩萬元，Google 一口氣就送出兩三百支，真是大手筆呀! 現場看過去，每個人都是眉開眼笑。雖然有個人告訴我，他才剛買了一支，不到一個月，真是冤枉。我笑說早買早享受嘛，何況你還可以賣掉!
接下來的議程 Android 開發者在講解 Android 2.1 SDK 的新特色，例如 live wallpaper 的製作方式。不過說實在的，我們大都沒心情聽，只在把玩手上的小禮物。由於會場的電源插座不夠，我只能用 USB 線連接 Eee PC 充電。所謂拿人的手短，本來還想罵罵 Google 的，也暫時先封口囉&#8230; :p
唯一的副作用是，回到家後，老婆看了也很心動，看起來很想再敗一支的樣子。我警告她別衝動，免得我的卡要遭殃&#8230;
本來要寫開箱文的。不過看起來有人動作很快，已經寫了。我就偷懶一下。想看照片的請自行跳轉過去吧&#8230;
新聞也報出來了：

Google送台灣Android開發者Nexus One手機
Google台灣開發者大會 每人送一支Nexus One

不過現場有歡呼聲嗎? 我記得是沒有啦。因為剛宣佈時，大家都是一副不可置信的表情，還以為是在作夢哩!
]]></description>
			<content:encoded><![CDATA[<p>一個多月前收到關於 <a href="http://sites.google.com/site/androiddevlabs/home">Google Android Developer Lab</a> 的消息。那時幾乎已經是報名的最後一天，趕緊上網填了資料寄出。過年前就收到通知，我得到參加的資格。也沒多想，直接記在行事曆當中。</p>
<p>今天就是這個 Developer Lab 在台北舉辦的日子。不過事情很多，加上這個會議從中午 12 點半就開始，連午飯都來不及吃。其實一開始有點不太想去。但為了有機會和 Android 開發者近距離接觸，還是決定參加。還好去了，否則可就後悔莫及。</p>
<p>報到時，領到一張綠色貼紙，被要求貼在胸前。我不是很喜歡在身上亂貼東西，不過還是照辦了。遇到在台北 Google 工作的朋友，他告訴我，等會將發小禮物。我問每個人都有嗎? 要是用抽獎的，我一定抽不到啦。他說是的，每個人都有。我心想 Google 給的禮物應該不會太差吧? 但了不起就是 T-恤之類的紀念品吧?</p>
<p>想不到，Google 的這個禮物還真不小哩! 接近中場休息時，<span id="more-877"></span>台上的講者宣佈，Google 將贈送每位參加者一支 Android 手機。因為是用英文講的，我還以為我聽錯了。直到主持人用中文再宣佈一次，並要大家到外面排隊領手機，我們才知道這不是在開玩笑。工作人員在我們胸前的綠色貼紙上蓋了章。而我們拿到手的，竟然就是我哈很久的，最新的 Google Android 手機 <a href="http://www.google.com/phone">Nexus One</a>。市價將近台幣兩萬元，Google 一口氣就送出兩三百支，真是大手筆呀! 現場看過去，每個人都是眉開眼笑。雖然有個人告訴我，他才剛買了一支，不到一個月，真是冤枉。我笑說早買早享受嘛，何況你還可以賣掉!</p>
<p>接下來的議程 Android 開發者在講解 Android 2.1 SDK 的新特色，例如 live wallpaper 的製作方式。不過說實在的，我們大都沒心情聽，只在把玩手上的小禮物。由於會場的電源插座不夠，我只能用 USB 線連接 Eee PC 充電。所謂拿人的手短，本來還想<a href="/?p=795">罵罵 Google</a> 的，也暫時先封口囉&#8230; :p</p>
<p>唯一的副作用是，回到家後，老婆看了也很心動，看起來很想再敗一支的樣子。我警告她別衝動，免得我的卡要遭殃&#8230;</p>
<p>本來要寫開箱文的。不過看起來有人動作很快，已經寫了。我就偷懶一下。想看照片的請自行<a href="http://bestand.blog.ithome.com.tw/post/3649/67736">跳轉</a>過去吧&#8230;</p>
<p>新聞也報出來了：</p>
<ul>
<li><a href="http://www.ithome.com.tw/itadm/article.php?c=59850">Google送台灣Android開發者Nexus One手機</a></li>
<li><a href="http://www.zdnet.com.tw/news/ce/0,2000085674,20144435,00.htm">Google台灣開發者大會 每人送一支Nexus One</a></li>
</ul>
<p>不過現場有歡呼聲嗎? 我記得是沒有啦。因為剛宣佈時，大家都是一副不可置信的表情，還以為是在作夢哩!</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/03/a-small-gift-from-google/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>加入 mksh 到 Android-x86</title>
		<link>http://cwhuang.info/2010/02/add-mksh-to-android-x86</link>
		<comments>http://cwhuang.info/2010/02/add-mksh-to-android-x86#comments</comments>
		<pubDate>Sat, 27 Feb 2010 04:51:47 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=875</guid>
		<description><![CDATA[我已經將 MirBSD Korn Shell，簡稱 mksh，加入到 Android-x86 的 source tree 當中。版本是 R39c。和往常一樣，請利用 repo sync 取得並編譯。
Mksh 是從 Ksh 衍生而來的，主要用在 MirBSD 當中。其採用的授權是 BSD style，因此和 Android 的 Apache 授權相容。目前 mksh 的 patches 已經被提交到 Gerrit code review 審核當中。這是由 mksh 開發者 Thorsten Glaser 所提供。
我們用 mksh 來取代原本 Android 功能很弱的  /system/bin/sh。它擁有現代 shell 的許多特色，包括了指令歷史記錄(可用上下鍵選擇)、Tab 補齊(按 Tab 鍵可補齊指令、檔名等)、歷史搜尋(按 Ctrl-R)等。它也內建了 test 指令(也就是 if test &#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>我已經將 MirBSD Korn Shell，簡稱 mksh，加入到 Android-x86 的 <a href="http://git.android-x86.org/?p=platform/system/core.git;a=summary">source tree</a> 當中。版本是 R39c。和往常一樣，請利用 repo sync 取得並編譯。</p>
<p>Mksh 是從 Ksh 衍生而來的，主要用在 MirBSD 當中。其採用的授權是 BSD style，因此和 Android 的 Apache 授權相容。目前 mksh 的 <a href="http://review.source.android.com/#dashboard,1002670">patches</a> 已經被提交到 <a href="http://review.source.android.com">Gerrit code review</a> 審核當中。這是由 mksh 開發者 Thorsten Glaser 所提供。</p>
<p>我們用 mksh 來取代原本 Android 功能很弱的  /system/bin/sh。它擁有現代 shell 的許多特色，包括了指令歷史記錄(可用上下鍵選擇)、Tab 補齊(按 Tab 鍵可補齊指令、檔名等)、歷史搜尋(按 Ctrl-R)等。它也內建了 test 指令(也就是 if test &#8230; 這樣的指令可以執行了)。細節請參考 mksh 的網站： <a href="http://mirbsd.de/mksh">http://mirbsd.de/mksh</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/02/add-mksh-to-android-x86/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>將 native libraries 加入 AOSP 的編譯</title>
		<link>http://cwhuang.info/2010/02/compile-native-libraries-with-aosp</link>
		<comments>http://cwhuang.info/2010/02/compile-native-libraries-with-aosp#comments</comments>
		<pubDate>Sun, 14 Feb 2010 19:22:54 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=842</guid>
		<description><![CDATA[上篇介紹用 Android SDK 和 NDK 來編譯含 JNI 的 Android 應用程式。但若是已有 Android (或 Android-x86)的 source tree，可能就不會再想安裝 SDK 和 NDK。因為 AOSP tree 本身就包含完整的 SDK 和 NDK。那麼是不是可以將含有 native libraries 的應用程式，加入到 AOSP 的 build system 中編譯? 這麼做還有一個更重要的理由，就是把你的應用程式和 AOSP 的源碼結合在一起，用單一步驟就可以完成所有的編譯。這樣有助於維護單一而自我包含(self-contained)的源碼。
答案當然是肯定的。經過一番嘗試後，發現只要稍微修改一下應用程式的 Android.mk 就行。具體的做法如下：
首先，將應用程式的目錄搬到 AOSP tree 的 packages/apps/ 目錄下。例如 packages/apps/hello。
再來，建立 packages/apps/hello/Android.mk，內容如下：





$(call build-package)

LOCAL_PATH:= $(LOCAL_PATH)/jni
include $(CLEAR_VARS)

LOCAL_MODULE := libhello
LOCAL_SRC_FILES := hello.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES :=

include $(BUILD_SHARED_LIBRARY)





這個 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/?p=840">上篇</a>介紹用 Android SDK 和 NDK 來編譯含 <a href="http://en.wikipedia.org/wiki/Java_Native_Interface">JNI</a> 的 Android 應用程式。但若是已有 Android (或 Android-x86)的 source tree，可能就不會再想安裝 SDK 和 NDK。因為 AOSP tree 本身就包含完整的 SDK 和 NDK。那麼是不是可以將含有 native libraries 的應用程式，加入到 AOSP 的 build system 中編譯? 這麼做還有一個更重要的理由，就是把你的應用程式和 AOSP 的源碼結合在一起，用單一步驟就可以完成所有的編譯。這樣有助於維護單一而自我包含(self-contained)的源碼。</p>
<p>答案當然是肯定的。經過一番嘗試後，發現只要稍微修改一下應用程式的 Android.mk 就行。具體的做法如下：</p>
<p>首先，將應用程式的目錄搬到 AOSP tree 的 packages/apps/ 目錄下。例如 packages/apps/hello。</p>
<p>再來，建立 packages/apps/hello/Android.mk，內容如下：<span id="more-842"></span></p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$(call build-package)

LOCAL_PATH:= $(LOCAL_PATH)/jni
include $(CLEAR_VARS)

LOCAL_MODULE := libhello
LOCAL_SRC_FILES := hello.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES :=

include $(BUILD_SHARED_LIBRARY)
</pre>
</td>
</tr>
</tbody>
</table>
<p>這個 Android.mk 包含了兩部分。第一部分是編譯 java code 產生 apk，這是由 build-package macro 所完成。這個 macro 是 Android-x86 加入的。若你用的是原始的 Google AOSP 並沒有此 macro。不過用原本的 Android build system 規則，直接指定 LOCAL_PACKAGE_NAME、LOCAL_SRC_FILES 等變數也可以。</p>
<p>第二部分就是 native libraries 的編譯規則。其中有幾個和 NDK 裡 Android.mk 不同的地方值得注意。一是要在 LOCAL_C_INCLUDES 指定 nativehelper 目錄的位置。否則的話，就要修改源碼中的 #include &lt;jni.h&gt; 成為 #include &lt;nativehelper/jni.h&gt;，不然會找不到 jni.h。另一個不同的地方是，若原本在 LOCAL_LDLIBS 指定 link 了其它的 libraries，要改成用 LOCAL_SHARED_LIBRARIES 來指定用 AOSP 的 libraries。以 san-angeles 這個 sample 為例，它原本是</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
</pre>
</td>
</tr>
</tbody>
</table>
<p>必須改為</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
LOCAL_SHARED_LIBRARIES := libGLESv1_CM liblog
</pre>
</td>
</tr>
</tbody>
</table>
<p>還有一點不同是，LOCAL_MODULE 一定要以 lib 開頭(上例就是 libhello)。不像 NDK 的 Android.mk 裡，好像用 hello 或 libhello 都行。</p>
<p>這樣子照原本編譯 AOSP 的方法，就可以編出包含此應用程式的 image 了。不過和 NDK 不同的是，它的 shared libraries 是放進 /system/lib 裡，apk 裡並不包含 .so 檔(可以用 unzip 解開來看)。</p>
<p>參考：</p>
<ul>
<li><a href="http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/403">Android Native code 不用 NDK</a></li>
</ul>
<p>如果有人有更好的做法，歡迎分享。</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/02/compile-native-libraries-with-aosp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>建立使用 JNI 的 Android 應用程式</title>
		<link>http://cwhuang.info/2010/02/create-jni-apk</link>
		<comments>http://cwhuang.info/2010/02/create-jni-apk#comments</comments>
		<pubDate>Sat, 13 Feb 2010 17:36:49 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=840</guid>
		<description><![CDATA[一般要建立 Android 的應用程式使用 Eclipse + ADT 最為方便。不過若是像我一樣慣用 command line 的人，可能會希望直接用指令完成。這可利用 Android SDK 和 NDK 辦到。
首先，用 SDK 的 android 指令建立一個 project：





$ android create project -t android-4 -k app.hello -a HelloActivity -p apps/hello/project





其中的參數：

-t 指定 Android API level，android-4 代表 Android 1.6 版。
-k 代表 package namespace。
-a 代表 Activity 的名稱。
-p 代表 project 的放置路徑。


再來，建立 apps/hello/project/jni/ 目錄，並將你的 C/C++ code 放置於此。然後建立 apps/hello/project/jni/Android.mk 內容類似如下：





LOCAL_PATH [...]]]></description>
			<content:encoded><![CDATA[<p>一般要建立 Android 的應用程式使用 <a href="/?p=116">Eclipse + ADT</a> 最為方便。不過若是像我一樣慣用 command line 的人，可能會希望直接用指令完成。這可利用 <a href="http://developer.android.com/sdk/index.html">Android SDK</a> 和 <a href="http://developer.android.com/sdk/ndk/1.6_r1/index.html">NDK</a> 辦到。</p>
<p>首先，用 SDK 的 android 指令建立一個 project：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">android create project -t android-4 -k app.hello -a HelloActivity -p apps/hello/project</span>
</pre>
</td>
</tr>
</tbody>
</table>
<p>其中的參數：</p>
<ul>
<li>-t 指定 <a href="http://developer.android.com/guide/appendix/api-levels.html">Android API level</a>，android-4 代表 Android 1.6 版。</li>
<li>-k 代表 package namespace。</li>
<li>-a 代表 <a href="http://developer.android.com/reference/android/app/Activity.html">Activity</a> 的名稱。</li>
<li>-p 代表 project 的放置路徑。</li>
</ul>
<p><span id="more-840"></span><br />
再來，建立 apps/hello/project/jni/ 目錄，並將你的 C/C++ code 放置於此。然後建立 apps/hello/project/jni/Android.mk 內容類似如下：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libhello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)
</pre>
</td>
</tr>
</tbody>
</table>
<p>其中 LOCAL_MODULE 就是 native shared library 的名稱，而 LOCAL_SRC_FILES 裡應列出這個 library 的所有 C/C++ 源碼。</p>
<p>再來建立 apps/hello/Application.mk 如下：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES      := hello
</pre>
</td>
</tr>
</tbody>
</table>
<p>如此就可以透過 NDK 和 <a href="http://ant.apache.org">Ant</a> 來編譯，產生 apk 了：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">make -jX V=1 APP=hello</span>
$ <span class="term_command">ant -f apps/hello/project/build.xml debug</span>
</pre>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/02/create-jni-apk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android-x86 NDK for Eclair</title>
		<link>http://cwhuang.info/2010/02/android-x86-ndk-for-eclair</link>
		<comments>http://cwhuang.info/2010/02/android-x86-ndk-for-eclair#comments</comments>
		<pubDate>Thu, 04 Feb 2010 16:39:23 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=827</guid>
		<description><![CDATA[藉著 eclair-x86 branch 的釋出，順便 review 了一下 NDK for x86 的支援。原本的做法，要編譯給 x86 的 shared libraries 時需要指定 TARGET_PRODUCT=eeepc。但在加入多 x86 平台支援之後，「eeepc」其實已經不代表通用的 x86 平台。因此這個用法有商榷的必要。
另外 AOSP (以及 Android-x86)的 source tree 雖含有 NDK 和 toolchains，但 NDK 卻無法直接使用 AOSP 的 toolchains。還要叫使用者自行下載，真是多此一舉。
經過我的修改後，讓 development/ndk 可以直接的使用 prebuilt 中的 toolchains。同時，預設的 toolchains 就是 x86。因此不需要再指定 TARGET_PRODUCT=eeepc 了。

簡單來說，只需下列步驟就可以使用 Android-x86 source tree 中的 NDK：





$ cd development/ndk
$ sh build/host-setup.sh
Checking host development [...]]]></description>
			<content:encoded><![CDATA[<p>藉著 <a href="/?p=820">eclair-x86 branch 的釋出</a>，順便 review 了一下 NDK for x86 的支援。原本的做法，要編譯給 x86 的 shared libraries 時需要指定 TARGET_PRODUCT=eeepc。但在加入<a href="/?p=776">多 x86 平台支援</a>之後，「eeepc」其實已經不代表通用的 x86 平台。因此這個用法有商榷的必要。</p>
<p>另外 AOSP (以及 Android-x86)的 source tree 雖含有 NDK 和 toolchains，但 NDK 卻無法直接使用 AOSP 的 toolchains。還要叫使用者自行下載，真是多此一舉。</p>
<p>經過我的修改後，讓 development/ndk 可以直接的使用 prebuilt 中的 toolchains。同時，預設的 toolchains 就是 x86。因此不需要再指定 TARGET_PRODUCT=eeepc 了。<br />
<span id="more-827"></span><br />
簡單來說，只需下列步驟就可以使用 Android-x86 source tree 中的 NDK：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">cd development/ndk</span>
$ <span class="term_command">sh build/host-setup.sh</span>
Checking host development environment.
NDK Root   : /home/cwhuang/git/android-x86-2.1/development/ndk
GNU Make   : make (version 3.81)
Awk        : awk
Platform   : linux-x86
Generate   : out/host/config.mk
Toolchain  : Checking for arm-eabi-4.2.1 prebuilt binaries
Toolchain  : Checking for i686-unknown-linux-gnu-4.2.1 prebuilt binaries

Host setup complete. Please read docs/OVERVIEW.TXT if you don't know what to do.
$ <span class="term_command">make APP=hello-jni</span>
</pre>
</td>
</tr>
</tbody>
</table>
<p>其中 hello-jni 也可以換成其它的 sample applications：hello-gl2, san-angeles, two-libs</p>
<p>如果想編譯給 arm 用的版本也可以。只要指定 NDK_TOOLCHAIN 為 arm 版本就行。例如：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">make NDK_TOOLCHAIN=arm-eabi-4.4.0 APP=xxx </span>
</pre>
</td>
</tr>
</tbody>
</table>
<p>記得 repo sync 一下取得我最新的修改。</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/02/android-x86-ndk-for-eclair/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android-x86 2.1 Branch</title>
		<link>http://cwhuang.info/2010/02/android-x86-2-1-branch</link>
		<comments>http://cwhuang.info/2010/02/android-x86-2-1-branch#comments</comments>
		<pubDate>Wed, 03 Feb 2010 15:40:24 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=820</guid>
		<description><![CDATA[一個多禮拜前 Google Android 開發者在 Android-platform 討論群上宣佈釋出 Android 2.1 版的消息。不過並不是放在 master branch 而是在 eclair branch。沒錯，2.1 版仍是叫做 eclair，因此只能算是個小改版吧?
經過一番努力，我們已成功將 Android-x86 更新到 eclair 2.1 branch 上。遵循 Google 的慣例，這個分支就叫做 eclair-x86 branch 吧。取得的方法和以前差不多：





$ repo init -u git://git.android-x86.org/manifest.git -b eclair-x86
$ repo sync





也可從 SourceForge 上的 mirror 下載。
不過 2.1 版新增的許多 3D 效果，像 Gallery3D，在 x86 版本上不是跑不動就是會 crash。又有許多苦功要做了&#8230;
]]></description>
			<content:encoded><![CDATA[<p>一個多禮拜前 Google Android 開發者在 <a href="http://groups.google.com/group/android-platform">Android-platform 討論群</a>上宣佈<a href="http://groups.google.com/group/android-platform/browse_thread/thread/74c3d9f549973a5">釋出 Android 2.1 版的消息</a>。不過並不是放在 master branch 而是在 eclair branch。沒錯，2.1 版仍是叫做 eclair，因此只能算是個小改版吧?</p>
<p>經過一番努力，我們已成功將 Android-x86 更新到 eclair 2.1 branch 上。遵循 Google 的慣例，這個分支就叫做 eclair-x86 branch 吧。取得的方法和以前差不多：</p>
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">repo init -u git://git.android-x86.org/manifest.git -b eclair-x86</span>
$ <span class="term_command">repo sync</span>
</pre>
</td>
</tr>
</tbody>
</table>
<p>也可從 SourceForge 上的 mirror 下載。</p>
<p>不過 2.1 版新增的許多 3D 效果，像 Gallery3D，在 x86 版本上不是跑不動就是會 crash。又有許多苦功要做了&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/02/android-x86-2-1-branch/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android-x86 2.0 測試版</title>
		<link>http://cwhuang.info/2010/01/testbuild-20100115</link>
		<comments>http://cwhuang.info/2010/01/testbuild-20100115#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:07:14 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=811</guid>
		<description><![CDATA[Yi 已經釋出了 Android-x86 的最新測試版，這是基於 Android 2.0 (Eclair)的版本，距離上回的 1.6 版釋出已將近兩個月。之所以會拖這麼久，除了這段時間我們都比較忙碌外，最主要原因還是因為從 1.6 到 2.0 的變動相當大，但 Google 釋出的源碼僅是最後的 snapshot，中間沒有任何的修改歷程(changes log)。這造成我們 merge 上的許多困難。許多原本會動的東西都壞掉了，包括滑鼠、Wifi、Ethernet 和 suspend &#038; wakeup 等，幾乎都得重新來過。
雖然經過兩個月的努力，問題仍未完全解決。比較重要的有：

沒有 i915 的 3D 硬體加速
雖然可連上藍牙耳機，但聲音出不來。
錄影功能無法使用。

不過除此之外，在 Android-x86 1.6 版所擁有的功能在這個測試版應該都具備了。
當然這個版本也加入了一些新的特色。最重要的一點大概是由 Bryan 為 Q1U 所加入的觸控螢幕校正功能，已經整合到一般的 target 上。一個 target 只要定義 BOARD_USES_TSLIB=true，在開機進入 Android-x86 之前，便會先執行 tslib 的工具程式 ts_calibrate 來做校正。只要在左上、右上、右下、左下和中間的十字各點一下，就能完成校正。接著進入 Android-x86 後就能正確的使用觸控螢幕。校正的結果只需做過一次便會儲存下來，下次開機就不用再做了。當然這是指安裝到硬碟的情況，若用 live CD 或 live USB 的方式開機，就無法儲存了。(其實也不完全正確，如果你懂得設定 DATA [...]]]></description>
			<content:encoded><![CDATA[<p>Yi 已經釋出了 <a href="http://www.android-x86.org/releases/build-20100115">Android-x86 的最新測試版</a>，這是基於 Android 2.0 (Eclair)的版本，距離上回的 1.6 版釋出已將近兩個月。之所以會拖這麼久，除了這段時間我們都比較忙碌外，最主要原因還是因為從 1.6 到 2.0 的變動相當大，但 Google 釋出的源碼僅是最後的 snapshot，中間沒有任何的修改歷程(changes log)。這造成我們 merge 上的許多困難。許多原本會動的東西都壞掉了，包括滑鼠、Wifi、Ethernet 和 suspend &#038; wakeup 等，幾乎都得重新來過。</p>
<p>雖然經過兩個月的努力，問題仍未完全解決。比較重要的有：</p>
<ul>
<li>沒有 i915 的 3D 硬體加速</li>
<li>雖然可連上藍牙耳機，但聲音出不來。</li>
<li>錄影功能無法使用。</li>
</ul>
<p>不過除此之外，在 Android-x86 1.6 版所擁有的功能在這個測試版應該都具備了。</p>
<p>當然這個版本也加入了一些新的特色。<span id="more-811"></span>最重要的一點大概是由 Bryan 為 Q1U 所加入的觸控螢幕校正功能，已經整合到一般的 target 上。一個 target 只要定義 BOARD_USES_TSLIB=true，在開機進入 Android-x86 之前，便會先執行 tslib 的工具程式 ts_calibrate 來做校正。只要在左上、右上、右下、左下和中間的十字各點一下，就能完成校正。接著進入 Android-x86 後就能正確的使用觸控螢幕。校正的結果只需做過一次便會儲存下來，下次開機就不用再做了。當然這是指安裝到硬碟的情況，若用 live CD 或 live USB 的方式開機，就無法儲存了。(其實也不完全正確，如果你懂得<a href="http://www.android-x86.org/documents/virtualboxhowto#Advanced">設定 DATA 變數</a>的話還是可以儲存下來)。另一個改進是加入 Eee PC 的螢幕背光控制。這也是在有了<a href="/?p=776">x86 多平台支援</a>後才加入的最佳化功能。</p>
<p>想要嘗鮮的人可以<a href="http://www.android-x86.org/download">下載</a>回來試試。不過若是以為 Eclair 版本有什麼令人驚艷之處，恐怕要大失所望了。光是圖型處理的效率非常低落，就令人難以接受。只希望在加回 3D 硬體加速之後能有所改善。但如果你是開發者，歡迎跳下來一起幫忙 debug!</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/01/testbuild-20100115/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android 還是開放源碼計劃嗎?</title>
		<link>http://cwhuang.info/2010/01/is-android-still-an-open-source-project</link>
		<comments>http://cwhuang.info/2010/01/is-android-still-an-open-source-project#comments</comments>
		<pubDate>Sun, 10 Jan 2010 15:59:04 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=795</guid>
		<description><![CDATA[關注 Android 開放源碼計劃(AOSP)的朋友應該會注意到，在 Google 的嚴密掌控下，Android 已經離開放源碼社群愈來愈遠。雖然形式上 Android 的確符合開放源碼的定義。但本質上，它是不折不扣的 Google 計劃，而非一個社群的計劃。從幾件事情上可以看出這樣的傾向：

Android 2.0 完全沒有發展歷程(git log / history)。
其實根本沒有 Android 2.0 的源碼。目前 AOSP 上的版本是介於 2.0 到 2.0.1 之間的一個 &#8220;snapshot&#8221;。更遑論即將上市的所謂 2.1 版了。
絕大部分社群送上去的 patches 都被忽略。從 eclair 之後似乎僅有五個 patches 被接受而已。
Project roles 頁面被修改，移掉大部分讓社群參與的字眼 (剛好被人抓包，把舊的頁面 diff 呈現在此)。
Google 的工程師不在 android.git.kernel.org 上工作。
愈來愈多衍生的開放源碼計劃(android-x86, embinux, 0xdroid, rowboat, odroid, &#8230;)，代表許多社群開發者已受不了 Google 的態度。

誠心的建議，Google 應該捫心自問，當初決定開放源碼的初衷是什麼? 到底要走向開放的市集模式，擁抱社群，還是走回更封閉的教堂模式，關起門來自己搞?
如果決定擁抱社群，便應該回歸開放源碼開發模式的基本精神，「儘早釋出、儘快釋出」，讓更多人有機會檢視 Android 的最新源碼，因為「在眾人面前，所有的錯誤都是淺顯的」(Linus 定律)。同時更應重視社群的力量，儘快的 review 社群所提出的修改建議，絕不可放著幾個月都不理。這樣有心貢獻的人心早涼了! [...]]]></description>
			<content:encoded><![CDATA[<p>關注 Android 開放源碼計劃(AOSP)的朋友應該會注意到，在 Google 的嚴密掌控下，Android 已經離開放源碼社群愈來愈遠。雖然形式上 Android 的確符合開放源碼的定義。但本質上，它是不折不扣的 Google 計劃，而非一個社群的計劃。從幾件事情上可以看出這樣的傾向：</p>
<ul>
<li>Android 2.0 完全沒有發展歷程(git log / history)。</li>
<li>其實根本沒有 Android 2.0 的源碼。目前 AOSP 上的版本是<a href="http://groups.google.com/group/android-platform/browse_thread/thread/93eaaf9ac90cbfab/da1a2c36a362a148">介於 2.0 到 2.0.1 之間</a>的一個 &#8220;snapshot&#8221;。更遑論即將上市的所謂 2.1 版了。</li>
<li>絕大部分社群送上去的 patches 都被忽略。從 eclair 之後似乎僅有五個 patches 被接受而已。</li>
<li>Project roles 頁面被修改，移掉大部分讓社群參與的字眼 (剛好被人抓包，把<a href="http://g1files.webs.com/AndroidProjectDiff.html">舊的頁面 diff 呈現在此</a>)。</li>
<li>Google 的工程師不在 <a href="http://android.git.kernel.org">android.git.kernel.org</a> 上工作。</li>
<li>愈來愈多衍生的開放源碼計劃(android-x86, embinux, 0xdroid, rowboat, odroid, &#8230;)，代表許多社群開發者已受不了 Google 的態度。</li>
</ul>
<p>誠心的建議，Google 應該捫心自問，當初決定開放源碼的初衷是什麼? 到底要走向開放的市集模式，擁抱社群，還是走回更封閉的教堂模式，關起門來自己搞?</p>
<p>如果決定擁抱社群，便應該回歸開放源碼開發模式的基本精神，「儘早釋出、儘快釋出」，讓更多人有機會檢視 Android 的最新源碼，因為「在眾人面前，所有的錯誤都是淺顯的」(Linus 定律)。同時更應重視社群的力量，儘快的 review 社群所提出的修改建議，絕不可放著幾個月都不理。這樣有心貢獻的人心早涼了! 唯有在對的方向做對的事情，才能讓開放源碼的輪子順利轉動，帶起 Android 開放社群的蓬勃進步。</p>
<p>明天下午有機會應邀到台灣 Google 演講，正好把這些觀點與 Google 的工程師討論討論。投影片已公開在 <a href="http://docs.android-x86.org">Google docs</a> 上：<br />
<iframe src="http://docs.google.com/present/embed?id=dd7z9dh6_7f2sbh6dg&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
<p>參考：</p>
<ul>
<li><a href="http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/397">Android 不是那麼開放</a></li>
<li><a href="http://groups.google.com/group/android-platform/browse_thread/thread/24b933012a2d28f4/d37c89a6151ec6e4">AOSP 週年慶</a>&#8230;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/01/is-android-still-an-open-source-project/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android-x86 多平台支援</title>
		<link>http://cwhuang.info/2010/01/android-x86-multiple-platform-support</link>
		<comments>http://cwhuang.info/2010/01/android-x86-multiple-platform-support#comments</comments>
		<pubDate>Sun, 03 Jan 2010 12:20:05 +0000</pubDate>
		<dc:creator>cwhuang</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android-x86]]></category>

		<guid isPermaLink="false">http://cwhuang.info/?p=776</guid>
		<description><![CDATA[其實在 Android-x86 計劃開始之初，便已考量到儘量支援各式各樣不同的 x86 平台。在 Android build system 中一個 target 是指一項特定的產品。但 x86 平台有千百種產品，這樣的架構似乎並不很適用。只是一開始對 Android build system 系統也不是那麼熟悉，一時沒有更好的解決辦法。只好先沿用原本的 eeepc target，但其實並不是真的針對 eeepc，而包含所有可能的 x86 支援。反正先做再說，邊做邊改。
不過在更多開發者加入後，特別是加入了 q1u 這個 target 之後，這個問題已經到了必須解決的時刻。否則每一個 x86 target 都會有非常類似的檔案，這會造成維護上的很大負擔。
仔細研究 build system 後，發覺 target 之間是可以繼承的。例如大部分的 target 都繼承自 generic.mk 所定義的 generic target。仿照這樣的做法，我們可以定義一個 generic_x86 的 target，讓所有其它的 x86 target 來繼承。這樣做法有兩大優點：

將所有 x86 平台共用的規則集中在此，避免重複，方便維護。
讓特定的 target 有機會針對其硬體做最佳化。

經過一段時間的試驗修改，已完成了 generic_x86 target。仿照 generic target，放在 build/target/board/generic_x86。將原本 [...]]]></description>
			<content:encoded><![CDATA[<p>其實在 Android-x86 計劃開始之初，便已考量到儘量支援各式各樣不同的 x86 平台。在 Android build system 中一個 target 是指一項特定的產品。但 x86 平台有千百種產品，這樣的架構似乎並不很適用。只是一開始對 Android build system 系統也不是那麼熟悉，一時沒有更好的解決辦法。只好先沿用原本的 eeepc target，但其實並不是真的針對 eeepc，而包含所有可能的 x86 支援。反正先做再說，邊做邊改。</p>
<p>不過在更多開發者加入後，特別是加入了 q1u 這個 target 之後，這個問題已經到了必須解決的時刻。否則每一個 x86 target 都會有非常類似的檔案，這會造成維護上的很大負擔。</p>
<p>仔細研究 build system 後，發覺 target 之間是可以繼承的。例如大部分的 target 都繼承自 generic.mk 所定義的 generic target。仿照這樣的做法，我們可以定義一個 generic_x86 的 target，讓所有其它的 x86 target 來繼承。這樣做法有兩大優點：<span id="more-776"></span></p>
<ul>
<li>將所有 x86 平台共用的規則集中在此，避免重複，方便維護。</li>
<li>讓特定的 target 有機會針對其硬體做最佳化。</li>
</ul>
<p>經過一段時間的試驗修改，已完成了 generic_x86 target。仿照 generic target，放在 build/target/board/generic_x86。將原本 eeepc target 之下大部分的東西都移到這裡，例如 keymap 和 firmware 的檔案。相對的，eeepc target 已修改為僅支援 ASUS Eee PC family，包括 Eee PC 背光支援以及針對 Eee PC 最佳化的 kernel 設定檔。</p>
<p>請特別注意這意味著 eeepc target 將不再支援一般的 x86 平台。也就是說，如果你用的不是 Eee PC，那麼指定 eeepc 為 target 所編出來的 image 很可能在你的機器上開不起來。</p>
<p>解決的方法有兩種：</p>
<ul>
<li>改用 generic_x86 target<br />
<table class="term">
<tbody>
<tr>
<td class="term">
<pre class="term_text">
$ <span class="term_command">make iso_img TARGET_PRODUCT=generic_x86</span>
</pre>
</td>
</tr>
</tbody>
</table>
<p>其實 TARGET_PRODUCT=generic_x86 可省略，它是預設的 target。
</li>
<li>針對你的硬體自訂一個 target。細節請參考<a href="http://groups.google.com/group/android-x86/t/5ed8d1aadf9a263d">這封信</a>的說明。我建議你儘量這樣做，一來可以針對你的平台做最佳化，二來可以把你的成果貢獻回來。</li>
</ul>
<p>目前多平台的支援僅放在發展中的 master branch。至於是否反向移植到 donut-x86 branch 還在考慮中。</p>
]]></content:encoded>
			<wfw:commentRss>http://cwhuang.info/2010/01/android-x86-multiple-platform-support/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
