<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1795333590425870072</id><updated>2012-01-05T01:33:36.197+08:00</updated><category term='arm'/><category term='doom'/><category term='linker'/><category term='power management'/><category term='omap'/><category term='osdc'/><category term='vm'/><category term='libc'/><category term='beagleboard'/><category term='openmax'/><category term='benchmark'/><category term='assembler'/><category term='opengl'/><category term='mesa'/><category term='devkit8000'/><category term='llvm'/><category term='eflow'/><category term='0xdroid'/><category term='jblend'/><category term='busybox'/><category term='coscup'/><category term='surface'/><category term='gcj'/><category term='dalvik'/><category term='gstreamer'/><category term='esuit'/><category term='toolchain'/><category term='elf'/><category term='graphics'/><category term='0xbench'/><category term='simd'/><category term='rloader'/><category term='native'/><category term='dex'/><category term='amber'/><category term='android'/><category term='svg'/><category term='aster'/><category term='eclair'/><category term='kernel'/><category term='0xlab'/><category term='kaffe'/><category term='smali'/><category term='decompile'/><category term='neon'/><category term='gcc'/><category term='linaro'/><category term='compiler'/><category term='gallium'/><title type='text'>Hacking at 0xlab</title><subtitle type='html'>Something hacked by jserv at 0xlab.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-7073243080334557768</id><published>2012-01-05T01:18:00.005+08:00</published><updated>2012-01-05T01:33:36.209+08:00</updated><title type='text'>Development Progress Summary about 0xlab</title><content type='html'>Last two months, I was so honored and delighted to be invited as the speaker at &lt;a href="https://events.linuxfoundation.org/events/embedded-linux-conference-europe"&gt;Embedded Linux Conference Europe&lt;/a&gt; and &lt;a href="http://droidcon.nl/"&gt;droidcon.NL&lt;/a&gt;.  I shared the progress about our development and various improvements for Anroid Open Source Project.  As the developer at &lt;a href="http://www.linaro.org/"&gt;Linaro&lt;/a&gt;, &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; already contributes some fundamental works, and these eventually become the base for further collaborations.  The topic of the presentation is "Develop Community-based Android Distribution and Upstreaming experience", and you can check out the presentation material as following:&lt;center&gt;&lt;div style="width:425px" id="__ss_10773288"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jserv/dev-androiddistribution" title="Develop Community-based Android Distribution and Upstreaming Experience " target="_blank"&gt;Develop Community-based Android Distribution and Upstreaming Experience &lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/10773288" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View &lt;a href="http://www.slideshare.net/tag/0xlab"&gt;more presentations&lt;/a&gt; by &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/center&gt;&lt;div&gt;Recently, we are quietly improving the performance of Android ICS (4.0.x) and submitting patches to &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt; as community collaboration.  Most of them are merged in &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt;, and we are moving forward in more areas to enhance Android software stack.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Look forward to your feedback and the opportunities to work with each other.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-7073243080334557768?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/7073243080334557768/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2012/01/development-progress-summary-about.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7073243080334557768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7073243080334557768'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2012/01/development-progress-summary-about.html' title='Development Progress Summary about 0xlab'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-1694409666580367729</id><published>2011-08-14T15:04:00.009+08:00</published><updated>2011-08-14T17:42:55.377+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='linaro'/><category scheme='http://www.blogger.com/atom/ns#' term='0xdroid'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='amber'/><category scheme='http://www.blogger.com/atom/ns#' term='0xbench'/><category scheme='http://www.blogger.com/atom/ns#' term='coscup'/><category scheme='http://www.blogger.com/atom/ns#' term='aster'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='linker'/><title type='text'>0xlab 一年來的開發狀態更新</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-zM_0kEepAUo/TkeKXt7wfpI/AAAAAAAABQY/C8Tf5w78afs/s1600/0xlab-mwc2011.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/-zM_0kEepAUo/TkeKXt7wfpI/AAAAAAAABQY/C8Tf5w78afs/s320/0xlab-mwc2011.jpg" alt="" id="BLOGGER_PHOTO_ID_5640629198376697490" border="0" /&gt;&lt;/a&gt;忙碌的日子總是過得比較快，這一年來，&lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 歷經頗多轉變，主要有以下三方面：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;技術涵蓋： 為了加速 Android 系統整合與優化，我們建構了若干工具與提供一些創新的方法，比方說快速啟動 Android，詳情可見 &lt;a href="http://0xlab.org/technology.html"&gt;0xlab::Technology&lt;/a&gt;&lt;/li&gt;&lt;li&gt;與知名專案與開源團隊的合作：除了過去已合作的 &lt;a href="http://www.android-x86.org/"&gt;android-x86&lt;/a&gt; 與 &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt; 專案外 (主要是 Graphics 與 ARM 相關效能優化)，我們也投入 &lt;a href="http://www.linaro.org/"&gt;Linaro&lt;/a&gt; 的開發，建立 &lt;a href="https://wiki.linaro.org/Platform/Android"&gt;Android platform&lt;/a&gt; 與 LAVA (&lt;a href="https://wiki.linaro.org/Platform/Validation/LAVA"&gt;Linaro Automated Validation Architecture&lt;/a&gt;) 的基礎&lt;/li&gt;&lt;li&gt;建立與主要 SoC 廠商的聯繫及協同開發：與兩家重要的 SoC 廠商 (排名 Top 20 半導體公司) 密切合作開發，在 Android 的基礎上，透過若干開源的創新，加強 SoC 競爭力，並導入產品設計&lt;/li&gt;&lt;/ul&gt;即使比過往忙碌，不過我們仍持續貢獻於開放原始碼的世界，以下是從去年發表「&lt;a href="http://jserv.blogspot.com/2010/09/0xlab.html"&gt;簡介 0xlab 新的開放原始碼專案&lt;/a&gt;」之後的更新：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; :作為 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的 Android 參考優化與客製化設計，其成果不僅為 &lt;a href="http://beagleboard.org/"&gt;Beagleboard&lt;/a&gt; 社群所熟知，許多內部的改進也廣泛用於 &lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt;，間接使許多裝置與公司團體受惠。可參考 &lt;a href="http://code.google.com/p/0xdroid/wiki/Roadmap"&gt;0xdroid::Roadmap&lt;/a&gt; 以得知細部的演進，簡單來說，在高解析度的環境，提昇了 Android 使用者體驗 (software curosr, on-screen keyboard, launcher)，另外就是進一步的 ARM 優化，從 skia, zlib, libcore, libc, 到 libagl (libGLES_android) 都有&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/0xbench/"&gt;0xbench&lt;/a&gt; : 仍是截至目前為止，我們所知的最完整 Android 開放原始碼系統效能評測工具，與上個版本相較，追加了 Web/JavaScript 效能評測、LAVA 的資料格式 (bundle)、重新啟用 &lt;a href="http://hub.opensolaris.org/bin/view/Project+libmicro/WebHome"&gt;libMicro&lt;/a&gt; 等等，詳情可見 &lt;a href="http://code.google.com/p/0xbench/wiki/Benchmarks"&gt;0xbench::Benchmarks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://wiki.linaro.org/"&gt;Linaro&lt;/a&gt; : 經 &lt;a href="http://www.arm.com/"&gt;ARM&lt;/a&gt; 的支持，&lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 投入 &lt;a href="http://www.linaro.org/"&gt;Linaro&lt;/a&gt; 開發，共同為改善開發原始碼軟體品質而努力。我們涉及的項目稍微繁雜些，從整合 Linaro toolchain、改善 Android runtime、強化 LAVA 的整合，到多媒體驗證都有&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/aster/"&gt;aster&lt;/a&gt; : 全名是 "Android System Testing Environment and Runtime"，著眼於 Android 系統中許多無法透過 API 呼叫所作的 black-box test，一旦 adb daemon 正常啟動後，這個系統就可依據指定的 test case 去逐一執行並驗證，此系統也允許使用者編輯操作案例&lt;/li&gt;&lt;li&gt;Android 快速開機: 利用優化過的 ARM hibernation (suspend-to-disk)，大幅縮減 Android 系統從 HW reset 到使用者得以操作的時間，可參考展示影片 "&lt;a href="http://www.youtube.com/watch?v=pvcQiiikJDU"&gt;Android Fast Booting with CarHome&lt;/a&gt;"，相關的原始碼也一併釋出，可見 &lt;a href="http://gitorious.org/0xlab-kernel"&gt;0xlab-kernel&lt;/a&gt;，儘管仍有頗大的進步空間，但這是完全可運作且開源的解決方案&lt;br /&gt;&lt;/li&gt;&lt;li&gt;AMBER : 這是我們提供的第一個完整的應用系統，概念非常簡單，考量到現有 Android 裝置相當多元，可能是手機、筆記型電腦、平板電腦、電子書，或者數位電子，這之間要進行媒體 (media/content) 的交換往往很沒效率，而且使用者還得被繁複且多樣的多媒體格式所困擾，若無適度的轉換，通常就無法在手機或者較陽春的平板上播放。我們提出的解法，就是將動作縮減為 "push" 與 "pull"，自動偵測媒體的格式與屬性，無論在近距 (家用或小範圍) 或遠距 (透過雲端或者防火牆)，挑選最合適的途徑，讓使用者盡情觀賞與交換。同樣的，這也是開放原始碼，內建於 &lt;a href="http://2.bp.blogspot.com/-c76vtJcvYkY/TkeU2hqihII/AAAAAAAABQg/0qEW6ZM89Wo/s1600/amber.png"&gt;&lt;/a&gt;&lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 138px;" src="http://2.bp.blogspot.com/-c76vtJcvYkY/TkeU2hqihII/AAAAAAAABQg/0qEW6ZM89Wo/s320/amber.png" alt="" id="BLOGGER_PHOTO_ID_5640640722775475330" border="0" /&gt;&lt;/li&gt;&lt;li&gt;Toolchain : 除了改善 &lt;a href="https://wiki.linaro.org/Platform/Android/AndroidToolchainBenchmarking/"&gt;Linaro Toolchain for Android&lt;/a&gt; 外，我們還改善了 Android ELF prelink，大幅縮減執行時期需要解析的 ELF 符號數量，也縮減了載入時間，近期內會提交到 AOSP&lt;/li&gt;&lt;li&gt;&lt;a href="https://review.source.android.com/"&gt;Android Open Source Project&lt;/a&gt; : 已被 Google Android 計畫正式收錄 37 個修改/貢獻&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;其他項目就要看合作夥伴的狀況了，先提到這邊。歡迎透過以下方式，與我們聯繫與交流：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Twitter: &lt;a href="http://twitter.com/0xlab"&gt;http://twitter.com/0xlab&lt;/a&gt;&lt;/li&gt;&lt;li&gt;郵件論壇: &lt;a href="http://groups.google.com/group/0xlab-devel"&gt;0xlab-devel&lt;/a&gt; (系統開發) ; &lt;a href="http://groups.google.com/group/0xlab-discuss"&gt;0xlab-discuss&lt;/a&gt; (一般討論)&lt;/li&gt;&lt;li&gt;YouTube: &lt;a href="http://www.youtube.com/0xlab"&gt;http://www.youtube.com/0xlab&lt;/a&gt;&lt;/li&gt;&lt;li&gt;有源碼有真相: &lt;a href="http://gitorious.org/+0xlab"&gt;gitorious&lt;/a&gt;, &lt;a href="https://github.com/0xlab"&gt;github&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;一如過往，我們今年也會在台灣最大的開放原始碼研討會 &lt;a href="http://coscup.org/2011/"&gt;COSCUP&lt;/a&gt; 發布最新的專案與社群計畫，期待您的指教，謝謝！&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-1694409666580367729?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/1694409666580367729/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2011/08/0xlab.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1694409666580367729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1694409666580367729'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2011/08/0xlab.html' title='0xlab 一年來的開發狀態更新'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-zM_0kEepAUo/TkeKXt7wfpI/AAAAAAAABQY/C8Tf5w78afs/s72-c/0xlab-mwc2011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-3476704440363208583</id><published>2011-02-07T11:40:00.014+08:00</published><updated>2011-02-11T09:16:19.969+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='svg'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='rloader'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='gallium'/><category scheme='http://www.blogger.com/atom/ns#' term='osdc'/><category scheme='http://www.blogger.com/atom/ns#' term='mesa'/><category scheme='http://www.blogger.com/atom/ns#' term='llvm'/><title type='text'>0xlab 在 OSDC.tw 2011 的議程分享</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAABQCAYAAACeXX40AAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7tXQl4HMWVruprLl3WfVmW5AsssI3NZRuDrwVM1myyiZOQQAj7JRDY3IEl2RzrhIQNSfhCvnwBcpF87CbZhITNcjlAgk04F2OD8SnJsi3r1mgkjTRXz3R37f9akpGlGWmkGUkmO/W53ZruqlevXv316tWroxnLhIwEMhLISCAjgYwEMhLISCAjgYwEMhLISCAjgYwEMhLISCAjgVmQAJ+FPCbNYk09q3BVsvu4wq4VUXbc8eyqb7L7Sg5bLmvQMIy+zs7OwUOHDsVASExKLBPhHSUBea653bCrKMtRF+phnC3m/qyDXI7WGnUdH3Q0VDdJPo0Cy87O1h0OR8zr9VpzzW8m//RKYM4BWPNg6DDnLFe76eqrXY8ualIeXvqa8YH6y80L/Cu131cdNSVT45zrJSUlEVmWjQwI0wuAuaY2lwDkG0PsVXS75zufXPlp6dVcD4SRLzl5mNUoQXNx8xpzo3+J1lI4IDq1KOOW4Xa7o0uWLDGOHTuW0YRzjZw05T9nANzsdSzhLvPbSmPtffKXFx+V3LzMsqxBbvKm8Ode/CqMPZXlBOdFNx9fo7WUR1irFoUmjKLcodzc3GhHR0cGhGkCwVySkeYgcxr4SMKjv4i7pdx1zm5pnqgUQsQAsNbovx88X5JZlsRhFQKFwsC/y7ybWJhfLEnSMqQpKigo0HA/KwZQcyC/v6ksZwuABBZcO6Q6tl3dcrJ0q5BZkfPplXdKvRJpviyAaxAg7OJ9jr0kYSGYsHBJEuPy8SyVq1IN3lfCDswNhULa9u3bZ4v3v6kKP9sKMxuVKG346AbHFq/js5sCO/aUhB8JiNLOJ5jFhH5B683W7c03SjlWEcClQgNq1r9UNbG+rJ9xAM8GX3dJkD9W1Mo1QYMQHQI0nU6n9cgjj2RcMmcbmqbBz4x2Yxteqy7l553chVFuDQDlsPkbgc2onC2AUenP9qo/WX0/3+15VZIlv1gaLEMHvYg1OyuYZHmgITsB0jfhF3wzKyurHQCMjKI2jaJnkpwNEpgxAG4cZN9iCvsSI02WjK4CJwL6WD1S85b22fN+xjzMB8BF0T2rAB9uVi/ZiLqutwOEwd27dxtngwAzPKQmgRkZBcO98ryksutJ2wFTSYOcI75V2F9ibR68VN5T2CeC0iBA14nrJAB4yu/3e/F3COAzUyt2JvXZIoH0AnA7kzfvYfu4zC6hAqLrTRp8owViegJO6++aLtSeWNrNhRSCxuuFNuzDRZovMyV3tqAnDXykFYAb97BnAL61qfJlA1dhknlVw3nyk0t6FUmJYgBC2jDY1NSUAWCqAj6L0qcNgJsC7Nvodj+SrrKRC4Y5mSJWRhcqT5X0CUlEyFFdV1cXqq+vJ/svGcsyXexk6MyQBNICwE1etoq72cMCo9npdrtjy0d0CISisN+p+Eo8rMkR0hxaIBKJDBQXF4dbW1szduBYob0Df6cDgLzm6+wNlD0rXeAbkSPRo4GJeWFzofro0hBswDDe9cMP6M9Mx70D0RaH5ZQd0Rt72VrYfSUAy4wFzJow88a287nFz1UUZRHcMoXD03Ep8z9jTGcIJyWBlDTg6h8z1XUxOzEb1phxbodH+83SCPw6QQxGenD15+TkRDKLEpKq57M2UkoaJPsDbAUtSTHtZQMzHKgr/kTLIpiFC9EV16qqmp/RgjMs81kgnxIAZY3dA1wIWUzP3zeV8gmTieiqlmxuSJVIVxONRkvhmnHj7xns/KfCYSbudCQwbQBuOMFKmcw2zQb4qGC0PMss6ZFFvlGM7nc+7MByXNkbNmxQp1PwTJqzQwLTBqBUyN496ytCqRv+5IlSYQoCH60hzIcdSACcdjnOjmr4/8vFtCsOI9ONSS0ySKNsORCv1x1RuYMVgGw5NGEB/IIu/J3phtMo59kkNW0AosavnE1GR/IilwxziByArwgzI4XQhG7MjqQ0mp+LcmTyHJLAtAB45dGSGvj+8uZCiLRQVbhNl2WyeRgJzwMQ3XBMK+AlowXnokJSzHNaAIwt6HqOFpGmmPe0kgOAjF3iz2KWyMFf8+CY9mBqLgPAaUlz7hNNFYB8c4g9B5O/2t40NEfBuMjrgFvGjUFILu0nQSAAZsI7UAJTAiBNu8H1MuuDj7FyNQsCnFsSDT6yYQN6ent7VbhjplSWsTQzv+dGAklrjpVvsDxU+YvkepnrmjYLaZG0UKEBCYRO3JXBwcE508hzU3V/G7kmDcCCxWwHGX2z7XoZK2ZqAALzH9g/QrvoaKOTBjtwrtvEWDYzv5OUQFIVt/lIdgHOKfjMTK54SZJfuwGQquNuUwYAVdq0hJ8K/IEZDZisEM+ieEkB0KoavAv7eM+uoAGL2EsMG1CFG0auqqrKAPDsqqGkuEmqC5YUduvcOF0SlIEag9NURJBrAKDTNE21v7+fGhOBMJ57iO/YsYMuhhMVpgRU2gBP6XDNRROMx2u88iUQVFoezygP8YifwfXGAPslAHhjWoqSLiLg2vnri0P8dyX7cLrWn9AVPx2LxRp27twZQBZxgbKa3axqrE+B0WjPmsRY9iRl72F555tKsCAoMN9sDgwM0GYoY3hL6GyAQNrOtvPWNa1aYWEhb29vZzAzDBzUSVsRZmM7AuSzg29gu6Xsbdl0Fg/r6ekRWIVk7N27l/KPK2eKN5UwSSUwtjHMaHjpOb3cHj/ICT2XfkC7gICA673bcKAl24VfO6EF3+jq6vJBOAQUO2zsY9fCdr0VLFehymSoSAnpJi3zcHKD6Z5W7bfLHzL/WFgvOQw/hN+PAzMDADrlkZYKGOF19H2Tj12J4dWHwHMJD+WcdF+/4QHTaaKNxQKweQf6+vpCKOeMbsza5GefhLSukCzmYj1lB5wLNz5kXN0rQc6D4GMA/EbScTjAhHOoG/rZB7Dm70OosaFKw/90eoHjWI2w8vuTrch4Mk75mYDxoFj5Cj/i6UeldEMLdkNTDTY0NNgnJmwKsq9gl95PIMSFAGkxNGUhtnoW4MpP8iq0HLEa8+LW9zkjRUI+mm2CBh3RQGcURmfqjEL0OPfA3fWgJbOVkPVC7tYvin6w/lbtYFWb0uNSFU3BRhkexWLcGFaDp18T72DKpqfYC0Jjt6CvWAYeFvPcwHrzswc+rD67+ITKNCc1PvCgw+42T548mVJDnBCAtV9jz0Hz0cGRQwGQcz20TrdKwtwq7k1qAJMy0hIQoJUxVmlEU363IABt0Y8BSRdaZ39lZaVe+3pXmXAYj1OzSWWjFKWlnX6xS1ouUp+r1XlYEqQBw+FwYMGCBdFUhT+2aJf72FqA7yFoaWrnqOOhhk/Tj+a6ExuV3y3xkQGBQVcArqfQ6tWrY4cPH04rCDc8zm5Dg71lxKA+LT8Hc0lV6nn82fxBSZMszMMPgv8w9mmndERKQhCtrmeFyLxwtJCEjtXPz+ZHuGbOhg0ytn7O/A1wGWU9MrtyYAFe1OCqwgrpPO/uIklWw++jk7VOa+6JKU34lkwNiURcFb4IA55VAPoigJAWYqR9/lnR2DXDbqYzexdAzPRAly+KXoZ8V6GhVQMA2QDfhApkwoIleAktfwsJblwAD+G1RxZwiV+ClrEccqCj8tyYgUqJh4QAzClm68DE6ffUJJ27L4gynQcFhw1/FgQJzSBy3cECWGOVEEo1AFKcx3SHKQ0dDZIuFsnm5TmiCPlUo/IroX1yQTspD8KUeJDYqkTxaXsqzzHKqJy47NXgMDmo8uPBJRGZSZ+j4Z6XKJKdUbFRjf9rkH8p+HC7XK6UeEgoRMnJvm8BdPbMBxU+jEq4vyIoFN5rqTGagchKxOisPSfNUOxV0C2VcMGrcYZMRUFhzolBDDjSWSukBYVl4bB0loM/cyF4mgJU6JBMctOMnoeGYU420bDU4kqCWOOUhqYP8QUAMZzGwqGcE/MtuBN50yqgPDQEJ74cMFL5p+lN1SGP7lzU1taOnLeYxBonQSbZPLrASzYNzFAWjoMCqMynA3gT42iPjjD8d1wArj/JyqD7atDqiCinRaCO1+t0Lku0ObyNaWZ+HFpz8wi8GTe3lqsPzCfNNN8oCxeg0aTULcQriBA4L1Ng5oVZNAetsN1FRnDX4aIt3y5apLwc8PIbanr5NUH5sssu0wGOyCuvvEKHaY4D4qYD82vhC6qQ/hzr0m6r6jM3DxB4dICQRnWTtRtyvpNLhKYflZO7mXHl8wsreGm0WoTanAVBdKAxSZb5ZDhGnfYog8pDlc2wZ3WcOhZDYwqhMQWGajyeBPAMTUssitAgpELkGheIspCqFUS9qjsaXYhTVCgV3AxcOp7bpf9bSbNaZVhYKBLetm1bGI0tGm/UHBeAjgK2FK3RtuGJKHW/yg9q/YJb/cLkzUyNLE7A4sw/tpsEMTV0p91y+pVvuJVflJcInVdxj1zCDA0ApPPMxweYDwLnTqMGznxHZSS7cXyKt5+gPaLRcykmxxS596kHdY/5YXobe7+XKWvb/6x8cfkP86Q8Lw2ItmzZ4hvtLrmqpTI/VtC6l8st1WRAGx9rYcoVtX903173E2wr9G1m1zYL8zEpYcdO/MrgHmwSD1Z5yFPrxzl1zvHmRrIGemzrfuZ8eO0XlKcKDwAgXXXstuNMun9ItnEEQbZw8I5d2VxjKyD/FWNlOJJEXAT5XsPala9cdYfS6m6D26bT4/F0433fWLJxAYgCLBttHLqeXjGIStMB73YU/phwhNaPJTRrv6lVUEscZpC6R6yOFqJCz+cnXBWSU1Rww6GJRACUGc+6/3KT78oLACg94LubGTxgfKp5cXTT/urJygGQC/PnL36PecyVdiMYDkZF+xbjx+3r3B/c9i3JKTWgCzoCB3I7RqqD2Q+fKjCKWzvsChtOYx85suj4u40veCqV71T/Vlsu74tFsdlg6BzZuGxYNCCyi2/JoXv//ARGq57RPMRNNMFDIha58eV73Ueu/KnSqO2rZJ1KjOQ7pnGOJkGjYj4Jwu30HlYeuvvpn7k+fO29UNZHYTMewNNxAByNs9P54JT6NaBhs2FBINKvKrxcts/nOyEss8mSI3M3CIGApOYqob22zBrRV6S5jJuai0RYKjYkaz4z3BNUI5UK++qEIGdqowjzF2Nfa3TpW5IAHxJIK0IlVl5gZdwV4R7mCv/8lTuNLrYOI8TVuKrKLs8tlmu9x+DOGReIRnT9gQtFobkJ52RfxGK5ZFsmDHTULI4n4WyjfzGMAA8d5J4wcpIvCITBu5/5GDfl9XJd4kEQkaMyAPRJB1iLLusTrR8RFl8LeZ8TL2FcAKKlrbG7X/zn+emao7xPwXEYUiu0X4Mw5VOwsFLy/cRjZCrP+ICLyXcv9HO/26ATtKgi9ZWNmpQfy0NLq+ARmeyUhAEdKVXjIMbyp2LfOXJBdPWRy6grT5hg5AW1yiWh4oQzQXhvlfRkG/+x75/MbnxWgkkXhO567i0M5mgmaVw4PZs0z1gqKeJcKeqYkG8iQHwal3gXU8WRNhpHdKoPCFQalF5+9DzuEcsmomiXYXIpneaANGH04sZy6Ic6AHBJPNbiAhD5lNiMhDANt7MQxordVdVjFqBBoD9H64vTnuORn5lnss9lwRwIue684lV0B3Zj4PjfXBZyYtg+jxs05Zs4cEgD3XYs9vnm5UZd4xZMeSU3tUitstsRnshWJPPAqG7NNn75xg3hXz3xIFfx9adElTb8nMd4Fmy/QmEqSW2yF54onQiRnjACYYUXcMUqs63MNAVy4pvZgzi7wCoBydJ4ZBMB0EQFRZzXv+u73BQ+JGwA+A7C+Xlc7VD98QjN5jPe76Cq07lPbc369NXfkqJswLYLq7AokLSbKce1bUd4pAGWeV1XWeyKty61fXxT0STHnD0QrDmhpiAQ1pzKZm6mTagxyKDzuwVAbUKzTWJZDXNPhoe9NzXdAaNrLqUP2GBvRK44ZpncR2/PqI1iPS4AmT/rFu2mq9ahO+uA1XMY4NuHi+7dbfVt9HmEOQ28XyZ/FdmhA6xHq3dfv/Uf5ebKv/JBeT+N0oWceKaGgBp9b6Mjuv21YgLHVBdViB416Hxg/R0TAoukQ00kkeYblp6IMeG6eXMAFmkv2kAHUwxy3Uwa4tmTkyaaJAK3B9eYgZ6ZQHTjKoW4D7XL1v9Rq9OKMdo6it7qFK5eEGiFo3dwL9trbJpUtDNTihGqwqdZEBcNJKjC/FgYfcp16+pbhUNUWBGWZTn0NYk4IBvKLO3EooK3u12yI2FcQ/6JUg09t3snjon4v+Q0aMvr7tQvP3QP0ZsqiEe+AOX+9NawMIQXDb3J1K1DTItcMDEHk78lN5PcPJ/JfW4L7h2Y82iSTLYidUddk/FJvs6JRsBEW2kth7kDwkNeQXhcBTOr2tSJZId2SM6vuJ17XADuPLbT2FC5oQ9TPeRMgz4xIxBScHgZkt2DxaU2uXzSEkPuhS9YIm8eow8YwvkfGbC4pbsVd7/VJKs8a3AgkfKxK2GU5rPBB13qfGZVTL9q36Q2GHoBAbeCbnyu+vfKr0OFxtITd0zFIibh4exr7r59c5h1KV7Ysg1oSHtFn7rfdAy8L2W5wuJ3/KHWYLtz+pglnYK92yza1W6+5+jHMXhMScNRJ619c4XOW1Qyy04BdK2i0rACv2h7/0QAnKjS43fBABi81uG2trZe+LN68HGYAYCPwDikI3iS9spEOafwTvgUE+4D0oDUDUdhm8bo4zVYmdET6uhtM7VQUl0Z2XFSjHHP57YGeK8WSoYlAJ4WZVpGuRE2z19/j3J8/o+Jjn2o+iTBPvMa8xier26OsqOePoCvCfReRzleN4+wRsAjLe4toUDraayfOcxjpma8JHqlJ8BjcjbmRGVA7WMuKMZcwoczwQ9bbut5Vqw/N13wUVZxNeAwDyatfMUVj6XUCxOPahLPyOkM/QvXi4hBK+vQSDEsxzdeeuklahz2iHiznISwARpa3eO5ZWuQ+dVu4bDbFi0ymDTAv2dhnjMavLIzEj7n0q9q3pYtUg5bOBkEafTs/OWllnjNHcZceze04VHwvx/laNDZcnTFj05iBEzKmh0BKh5krRD47AC46wc6HftUW++nIwDcnA+C/ilQOyiqDT0VACbSgBNxSr1EWgQ1USYJ35FBEbN98VEINwLzIIZpHuLntIDxx6TC5hhKuW96FxxN6AY5r8e0ekvCPOO8wBc7xTPPPBN29D/yGSsJ8NkkwFX4hlclaS19GFQM4OqmgR2ZELvZDoNsrDhZTf0RTcjCRgZtMp0CIbbIn3LXPsyF/RVTLMrFzzD4HxSFQVoXOO0wHQBSZmbcY3mplKRZ0iPGuIUiI5lcFhAwdbMk4JjP50s6R5s3rOxx3XSNzgPyADrxZhZkB6zsWHvcDBM81Otd1pZ+9i1sjf8yNEDy+UODB/91d55Y318Ckz8P5SDnOdwfq1WUjfytqQd05CKKtRMRWbG8lprN+jE1mYYAtEiGjJ4DujwsyVaHpIpTqR2LMlEXnJBj+Hei2CtwhveM7BulpRyjL4+IrWikvRfjAu3gdT290gxvfVOW4lhpwwY6s7+LHie9/Z50XcxeIkruIGqFUSxpSloj25OpwUKm34VzBmUrX6jGCqHpi6zsnklnIahAyA+6BR9yevW52wG+L0712ygjc9ehT72w1BO7ok96NacHWjy4mVWEubmXiUmHQePEesYD2810XaOTvUddKtRouXCH36MoT4YhuhQpU88DoX/pYDbqYRV3RBZb7tBNQgkmLft4nE8HgJhGYKdoT8YZHn4V9s2ji2OsRw0BgONsKQKoc3edkO9aMOjUTCmy7kD2WLcAgcO9/V3R6D1vyNHydinee8kH950BUUgWOZ1D1B14vd4zuuB4BT39DDUhCnu4iQvPaMaELlrfllSQLMky/7lljTlvwNZ8U3JiD+dggxDyCH7++Us9n97ap3RoMeUCOaTrbk04kxoLJeYV5TNLOqlno3lluooTR57aGwK3WdVCI2laC/r2etA4yiJZytPqgjHzcGRcQmLr2dyI8Cu+cRP1YJD8bPJ/l0dxrGS/vLP44NjpLHuZFCw7EeER9ZHFHWiv48wW8iSpexZgFkKQ+wUnFPEgXCKxoqKilFphssKy45WaWZGr3rwbmjgh+OwR8STmCIGQGlzgezuvhiwuZLnmChb2pHUmYkrlmqPI43CUDB9GyHF4bDzny+fQwCAkRaXOse9GKoM3uXSo727R5XhzrFsS9cUdr9TBnScF+ZP5+9HaxoMKkeRX8wwMJiO2ASwEgZAWc6bQBsdxO+EDsShYTJpgrHYenYgal9pQY7EBJ1y7E5AD1xgNc1GqL4M/oo7rzqRWmafDozIBV2l/RcMC1FPcOppIPAkZ0bqqD53xEjkoL5RE4R8KsjBvG5cQ77VX6uA84dS/eFmLchDjWB1u+tOBACk9XRoVXASEy+xSDy16fqxvjSpeHHZG4S+jj9X40f0G4Goge/CMwoH2lEa04/gd84C0s4QdcdS7sbyYYyxfY2WhHqo15Tvr/K6bt9RLfVnRCeNTYpnlY7nbfKnfE7eSbPrUQnVaj4W57j4XLSVLf0AvhkFZ+qZawbPaUwSr2Z48jOu6mxYAn11Vf3rESMI1aZH4IU8QGqlfBOB9x8+xQld2FRtCsmwAYuzUzf1ZfxqdOc2LSoc8OjRGAFrBp7xZ+PTobpro8e5CAecttKit/XphvAfgDiHn7RkVZ/UV/CFdtUP5wt7lzOuIgTedNbtgnA7ZcGPzIKCi4VjKvy7zSzJvgVdyn/OO9d+VIsw/Vh6Ulp5ZZIXjg7RwHjuVo7md4w2PoXhkc7NORwzxdPm1wsNUpSh0YsCOZS6Z3w4hqyermuLxmkzysXHslfTP1WDSgJxeWFsVJ0wLgEQHgNlHPiG7uzleEWZDq2S8wHmb0l7x6BngITfFQZeOlk6rkHth3/Vp+6t/NFp8cljDfKwgcJF/zMf+WPACvR/RkmRDavvnxzD3SB8s9MF14YP2Cxw/fnzc2kTnbfPehL++niozFWHaoEe+zmdXxkSj1o98u9kbroOSb95Lo0Fog5SE3TxfqF9b1sdV3oLG8SbMvJesXukvjns33IAdfCEqC8mM5GfTBrA937sihCY3AF77pCfyn4ejPUx8nxEPPLgfuTCKBcsANuuRXs7ahyo9QQOgkXhx6nZKj0jBSi4hOR5YSiutp7I+KG4+9hYHX7aQf1OGT+1aPvRYtCR/XJguACX40O6HRrCVq/O75+9jTssL6i2mZLYp3172TcrJbuEEUnK5GBK1AD+A02Nyc0B5pOQtCG/gdJyoExVjd9HUvfSbbbJP6sn5wQiDtAKJ/7rUh+qjr6d3YOqti46qwEZ0Uu1naIJwuNI8kfXRldzPXrS7egIIqYupXCiXHGFCe2ZlQPnh/GbuEMfR5R+VXNIJvu2yj0Eb/w+sVJu2HMVOpX1LA9pnV56ERBrBzz4MjuBxlvaCz6P6W/Ie1w1XrZODrAXyMuyFEDoz3T+6vIf9NacZXdQxpDnKdPWY+93vuhg7EBvRkHXEtaA9TeeTq/rlh8tPMM1qAg9Yl8mOs6r3XC31u1+meMmUL55mRZ6nA7Ia6iYbnV3u+y6/EQD3In9Md05RblSLOuTRUKs7rt90ijmskzC9jiAjKuO4QL3ldAKlE5sHWQO2XnjcH/mHP8AtAv+QOIzrpWBQHFf+66/fEPMCHyfiSmPtgHbnec3w2xxBS3gaQnwhEAh0KL/d8xWRF7yT7D/t9XO8yt2LW9Cq34L22Ik4rxnXtknWTQca8EzW9pzbKd+9qB1aox157EKcXZgDPvbYY48FkcXYAQvtNHPAP1gMAJwDTbkCcRYjXTH+phNVaXfZhGUnoxkX2LBoxE3a7yTSoNGIQ8Fg0IvPxbpAm77cOUI7H/FIG7chzRHkcwgzHKcwbzxAbiKM1N1IU45354LGeYi7AHFp1EvnvRzHfT/S1OMQpH7Mv+ehbOciDm0Ar8adZBtCXqdQ7rdwP4y8fXjmQbwluNs84CrCOxd+n1m+gGxGH3ptrVnekY044wI1bs/7tp2EFPdR/SCPvaBB8lkMeufjGfGQg2d0HiOt2xpHY+QB4mBzl4QtpnCWYcoOVxvo0Zhh/5NPPjluXnc6fkDKi/bCKuY2tjbLkVWLlolddIIqlgQE+zASUEvX3y7+9xhNsG/RvrG0GYqCRnikHVoAvkFUSjSn5JqvZze9Iiz3wHXydxY+BbLwH/ITKADmSUXQ9fPqYPSq3tuN/LY7+Per/xPgK0f6Nrw7Bu1HKzLeXiAxIoGhO+21jS5fvtxXU1NzBHFJ8x6DMOz9tLhPqvlJkFROXGRj0iLcLtBog80J1r1hgJvmWk1aoobntKggG7QNnJoAN5TVDpB25+fnD2Kro73AAPIK4FkbwEX2EJ1lg6X9lgs0yJfZhfza8LcPtPWFCxfqdAoV/YYmLaF4yCOCvHooHhaH9OBcmDBAHQY9OrXIj7iNeDcvXvmEx5DUL698Vv1g2Tr9oqbNVp4f31mBpHsKDW13Tb/yVJHPMhgOmrGakU8XQO3DLrkwpjjpIKIu8FAKHmhBKfZGJwYflZPek+xAJwZehgadqDP8Hu8dofiUaJqBb926VcOkfC6EVUD7VMGkH4z3kmDo2IhaZ22OpcgLWGGMWqcbzHVCeI24t9M8KnaMyaV7S7P4Eq2KLzXq8DwLTHeiAEch7DbQ1bXdGnZfzyuV/z64HO/pC0k9eNeAe+tEx7ENl0kCjyr2vrogVPqeiAO0FaSHPBIulLeToizYCEyKRIAlM0rCdLvd4ccff5wMCtK4HB/IUcrKylwAHQFJA116TvuCQ8Q7GsEZ5gH23srYwK1hmRvx4wKYFZzwTxUVBjjDiE9gtWjDO4CoAgBElzSaQnygHBGAmvbvjjQ8qgO7fKCDfSdci1c+KgttYo/5hZsPKiWYAapBzEpQzeUOrgjFjEDjj3dVAAAAZElEQVRBUKOgle+HwVcLTjwIgy8F+btRtS6UR8PfkzbcYbljrta0AN4Y0oaRloCYltO0Ruhn7hkJZCSQkUBGAhkJZCSQkUBGAhkJZCSQkUBGAhkJZCSQkUBGAhkJZCTwzpHA/wGMENqD7Qn7DwAAAABJRU5ErkJggg==" alt="" /&gt;&lt;br /&gt;&lt;/div&gt;在台灣，一年一度的開放原始碼盛會 &lt;a href="http://osdc.tw/"&gt;OSDC.tw&lt;/a&gt; 即將於今年三月 26 與 27 兩日舉辦，而 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 除了很榮幸能成為 &lt;a href="http://osdc.tw/sponsors.html"&gt;OSDC.tw 贊助單位&lt;/a&gt;之外，也有五位開發者獲邀分享若干技術議程，以下摘錄的&lt;a href="http://osdc.tw/schedule.html"&gt;演講摘要&lt;/a&gt;：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9rJM5nVNI/AAAAAAAABEg/T6N0Zn81-dI/s1600/john.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9rJM5nVNI/AAAAAAAABEg/T6N0Zn81-dI/s400/john.gif" alt="" id="BLOGGER_PHOTO_ID_5570789069906466002" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;The meaning of open&lt;/span&gt;&lt;br /&gt;講者： &lt;span style="font-weight: bold;"&gt;John Lee&lt;/span&gt;&lt;br /&gt;摘要： Open source can be a culture, a belief, a hobby, a profession, and many things else. Now it can also be a business model.  0xlab has been trying to build a bridge between companies and open source communities for almost two years.  We believe that by creating an ecosystem around open source technologies, we can help it growing stronger in Taiwan. This session is about our idea, our vision, and our progress.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9rndymv5I/AAAAAAAABEo/nSwdqdH1Hhw/s1600/jserv.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 100px; height: 100px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9rndymv5I/AAAAAAAABEo/nSwdqdH1Hhw/s400/jserv.gif" alt="" id="BLOGGER_PHOTO_ID_5570789589836545938" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;Build Programming Language Runtime by LLVM&lt;/span&gt;&lt;br /&gt;講者： Jim Huang (&lt;span style="font-weight: bold;"&gt;jserv&lt;/span&gt;)&lt;br /&gt;摘要： 在 &lt;span class="il"&gt;OSDC&lt;/span&gt; 2009 的〈窮得只剩下 Compiler -- 淺談編譯技術的革命〉議程，提及編譯器相關的技術獲得空前的成功，而在運算型態多元的今日，如何跨越語言的藩籬卻又得兼顧底層平台的效能與安全，即是當前的重要課題。本議程將探討如何打造架構於 LLVM Compiler Infrastructure 的程式語言執行環境，並分析傳統編譯/解譯式語言到當紅的動態程式語言在引入於移動平台時，值得深入探索的技術細節。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_XYo3WYqTnPk/TU9sQ1XDfUI/AAAAAAAABEw/RvZdGTxTyBk/s1600/matt.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 100px; height: 100px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/TU9sQ1XDfUI/AAAAAAAABEw/RvZdGTxTyBk/s400/matt.gif" alt="" id="BLOGGER_PHOTO_ID_5570790300538076482" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;Rloader, alternative technology to achieve fast boot time for ARM Linux&lt;/span&gt;&lt;br /&gt;講者： &lt;span style="font-weight: bold;"&gt;Matt Hsu&lt;/span&gt;&lt;br /&gt;摘要： To reduce boot time for embedded device, you can optimize from different aspects, such as bootloader, kernel, and applications. But this usually needs to do optimization on specific application. Instead, Rloader can provide _generic_  solution to achieve fast boot time without changing your application.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_XYo3WYqTnPk/TU9szZo_2eI/AAAAAAAABE4/dY20_wWmMFE/s1600/thinker.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 100px; height: 100px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/TU9szZo_2eI/AAAAAAAABE4/dY20_wWmMFE/s400/thinker.gif" alt="" id="BLOGGER_PHOTO_ID_5570790894392564194" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;" class="topic"&gt;SVG+Javascript meets Embedded Systems&lt;/span&gt;&lt;br /&gt;講者： &lt;span style="font-weight: bold;"&gt;Thinker&lt;/span&gt; Li&lt;br /&gt;摘要： &lt;span style="top: 436.55px; left: 720.85px;" class="abstract on"&gt;After  two years of work, MadButterfly, a SVG based GUI environment, had made a  breakthrough.  It suports Javascript to improve efficiency for  developing embedded systems.  In late 2010, we also improve our code  with OpenVG, an HW acceleration API, to provide high-performance GUI.   This talk would demonstrate an efficient way for developing an embedded  system with GUI, and provide high quality and performance GUI  output  with a low-Hz platform at the same time.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9tRh2dYDI/AAAAAAAABFA/s4WL32pfZoI/s1600/olv.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 100px; height: 100px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9tRh2dYDI/AAAAAAAABFA/s4WL32pfZoI/s400/olv.gif" alt="" id="BLOGGER_PHOTO_ID_5570791411992584242" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;Gallium3D - Mesa's new driver model&lt;/span&gt;&lt;br /&gt;講者： Chia-I Wu (&lt;span style="font-weight: bold;"&gt;olv&lt;/span&gt;)&lt;br /&gt;摘要： 做為 Linux 系統主要的開放源始碼 3D 驅動程式，在 GPU 應用範圍越來越廣泛的同時，傳統的 Mesa driver model 已逐漸不敷使用。本議程將簡介 Mesa 新提出的 Gallium3D 架構，理解何以 Gallium3D 能夠幫助開發者更快地去支援新的硬體、作業系統與繪圖 API 。&lt;br /&gt;&lt;br /&gt;依據慣例，屆時我們也會發布最近的開發成果，期待您的蒞臨指教，謝謝！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-3476704440363208583?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/3476704440363208583/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2011/02/0xlab-osdctw-2011.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3476704440363208583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3476704440363208583'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2011/02/0xlab-osdctw-2011.html' title='0xlab 在 OSDC.tw 2011 的議程分享'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9rJM5nVNI/AAAAAAAABEg/T6N0Zn81-dI/s72-c/john.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-8322780567920594067</id><published>2010-11-16T15:55:00.003+08:00</published><updated>2010-11-16T17:28:19.847+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><title type='text'>0xlab 的客製化 Android toolchain</title><content type='html'>有鑑於 Google 的 Android toolchain 開發團隊雖然活躍提交修改/貢獻到 GCC 與 binutils，但受限於 Android 原始碼釋出的慣例，總是要等待頗長的時間，才有機會使用到新的 GNU Toolchain 改善或者新功能，所以，&lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 開發者就準備一份客製化的版本，請參考以下網址：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://downloads.0xlab.org/toolchain/armv5te/"&gt;http://downloads.0xlab.org/toolchain/armv5te/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;目前提供 gcc-4.4.3 與 gcc-4.4.4 兩個版本，前者是取自 Google Android 的原始碼分支，提供 ICF (Identical Comdat/Code Folding) 與 LIPO (Lightweight IPO) 等優化機制，而 gcc-4.4.4 的版本則是 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 升級到新的程式基礎，並加入必要的修正。原始程式碼與 Toolchain 建構系統可參考 GIT: &lt;a href="http://gitorious.org/android-toolchain"&gt;android-toolchain&lt;/a&gt;。不久的將來，我們將會全面移轉到 &lt;a href="https://wiki.linaro.org/WorkingGroups/ToolChain"&gt;Linaro toolchain&lt;/a&gt;，也會一併發布 gcc-4.4 與 gcc-4.5 的 Android toolchain。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-8322780567920594067?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/8322780567920594067/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/11/0xlab-android-toolchain.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/8322780567920594067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/8322780567920594067'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/11/0xlab-android-toolchain.html' title='0xlab 的客製化 Android toolchain'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-7928884535858036052</id><published>2010-10-19T21:52:00.005+08:00</published><updated>2010-10-20T00:17:29.616+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libc'/><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='elf'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='linker'/><title type='text'>加速 Android 的動態連結</title><content type='html'>就如人們所熟悉，Android 底層運作 Dalvik 虛擬機器，在 C Library 層面採用衍生自 NetBSD libc 的 &lt;a href="http://android.git.kernel.org/?p=platform/bionic.git;a=summary"&gt;bionic&lt;/a&gt;。與過往的 Java 為基礎的操作環境 (OE; Operating Environment，如 Transvirtual 的 PocketLinux / XOE) 不同的是，每個 VM instance 均為獨立的 Linux process，且由 &lt;a href="http://developer.android.com/reference/dalvik/system/Zygote.html"&gt;Zygote&lt;/a&gt; 所「孵化」。就系統的角度來說，縱使底層對 system library 做了 prelink (透過工具 build/tools/apriori)，但因語言實做的特性，需頻繁經由 JNI 去存取底層服務，也就是說，有大量的 dlopen()/dlsym() 操作，這些均無法透過 prelink 來縮減載入時間。&lt;br /&gt;&lt;br /&gt;在 &lt;a href="http://coscup.org/2010/"&gt;COSCUP 2010&lt;/a&gt; 的議程「&lt;a href="http://jserv.sayya.org/embedded/build-your-android-toolchain.pdf"&gt;打造特製的 Android Toolchain&lt;/a&gt;」中，小弟介紹了 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 近來的幾項嘗試與改進項目，除了 GNU Toolchain (採用 gcc-4.4.4 搭配&lt;a href="http://gitorious.org/android-toolchain"&gt;一系列的修改&lt;/a&gt;) 之外，就包含 Android bionic libc 與 prelink 的修改，企圖引入 DT_GNU_HASH 的機制 (也稱為 gnu hashstyle，或 gnu hash)，以加速 Android 的動態連結。現在基礎工作大致完畢，陸續提交到 AOSP (Android Open Source Project) 的 &lt;a href="http://review.source.android.com/"&gt;Code Review&lt;/a&gt;，應該會納入 Android Gingerbread 以及後續的版本中。實驗平台採用 Qualcomm MSM7x25 (arm1136j-s)，平均縮減 26% 的 ELF 動態連結時間，這對所有的 Android Activity (Java 程式) 與需要額外作 dlopen() 處理的系統函式庫，如 Qualcomm 的 camera HAL/service 或 Opencore/DSP，均可適用。&lt;br /&gt;&lt;br /&gt;這過程中，讓小弟學習到頗多，從一開始的分析 (透過 oprofile 與開啟 bionic 裡頭 linker 的除錯資訊)，觀察到 Android 的動態連結處理，有點類似 OpenOffice 所面臨的議題，於是嘗試引入 DT_GNU_HASH。背景知識可參考以下文獻：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LWN 清晰的介紹文章 "&lt;a href="http://lwn.net/Articles/192624/"&gt;Optimizing Linker Load Times&lt;/a&gt;"，涵蓋四項 linker 參數背後的處理機制: -Wl,-O1, -Bdirect Linking, dynsor, gnu hashstyle (Precomputed Hash Values)&lt;/li&gt;&lt;li&gt;Ali Bahrami 的 blog 文章 "&lt;a href="http://blogs.sun.com/ali/entry/gnu_hash_elf_sections"&gt;GNU Hash ELF Sections&lt;/a&gt;" 與 "&lt;a href="http://blogs.sun.com/ali/entry/the_cost_of_elf_symbol"&gt;The Cost Of ELF Symbol Hashing&lt;/a&gt;"，淺顯易懂&lt;br /&gt;&lt;/li&gt;&lt;li&gt;glibc 維護者 &lt;a href="http://people.redhat.com/drepper/"&gt;Ulrich Drepper&lt;/a&gt; 的論文 "&lt;a href="http://people.redhat.com/drepper/dsohowto.pdf"&gt;How To Write Shared Libraries&lt;/a&gt;" (不要被 How To 字眼騙了，其實頗深入)，廣泛探討從歷史因素到 DSO 運作機制，以及 GNU Hackers 如何參照 Sun Microsystems 過往的改良機制，重新實做出 gnu hashstyle&lt;/li&gt;&lt;/ul&gt;gnu hashstyle 採用 Daniel J Bernstein 提出的 hash function，Jakub Jelinek 做了&lt;a href="http://sourceware.org/ml/binutils/2006-06/msg00424.html"&gt;分析&lt;/a&gt;，比較原本 ELF hash:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;The number of collisions in the 537403 symbols is:&lt;br /&gt;name  2sym collision # 3sym collision # more than 3sym collision #&lt;br /&gt;sysv            1749                5&lt;br /&gt;libiberty         42&lt;br /&gt;dcache            37&lt;br /&gt;djb2              29&lt;br /&gt;sdbm              39&lt;br /&gt;djb3              31&lt;br /&gt;rot              337               39                         61&lt;br /&gt;sax               34&lt;br /&gt;fnv               40&lt;br /&gt;oat               30&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;sysv 那項是原本的 hash function，而 djb2 則是 GNU Toolchain 採用的方案。就現有自由軟體的實做來看，包含 glibc, uClibc, dietlibc (前三者支援 GNU/Linux), FreeBSD libc 均提供 gnu hashstyle 的支援，但 Android 未正式在 bionic 提供。需留意的是，prelink 方案總是比 gnu hashstyle 帶來更快的動態連結時間，但付出的代價 (空間) 較高，而且不若後者有彈性。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-7928884535858036052?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/7928884535858036052/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/10/android.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7928884535858036052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7928884535858036052'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/10/android.html' title='加速 Android 的動態連結'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-821019631501449613</id><published>2010-09-01T01:47:00.007+08:00</published><updated>2010-09-01T10:17:59.896+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='omap'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>簡介 0xlab 新的開放原始碼專案</title><content type='html'>我們在今年八月中旬的 &lt;a href="http://coscup.org/2010/"&gt;COSCUP 研討會&lt;/a&gt;中，很榮幸地向與會的朋友介紹 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 若干新的開放原始碼專案，本文稍作整理回顧。&lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 是 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 最早的一項整合性開放原始碼專案，目的是建構於 &lt;a href="http://beagleboard.org/"&gt;Beagleboard&lt;/a&gt; 開放的硬體之上，提供 Android 的參考實做環境，經過一年多的累積，裡頭的成果被帶到不同的移動裝置中，比方說手機與 Tablet。今年二月份，有幸在 &lt;a href="http://www.mobileworldcongress.com/"&gt;Mobile World Congress&lt;/a&gt; 2010 展示基於 Android 的移動裝置，&lt;span id="recent_events"&gt;&lt;a href="http://www.tieto.com/"&gt;Tieto&lt;/a&gt; 也在 TI OMAP3 平台&lt;a href="http://www.tieto.com/blogs/BlogArticle.aspx?path=31196,31199,42948,42990"&gt;展示 0xdroid&lt;/a&gt;，這些都讓我們更有信心，擴展到多元的應用。&lt;br /&gt;&lt;br /&gt;這半年間，延續 &lt;/span&gt;&lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; &lt;span id="recent_events"&gt;的經驗，我們發展 / 貢獻以下專案：&lt;/span&gt;&lt;img src="file:///tmp/moz-screenshot.png" alt="" /&gt; &lt;span id="recent_events"&gt;&lt;/span&gt;&lt;span id="recent_events"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="recent_events"&gt;&lt;a href="http://code.google.com/p/0xrobocat/"&gt;0xRobocat&lt;/a&gt; : 與 &lt;a href="http://www.catcan.com.tw/"&gt;CATCAN&lt;/a&gt; 合作的專案，目的是打造一組控制伺服馬達與相關零組件的軟體框架，可提供給 Android 或 GNU/Linux 使用，以 &lt;/span&gt;&lt;a href="http://www.apache.org/licenses/LICENSE-2.0" rel="nofollow"&gt;Apache License 2.0&lt;/a&gt; 授權釋出。除了用於打造機器人外 (是真的可走動的 "Android")，本專案可用於 Android 裝置 (如手機) 的自動測試&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;&lt;a href="http://code.google.com/p/0xbench/"&gt;0xBench&lt;/a&gt; : &lt;/span&gt;有鑑於 Android 上的系統效能評比程式，不是不完整，就是非開放原始碼，所以我們決定重新打造一個。&lt;span id="recent_events"&gt;&lt;a href="http://code.google.com/p/0xbench/"&gt;0xBench&lt;/a&gt; 可從 C 函式庫/系統呼叫的層面，一路從 Dalvik VM 評測到 Android framework，仍持續擴充，並且我們提供 &lt;a href="http://code.google.com/p/0xbench/wiki/WebService"&gt;Web service&lt;/a&gt;，允許貢獻評測的結果，用互動的方式來分析。程式主體是 &lt;/span&gt;&lt;a href="http://www.apache.org/licenses/LICENSE-2.0" rel="nofollow"&gt;Apache License 2.0&lt;/a&gt; 授權&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;&lt;a href="http://gitorious.org/android-toolchain"&gt;android-toolchain&lt;/a&gt; : &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 特製的 GNU Toolchain，以 Android team 的成果為基礎，&lt;/span&gt;整合來自 &lt;a href="http://www.linaro.org/"&gt;Linaro&lt;/a&gt; Toolchain Working Group 的改善。這些主要是 &lt;a href="http://www.gnu.org/licenses/gpl.html"&gt;GNU GPLv3&lt;/a&gt; 授權&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;&lt;a href="https://review.source.android.com/"&gt;Android Open Source Project&lt;/a&gt; (AOSP) : 提交 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 過去在 TI OMAP 與 Qualcomm 72xx 平台的一些修改，經過公開的 Review 機制，慢慢整合到 AOSP&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cyanogenmod.com/"&gt;CyanogenMod&lt;/a&gt; : 社群版本的 Android，在 Nexus One, HTC Dream 等裝置有相當優越的表現，收錄若干來自 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的改良，比方說 Bluetooth HID profile&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="recent_events"&gt;除了以上的開放原始碼專案，我們內部正進行一個基於 Android 的新型態應用，未來也會將相關的專案程式碼，以開放原始碼的形式釋出，完整的列表可參考 &lt;a href="http://0xlab.org/projects.html"&gt;0xlab Projects&lt;/a&gt;。至於 &lt;a href="https://review.source.android.com/"&gt;AOSP&lt;/a&gt;，我們現有更改的項目是：&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="recent_events"&gt;build - 調整 Android build system、修正工具程式的瑕疵&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;bionic - 提供 ARM optimizations，針對 ARMv6/ARMv7&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;PixelFlinger - 基本的 refactoring，以及 ARM 實做的改良&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;libpng / libz - 利用 GCC visibility，進一步縮減 code size&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;elfcopy - ELF 工具的調整&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;bionic / apriori / build - 支援 DT_GNU_HASH，加快動態連結的速度&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="recent_events"&gt;toolchain - 加強 build system 的彈性&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="recent_events"&gt;以上，歡迎舊雨新知給我們支持與指教，謝謝。&lt;/span&gt;&lt;span id="recent_events"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-821019631501449613?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/821019631501449613/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/09/0xlab.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/821019631501449613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/821019631501449613'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/09/0xlab.html' title='簡介 0xlab 新的開放原始碼專案'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-691997504157095682</id><published>2010-08-02T02:33:00.004+08:00</published><updated>2010-08-02T03:06:02.681+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='coscup'/><title type='text'>0xlab 在 COSCUP 2010 的議程分享</title><content type='html'>&lt;center&gt;&lt;img src="http://coscup.org/2009/zh_tw/wp-content/uploads/2009/06/0xlab-logo.png" height="80" width="160" /&gt;&lt;/center&gt;一年一度的「&lt;a href="http://coscup.org/2010/zh-tw"&gt;COSCUP / 開源人年會&lt;/a&gt;」即將於八月 14 與 15 兩日舉辦，因為今年與 GNOME 亞洲峰會合辦，造成空前的盛大。&lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 除了很榮幸能成為 COSCUP 贊助單位之外，也有四位開發者獲邀分享若干技術議程，以下摘錄 COSCUP 的演講摘要：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/Sm7udqUbUDI/AAAAAAAAAts/bIVBvHnqrYY/s1600-h/walkingice.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 92px; height: 89px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/Sm7udqUbUDI/AAAAAAAAAts/bIVBvHnqrYY/s320/walkingice.png" alt="" id="BLOGGER_PHOTO_ID_5363486399588421682" border="0" /&gt;&lt;/a&gt;講題：&lt;span style="font-weight: bold;"&gt;Android Game Engine 比較&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;講者： &lt;span style="font-weight: bold;"&gt;walkingice&lt;/span&gt; (0xlab)&lt;br /&gt;&lt;dl class="speak_desc" id="s_36"&gt;&lt;dd&gt;摘要：隨著 Android的蓬勃發展，遊戲亦如雨後春筍般冒出。避免重複造輪子，勢必要藉助現有的遊戲引擎，讓遊戲開發者可以專注在遊戲的最核心價值 — 樂趣&lt;/dd&gt;&lt;/dl&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uXucelAI/AAAAAAAAAtk/7J9wyda-vLs/s1600-h/tick.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 91px; height: 87px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uXucelAI/AAAAAAAAAtk/7J9wyda-vLs/s320/tick.png" alt="" id="BLOGGER_PHOTO_ID_5363486297616716802" border="0" /&gt;&lt;/a&gt;講題：&lt;span style="font-weight: bold;"&gt;Be "Android"&lt;/span&gt;&lt;dl class="speak_desc" id="s_31"&gt;&lt;dt&gt;講者： &lt;span style="font-weight: bold;"&gt;tick&lt;/span&gt; (0xlab), &lt;span style="font-weight: bold;"&gt;matt&lt;/span&gt; (0xlab)&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt class="clearleft"&gt;摘要：將 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 打造成為機器人平台。Robocat 是為 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 所設計的機器人控制系統，此議程將從硬體架構、系統設計、函式庫及應用程式等不同層面切入，介紹如何打造自己的 ”Android”&lt;/dt&gt;&lt;/dl&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sm7umGJqd2I/AAAAAAAAAt0/0TPIMhZjTb0/s1600-h/jserv.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 97px; height: 92px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sm7umGJqd2I/AAAAAAAAAt0/0TPIMhZjTb0/s320/jserv.png" alt="" id="BLOGGER_PHOTO_ID_5363486544498423650" border="0" /&gt;&lt;/a&gt;講題：&lt;span style="font-weight: bold;"&gt;打造特製的 Android Toolchain&lt;/span&gt;&lt;dl class="speak_desc" id="s_15"&gt;&lt;dt&gt;講者：Jim Huang "&lt;span style="font-weight: bold;"&gt;jserv&lt;/span&gt;" (0xlab)&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt class="clearleft"&gt;摘要：探討 0xlab 近來的實驗，從修改 Android 的 GNU Toolchain 到提供 source-to-source compiler，提出若干基於特定需求，從而發展的編譯器技術的新應用&lt;/dt&gt;&lt;/dl&gt;涵蓋 Android Toolchain, Robot, Android Gaming 開發，依據慣例，屆時我們也會發布最近的成果，期待您的蒞臨指教，謝謝！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-691997504157095682?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/691997504157095682/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/08/0xlab-coscup-2010.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/691997504157095682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/691997504157095682'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/08/0xlab-coscup-2010.html' title='0xlab 在 COSCUP 2010 的議程分享'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XYo3WYqTnPk/Sm7udqUbUDI/AAAAAAAAAts/bIVBvHnqrYY/s72-c/walkingice.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-1318880329214597474</id><published>2010-05-26T01:01:00.004+08:00</published><updated>2010-05-26T02:08:45.305+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='kaffe'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='gcj'/><title type='text'>在 Android/Dalvik 環境引入 precompiled class 的實驗</title><content type='html'>延續筆者去年的紀錄「&lt;a href="http://jserv.blogspot.com/2009/04/compiler-mobile.html"&gt;當 Compiler 遇上 Mobile&lt;/a&gt;」，最近我們又獲得一些進展，是在 Android 的 Dalvik 虛擬機器環境中，引入 pre-compiled class 的實驗，除了可改善執行時期的效能、記憶體使用量外，另外就是避免在「&lt;a href="http://jserv.blogspot.com/2010/05/android.html"&gt;反組譯並修改 Android 應用程式實例&lt;/a&gt;」一文可見的資訊保護議題。&lt;br /&gt;&lt;br /&gt;其實十幾年前，在 Java 平台中就有相當多團隊提出可行的方案，而世界上第一個開放原始碼的 &lt;a href="http://www.kaffe.org/"&gt;Kaffe&lt;/a&gt; 虛擬機器專案，早在 1999 年即提出實做 "&lt;a href="http://kaffe.org/cgi-bin/cvsweb/kaffe/FAQ/FAQ.gcj?rev=1.3;content-type=text%2Fplain"&gt;Kaffe/GCJ integration&lt;/a&gt;"，成功地將 GCJ (GCC for Java) 自 Java class/source 編譯得到的機械碼，當作 pre-compiled shared library，讓 &lt;a href="http://www.kaffe.org/"&gt;Kaffe&lt;/a&gt;e VM 讀取，預期可有效改善執行效能並縮減起始時間。&lt;a href="http://www.gnu.org/software/classpath/"&gt;GNU Classpath&lt;/a&gt; 專案主持人 Mark Wielaard 在 LWN 的文章 "&lt;a href="http://lwn.net/Articles/130796/"&gt;GCJ - past, present, and future&lt;/a&gt;" 提到相關的歷史與技術背景，最早可回溯到 Cygnus solutions 時期 (RedHat 尚未併購) 的 GCJ 計畫提案 -- "&lt;a href="http://gcc.gnu.org/java/papers/gcc-java.html"&gt;A Gcc-based Java Implementation&lt;/a&gt;"。&lt;br /&gt;&lt;br /&gt;為了降低實做的複雜度，筆者最早採用 &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; 與 &lt;a href="http://icedtea.classpath.org/"&gt;IcedTea&lt;/a&gt; 作為系統框架，不過一直到今年春節，整體進度還是陷入膠著的狀態。現在則引入 &lt;a href="http://www.vishia.org/Java2C/html/features.html"&gt;Java2C&lt;/a&gt; 搭配 PGO (Profile-Guided Optimization) 與統計模型，嘗試分析運行於 Dalvik VM 的 Android activity / system server，佔用系統資源最頻繁的項目，並預先編譯 (pre-compile) 這些 class/method，居中透過 JNI (Java Native Interface) 讓 Dalvik VM 存取。不過，實務上來說，不是將所有 class/method 都編譯為原生機械碼，就會帶來效能提昇，相反地，後者往往讓系統陷入更差的效能。目前 Eclair 裡面的 Dalvik VM 雖然沒有完整的 JIT compiler，但其 fast interpreter for ARM 的確做了頗多 threaded interpreter 的改進，考量到 I-cache, paging, 與 branch prediction，若我們不思量 Java / Android Dalvik 應用程式的執行時期行為，只是一味作編譯轉換，很可能只是編譯極少被執行，或者完全不會被執行到的程式碼，因此加重執行時期的負擔，而最該被優化的部份，受限於不完整的 source-to-source 轉換，有顧此失彼的疑慮。&lt;br /&gt;&lt;br /&gt;於是，找出系統中最該被優化的部份，並考量到正確性與相容度，就是我們的首要研究議題，筆者採用知名的 &lt;a href="http://math.nist.gov/scimark2/"&gt;SciMark 2.0&lt;/a&gt; 作為量化分析的指標。以下是在 Qualcomm MSM7x25 硬體平台 (arm1136j-s) 的效能評比，ARM11 的時脈是 528 MHz，ARM Linux 版本為 2.6.29.6-0xlab：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/S_wRBg4-bmI/AAAAAAAAA-Q/1jcyHbfFCZU/s1600/scimark.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 246px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/S_wRBg4-bmI/AAAAAAAAA-Q/1jcyHbfFCZU/s400/scimark.png" alt="" id="BLOGGER_PHOTO_ID_5475269964682128994" border="0" /&gt;&lt;/a&gt;由上可見，在 &lt;a href="http://math.nist.gov/scimark2/"&gt;SciMark 2.0&lt;/a&gt; 的各項評比中，Pre-compiled class 執行效能都較 Android Dalvik fast interpreter for ARM 給予一定程度的改良，並且透過 FDO (Feedback Directed Optimization)，大多可進一步給予提昇。這僅是初步的整合實驗數據，還需要更多分析與進行實做。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-1318880329214597474?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/1318880329214597474/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/05/androiddalvik-precompiled-class.html#comment-form' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1318880329214597474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1318880329214597474'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/05/androiddalvik-precompiled-class.html' title='在 Android/Dalvik 環境引入 precompiled class 的實驗'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XYo3WYqTnPk/S_wRBg4-bmI/AAAAAAAAA-Q/1jcyHbfFCZU/s72-c/scimark.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-4839787627362597360</id><published>2010-05-21T22:08:00.016+08:00</published><updated>2010-05-23T22:14:04.193+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='decompile'/><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='dex'/><category scheme='http://www.blogger.com/atom/ns#' term='smali'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>反組譯並修改 Android 應用程式實例</title><content type='html'>為了某個實驗的動機，我們評估反編譯 Android 應用程式的可行性，本文即是筆者的心得與實際的範例，僅供參考。就筆者的認知，目前還沒有針對 Android 的 DEX to Java source 反編譯工具，可實際處理一般的 Android 應用程式，多半要繞幾圈，還會得到不甚理想的結果，不過，&lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt; 這個反組譯工具，已是可用了，只是得對付類似 &lt;a href="http://jasmin.sourceforge.net/"&gt;Jasmin&lt;/a&gt; 語法的 Dalvik 組合語言。筆者打包了 &lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt; 與 &lt;a href="http://code.google.com/p/frozenbubbleandroid/"&gt;Frozen Bubble for Android&lt;/a&gt;，作為示範：&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://0xlab.org/%7Ejserv/dex-dis-example.tar.bz2"&gt;http://0xlab.org/~jserv/dex-dis-example.tar.bz2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;在 GNU/Linux 環境中，首先取得 Android SDK，這裡採用 Eclair/2.1，工具執行檔的路徑是 android-sdk-linux_86/tools，將此路徑放入 $PATH 環境變數，如此一來，就可以操作 adb, aapt, apkbuilder 一類的工具程式。筆者提供的套件已包含 Frozen Bubble 執行檔，檔名為 "FrozenBubble-orig.apk"。一旦 Android emulator 啟動後，即可安裝進去執行：(後續的操作也需要 Emulator 持續開啟)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;$ adb install -r FrozenBubble-orig.apk&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;以下是執行畫面：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XYo3WYqTnPk/S_abN1_AlHI/AAAAAAAAA9I/XG-4rI-EHjg/s1600/Screenshot-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/S_abN1_AlHI/AAAAAAAAA9I/XG-4rI-EHjg/s400/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5473733059247379570" border="0" /&gt;&lt;/a&gt;當然，沒必要讓筆者置喙談如何玩這個經典遊戲，不過我們倒是想更改原本的行為。在進行之前，我們先來複習 Android APK 的建立，參考 "&lt;a href="http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/"&gt;How to build Android application package (.apk) from the command line using the SDK tools + continuously integrated using CruiseControl&lt;/a&gt;." 一文，我們可從以下圖表知悉細部的流程：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://asantoso.files.wordpress.com/2009/09/build-flow1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 640px; height: 393px;" src="http://asantoso.files.wordpress.com/2009/09/build-flow1.png" alt="" border="0" /&gt;&lt;/a&gt;假設我們完全無法取得原始程式碼，該如何進行呢？沒錯，就透過 &lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt;，簡化繁瑣的流程，筆者包裝為 Makefile，所以只要先解開並反組譯：&lt;br /&gt;&lt;blockquote&gt;$ make extract&lt;/blockquote&gt;這時候會看到兩個目錄：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;smali-src : 存放反組譯的程式檔輸出&lt;/li&gt;&lt;li&gt;workspace : 原本 Frozen Bubble 的 Android resource files&lt;/li&gt;&lt;/ul&gt;二話不說，當然是觀察反組譯的結果：&lt;br /&gt;&lt;blockquote&gt;smali-src$ find&lt;br /&gt;./org/jfedor/frozenbubble/FrozenBubble.smali&lt;br /&gt;./org/jfedor/frozenbubble/R$id.smali&lt;br /&gt;./org/jfedor/frozenbubble/GameView.smali&lt;br /&gt;./org/jfedor/frozenbubble/SoundManager.smali&lt;br /&gt;./org/jfedor/frozenbubble/LaunchBubbleSprite.smali&lt;br /&gt;./org/jfedor/frozenbubble/Compressor.smali&lt;br /&gt;./org/jfedor/frozenbubble/R$attr.smali&lt;br /&gt;./org/jfedor/frozenbubble/BubbleFont.smali&lt;br /&gt;./org/jfedor/frozenbubble/PenguinSprite.smali&lt;br /&gt;./org/jfedor/frozenbubble/GameView$GameThread.smali&lt;br /&gt;./org/jfedor/frozenbubble/BubbleSprite.smali./org/jfedor/frozenbubble/R$string.smali&lt;br /&gt;./org/jfedor/frozenbubble/R$drawable.smali&lt;br /&gt;./org/jfedor/frozenbubble/ImageSprite.smali&lt;br /&gt;./org/jfedor/frozenbubble/BubbleManager.smali&lt;br /&gt;./org/jfedor/frozenbubble/GameScreen.smali&lt;br /&gt;./org/jfedor/frozenbubble/R.smali&lt;br /&gt;./org/jfedor/frozenbubble/R$layout.smali&lt;br /&gt;./org/jfedor/frozenbubble/BmpWrap.smali./org/jfedor/frozenbubble/FrozenGame.smali&lt;br /&gt;./org/jfedor/frozenbubble/Sprite.smali&lt;br /&gt;./org/jfedor/frozenbubble/LevelManager.smali&lt;br /&gt;./org/jfedor/frozenbubble/R$raw.smali&lt;/blockquote&gt;就忠實地依據 Java package 的方式呈現，檔名結尾是 ".smali"。筆者的修改目標是，讓一開始的關卡 (Level) 從第一關直接跳躍到第五關。在 smali 原始程式碼 (注意：這完全不同於 Java 原始程式碼，而是極為貼近 Dalvik VM 所接受的 DEX 檔案的組合語言形式) 搜尋 "Level" 字眼，可發現主要的分佈就落於兩個檔案：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;./org/jfedor/frozenbubble/GameView$GameThread.smali&lt;/li&gt;&lt;li&gt;./org/jfedor/frozenbubble/LevelManager.smali&lt;/li&gt;&lt;/ul&gt;前者就是 org/jfedor/frozenbubble/GameView.java 的編譯輸出，因為是 inner class，獨立編譯出 org/jfedor/frozenbubble/GameView.class$GameThread.smali，由這個 class 命名方式大概就可猜出其重要性，基本上只要能夠控制此 class 的實做，就掌握此 Android 應用程式的行為。而 class LevelManager 顧名思義，看來掌握了遊戲進行的程序控制。先觀察其 method 列表：&lt;br /&gt;&lt;blockquote&gt;smali-src$ grep "\.method" org/jfedor/frozenbubble/LevelManager.smali&lt;br /&gt;.method public constructor &amp;lt;init&amp;gt;([BI)V&lt;br /&gt;.method private getLevel(Ljava/lang/String;)[[B&lt;br /&gt;.method public getCurrentLevel()[[B&lt;br /&gt;.method public getLevelIndex()I&lt;br /&gt;.method public goToFirstLevel()V&lt;br /&gt;.method public goToNextLevel()V.method public restoreState(Landroid/os/Bundle;)V&lt;br /&gt;.method public saveState(Landroid/os/Bundle;)V&lt;/blockquote&gt;倘若我們以 "goToFirstLevel" 一類的關鍵字，在 org/jfedor/frozenbubble/GameView$GameThread.smali 檔案中搜尋，可找出有具體的呼叫行為：&lt;br /&gt;&lt;blockquote&gt;smali-src$ grep -r goToFirstLevel *&lt;br /&gt;org/jfedor/frozenbubble/GameView$GameThread.smali:    invoke-virtual {v2}, Lorg/jfedor/frozenbubble/LevelManager;-&gt;&lt;span style="font-weight: bold;"&gt;goToFirstLevel&lt;/span&gt;()V&lt;br /&gt;org/jfedor/frozenbubble/LevelManager.smali:.method public goToFirstLevel()V&lt;br /&gt;&lt;/blockquote&gt;由此更確定我們之前的猜想。其中組合語言寫為以下：&lt;blockquote&gt;    move-object/from16 v0, p0&lt;br /&gt;&lt;br /&gt;iget-object v0, v0, Lorg/jfedor/frozenbubble/GameView$GameThread;-&gt;mLevelManager:Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;&lt;br /&gt;move-object v2, v0&lt;br /&gt;&lt;br /&gt;invoke-virtual {v2}, Lorg/jfedor/frozenbubble/LevelManager;-&gt;goToFirstLevel()V&lt;/blockquote&gt;不要被貌似複雜的語法嚇到了，基本上掌握 Java 程式語言的原則 "Everything is Object" (不過仍有提供 primitive type)，組合語言仍會作 Java Object 的實體化 (instantialization)，Dalvik 本身是 Register-based Virtual Machine，而扣除 static/class method 外，Java 中所有的 method invocation 多為 virtual function (對應於 C++ 的觀點，才能更具體用機械方式思考)，所以組合語言的指令為 "invoke-virtual" (注意有連字號，此與 Java bytecode 不同)，"{v2}" 表示第一受者的 Register，此為 Object 本體。接著，與 Java bytecode 一樣，"Lorg/jfedor/frozenbubble/LevelManager;" 就表示 Java 層面的 class "org.jfedor.frozenbubble.LevelManager"，字母 "L" 即為 class 的識別，而 "-&gt;" 就很直觀了，自然是 method invocation，所以連貫來看，這一段組合語言的 Java 意思為：&lt;br /&gt;&lt;blockquote&gt;objectLevelManager.goToFirstLevel();&lt;/blockquote&gt;其中 objectLevelManager 是一個 class LevelManager 的實例/實體 (instance)。倘若需要在 method invocation 時，帶入參數，那麼前述的 "{v2}" 一般會被替換為 "{v0, v1, v2, ...} 的 register 列表。關於詳細的狀況，可參考 &lt;a href="http://www.dalvikvm.com/"&gt;Dalvik 非官方說明&lt;/a&gt;，另外 &lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt; 的 wiki 也提供一些範例，可多加利用。&lt;br /&gt;&lt;br /&gt;回到筆者剛剛設定的目標，我們既然知道 class org.jfedor.frozenbubble.GameView$GameThread 掌控了程式處理邏輯，自然一堆變數的傳遞、method 呼叫，都在此進行，那我們先試著用 "level" 字串去搜尋，想辦法找出常數定義，後者在 Dalvik 中，會集中保存於 constant pool 中，而 &lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt; 的組合語言寫法大致是 "const" 開頭的宣告，端看其類型而定。以程式追蹤的目的來說，我們專注於以下兩種：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;const-string : primitive string (不同於 java.lang.String) 表示&lt;/li&gt;&lt;li&gt;const/4 : 長度為 4 bytes (32 bit) 的整數表示&lt;/li&gt;&lt;/ul&gt;字串何其多，依據之前的推測來說，我們要找接近 "LevelManager" 字眼的組合語言程式碼，道理很明顯，從一般 Java programmer 的寫作邏輯去反推。經過一番搜尋，我們找到以下的反組譯程式碼： (位於檔案 org/jfedor/frozenbubble/GameView$GameThread.smali中)&lt;blockquote&gt;    const-string v3, "level"&lt;br /&gt;const/4 v4, 0x0&lt;br /&gt;move-object/from16 v0, v25    move-object v1, v3&lt;br /&gt;move v2, v4&lt;br /&gt;invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;-&gt;getInt(Ljava/lang/String;I)I&lt;br /&gt;move-result p4&lt;br /&gt;new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;move-object v0, v3&lt;br /&gt;move-object/from16 v1, v22&lt;br /&gt;move/from16 v2, p4    invoke-direct {v0, v1, v2}, Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;([BI)V&lt;br /&gt;&lt;/blockquote&gt;在上述程式碼列表中，"Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;" 表示呼叫 class LevelManager 的 constructor，也就是 "&amp;lt;init&amp;gt;"。注意到 method invocation 方式就不同了，是 "invoke-direct"，表示 class constructor，而這之前要有 "new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;" 的組合語言指令宣告。&lt;br /&gt;&lt;br /&gt;前面談過「倘若需要在 method invocation 時，帶入參數，一般會被替換為 "{v0, v1, v2, ...} 的 register 列表」這樣的概念，我們可推知，Register v1 與 v2 就是實際上 class org.jfedor.frozenbubble.LevelManager 的 constructor 參數。就程式設計的邏輯來看，class GameView 就是依據某個流程，要求 LevelManager 去改變狀態，所以這裡的兩個參數，其實就是初始值，非常的重要。&lt;br /&gt;&lt;br /&gt;與 Register v1 相關的組合語言指令有這幾行：(用粗體字標示)&lt;br /&gt;&lt;blockquote&gt;    &lt;span style="font-weight: bold;"&gt;const-string v3, "level"&lt;/span&gt;&lt;br /&gt;const/4 v4, 0x0&lt;br /&gt;move-object/from16 v0, v25&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move-object v1, v3&lt;/span&gt;&lt;br /&gt;move v2, v4&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;invoke-interface {v0, v1, v2},  Landroid/content/SharedPreferences;-&gt;getInt(Ljava/lang/String;I)I&lt;/span&gt;&lt;br /&gt;move-result p4&lt;br /&gt;new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;move-object v0, v3&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move-object/from16 v1, v22&lt;/span&gt;&lt;br /&gt;move/from16 v2, p4&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;invoke-direct {v0, v1, v2},  Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;([BI)V&lt;/span&gt;&lt;/blockquote&gt;顯然，Register v1 還被帶入到 android.content.Shared.Preference.getInt() method，而更早以前，其內含值被設定為 Register v3 的值，也就是常數字串 (const-string) "level"，這好像與我們的焦點不同。另外，像是 Register v22 這個編號較大的 register，表示 local variable，這點需要多留意，因為 Java 程式設計的規範來說，往往會將程式切割為若干 method，而 method 實做體中，又有極多的 local variable，於是往往可從組合語言反推 Java 原始碼的型態。&lt;br /&gt;&lt;br /&gt;那麼，看看 Register v2 吧，同樣用粗體字標示相關的指令：&lt;br /&gt;&lt;blockquote&gt;    const-string v3, "level"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;const/4 v4, 0x0&lt;/span&gt;&lt;br /&gt;move-object/from16 v0, v25&lt;br /&gt;move-object v1, v3&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move v2, v4&lt;/span&gt;&lt;br /&gt;invoke-interface {v0, v1, v2},  Landroid/content/SharedPreferences;-&gt;getInt(Ljava/lang/String;I)I&lt;br /&gt;move-result p4&lt;br /&gt;new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;move-object v0, v3&lt;br /&gt;move-object/from16 v1, v22&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move/from16 v2, p4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;invoke-direct {v0, v1, v2},  Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;([BI)V&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;這個 Register v4 的內含值 "0x0" 會指派到 Register v2 中，而讓我們似乎找到方向了，回頭看看 class org.jfedor.frozenbubble.LevelManager 的 constructor 宣告方式： (之前 grep 結果的第一行)&lt;br /&gt;&lt;blockquote&gt;smali-src$ grep "\.method" org/jfedor/frozenbubble/LevelManager.smali&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;.method public constructor &amp;lt;init&amp;gt;([BI)V&lt;/span&gt;&lt;/blockquote&gt;其中 "public" 是 ACL (存取權限) 的宣告，而 constructor 的符號規範為 "&amp;lt;init&amp;gt;"，注意到括號 "(" 與 ")" 裡面的兩個大寫字母，表示接受兩個參數，對應的型態為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;B : byte&lt;/li&gt;&lt;li&gt;I : int&lt;/li&gt;&lt;/ul&gt;在 Java 與 Dalvik virtual machine 皆以同樣的形式作宣告，看到這裡，我們實在忍不住要動手修改了，當然，一切都是實驗性質。既然一開啟遊戲，畫面就顯示 Level 1，表示 LevelManager 一開始接受的 level 參數會是 "0"，然後依據 GameView 的邏輯，逐一升級或中斷遊戲進行，那麼，如果要讓遊戲一起動就是 Level 5，是不是要把內含值改為 0x4 即可？也就是 "invoke-direct {v0, v1, v2}, Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;([BI)V" 的 Register v2 當時內含值該為 0x4，不就任務達成了嗎？想到此，不禁會心一笑。&lt;br /&gt;&lt;br /&gt;不過，回顧稍早 Register v2 的相關程式碼輸出，其中有兩行需要留意 (以粗體字為主)：&lt;br /&gt;&lt;blockquote&gt;    invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;-&gt;getInt(Ljava/lang/String;I)I&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move-result p4&lt;/span&gt;&lt;br /&gt;new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;move-object v0, v3&lt;br /&gt;move-object/from16 v1, v22&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;move/from16 v2, p4&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;"p4" 用以保存 method invocation 之後的回傳值，顯然，Register v2 受到 p4 的指派，也就是被更動為 android.content.Shared.Preference.getInt() method 的回傳值，這存在不確定性，於是，我們乾脆一口氣改掉： (修改的部份會用井字號 "#" 作註解)&lt;br /&gt;&lt;blockquote&gt;    # Modified from 0x0 to 0x4"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;const/4 v4, 0x4&lt;/span&gt;&lt;br /&gt;move-object/from16 v0, v25&lt;br /&gt;move-object v1, v3&lt;br /&gt;move v2, v4&lt;br /&gt;# Modified: removed the following 2 lines&lt;br /&gt;# &lt;span style="font-weight: bold;"&gt;invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;-&gt;getInt(Ljava/lang/String;I)I&lt;/span&gt;&lt;br /&gt;# &lt;span style="font-weight: bold;"&gt;move-result p4&lt;/span&gt;&lt;br /&gt;new-instance v3, Lorg/jfedor/frozenbubble/LevelManager;&lt;br /&gt;move-object v0, v3&lt;br /&gt;move-object/from16 v1, v22                                                             &lt;br /&gt;# Modified: removed the following 1 line&lt;br /&gt;# &lt;span style="font-weight: bold;"&gt;move/from16 v2, p4&lt;/span&gt;&lt;br /&gt;invoke-direct {v0, v1, v2}, Lorg/jfedor/frozenbubble/LevelManager;-&gt;&amp;lt;init&amp;gt;([BI)V&lt;br /&gt;&lt;/blockquote&gt;改好程式，當然要驗證，回到上一層目錄，透過 &lt;a href="http://code.google.com/p/smali/"&gt;smali&lt;/a&gt; 提供的組譯器，重新產生 Dalvik DEX 輸出，為了簡化流程，筆者把 smali, apkbuilder, aapt, adb install 都一次整合進去，所以會直接讓 Android Emulator 生效，來看看我們的戰果吧：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/S_axAnT3dhI/AAAAAAAAA9Y/re0O7JuZ-qw/s1600/Screenshot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/S_axAnT3dhI/AAAAAAAAA9Y/re0O7JuZ-qw/s400/Screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5473757021225842194" border="0" /&gt;&lt;/a&gt;注意到左下角，這表示我們成功了，完全不用取得 Java 原始程式碼，就可以作反組譯並且修改的動作。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-4839787627362597360?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/4839787627362597360/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/05/android.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4839787627362597360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4839787627362597360'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/05/android.html' title='反組譯並修改 Android 應用程式實例'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XYo3WYqTnPk/S_abN1_AlHI/AAAAAAAAA9I/XG-4rI-EHjg/s72-c/Screenshot-1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-487663739524867706</id><published>2010-05-04T11:21:00.003+08:00</published><updated>2010-05-04T16:44:23.215+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='toolchain'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>Android Toolchain 原始程式碼尋寶</title><content type='html'>很多人從事 Android 移植，但連 Android Toolchain 都自行維護者，相對就少多了。筆者過去有幸在「&lt;a href="http://www.andestech.com/"&gt;台灣心&lt;/a&gt;」計畫中，從事建構於台灣自主 CPU 的軟體開發，嘗試從零到有，將 Android 移植到 Andes NDS32 架構，就涉及到 Toolchain 的更動。而維護 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 與對應 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的 GNU Toolchain，不免會迷失於眾多的原始程式碼，只好靜下心慢慢探索，沒想到因此挖掘到頗多「寶物」，本文簡記備忘使用。&lt;br /&gt;&lt;br /&gt;Google 工程師 Jing Yu 於 Jan 18, 2010 提交一份修改 "&lt;a href="http://android.git.kernel.org/?p=toolchain/gcc.git;a=commit;h=30f553f6a7597e8084704b84876dea2af493d6fe"&gt;Bring gcc-4.4.0 to up-to-date&lt;/a&gt;"，讓人摸不著頭緒，不過其對於 GCC 的 architecture 更動，追加了新項目，可參見檔案 gcc-4.4.0/gcc/config/linux-grtev1.h 。以下節錄開頭註解：&lt;br /&gt;&lt;blockquote&gt;/* Definitions for Linux-based GRTE (Google RunTime Environment) version 1.&lt;br /&gt;   Copyright (C) 2009 Free Software Foundation, Inc.&lt;br /&gt;   Contributed by Chris Demetriou.&lt;br /&gt;&lt;br /&gt;This file is part of GCC.&lt;br /&gt;&lt;/blockquote&gt;這個以 Linux 為基礎的 GRTE 到底是什麼呢？沒獲得解答，只好在其 gcc spec 檔中探索，以下是相關的描述：&lt;br /&gt;&lt;blockquote&gt;/* When GRTE links statically, it needs its NSS and resolver libraries&lt;br /&gt;   linked in as well.  Note that when linking statically, these are&lt;br /&gt;   enclosed in a group by LINK_GCC_C_SEQUENCE_SPEC.  */&lt;br /&gt;#undef LINUX_GRTE_EXTRA_SPECS&lt;br /&gt;#define LINUX_GRTE_EXTRA_SPECS \&lt;br /&gt;  { "libc", "%{static:%(libc_static);:-lc}" }, \&lt;br /&gt;  { "libc_p", "%{static:%(libc_p_static);:-lc_p}" }, \&lt;br /&gt;  { "libc_static", \&lt;br /&gt;    "-lc -lnss_borg -lnss_cache -lnss_dns -lnss_files -lresolv" }, \&lt;br /&gt;  { "libc_p_static", \&lt;br /&gt;    "-lc_p -lnss_borg_p -lnss_cache_p -lnss_dns_p -lnss_files_p -lresolv_p" },&lt;br /&gt;&lt;/blockquote&gt;這裡的 libc 看來是獨立的 C Library 實做，比較有趣的是 libnss 的部份。libnss 可透過外部的 module 作擴充，比方說 libnss-ldap 就是 "NSS module for using LDAP as a naming service"，而前述 gcc spec 提及當進行靜態編譯時，需要將所需的 module 一併連結，那麼，這系列 libnss_ 開頭的函式庫，顯然就是 GRTE (Google RunTime Environment) 所需的基礎建設。來看看有哪些特別的：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;libnss_borg&lt;/li&gt;&lt;li&gt;libnss_cache&lt;/li&gt;&lt;/ul&gt;或許後者可從名稱猜出一些端倪，但這個 "libnss_borg" 實在是太詭異 (Borg i&lt;em&gt;&lt;/em&gt;n Star Trek?)，跟 GRTE 一樣神秘，我們只好等待 Google 大神給我們一些驚喜。&lt;br /&gt;&lt;br /&gt;另外，Android Benchmark Suite 2.0.0 已公開釋出，可參見 &lt;a href="http://android.git.kernel.org/?p=toolchain/benchmark.git;a=summary"&gt;benchmark.git&lt;/a&gt;，值得一書的是，內建了 FDO (Feedback Directed Optimization) 的編譯、測試，與效能評估機制。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-487663739524867706?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/487663739524867706/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/05/android-toolchain.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/487663739524867706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/487663739524867706'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/05/android-toolchain.html' title='Android Toolchain 原始程式碼尋寶'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-6939371260469383300</id><published>2010-03-10T12:15:00.006+08:00</published><updated>2010-03-10T13:57:53.292+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='omap'/><category scheme='http://www.blogger.com/atom/ns#' term='esuit'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='eclair'/><category scheme='http://www.blogger.com/atom/ns#' term='devkit8000'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>0xdroid 正式支援 DevKit8000 開發板</title><content type='html'>沈寂的一段時間，現在 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 又恢復活躍的開發。正如稍早在 0xlab-devel 郵件討論區提及 "&lt;span id="thread_subject_site"&gt;&lt;a href="http://groups.google.com/group/0xlab-devel/browse_thread/thread/46332e24feca26a0"&gt;Return back to open source world&lt;/a&gt;"，我們陸續將之前開發的成果，貢獻到自由軟體的世界，環繞在 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 的項目有：&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="thread_subject_site"&gt;對 &lt;a href="http://beagleboard.org/"&gt;Beagleboard&lt;/a&gt; 一貫的完整支援，不只是將 Android 運作起來，還要提昇整體的效能與可用性&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="thread_subject_site"&gt;除了支援 &lt;a href="http://beagleboard.org/"&gt;Beagleboard&lt;/a&gt; 外，對 &lt;a href="http://elinux.org/DevKit8000"&gt;DevKit8000&lt;/a&gt; 也有充分的支援&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="thread_subject_site"&gt;擴充 &lt;a href="http://gitorious.org/esuit"&gt;esuit&lt;/a&gt; 並整合 Android CTS (Compatibility Test Suite) &lt;/span&gt;&lt;span id="thread_subject_site"&gt;與 &lt;a href="http://groups.csail.mit.edu/uid/sikuli/"&gt;Sikuli&lt;/a&gt;，提供涵蓋 board-level, API-level, Application-specific 的自動測試框架&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="thread_subject_site"&gt;對 Android 為基礎的系統作全面性的功能、效能，與可靠度評比，以及整合上述的自動測試框架，以驗證量化系統的品質&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="thread_subject_site"&gt;在 kanru 的努力與若干網友的貢獻 (hychen, Fred, itszero) 下，現在對 &lt;/span&gt;&lt;span id="thread_subject_site"&gt;&lt;a href="http://elinux.org/DevKit8000"&gt;DevKit8000&lt;/a&gt; 的支援&lt;/span&gt;&lt;span id="thread_subject_site"&gt;已加入到 GIT repository，以下是執行時期的照片：&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxQ3U_rmI/AAAAAAAAA7E/iFu7af_PGPg/s1600-h/0xdroid-devkit8k-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 355px; height: 400px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxQ3U_rmI/AAAAAAAAA7E/iFu7af_PGPg/s400/0xdroid-devkit8k-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5446876440127581794" border="0" /&gt;&lt;/a&gt;(0xdroid 的桌面與 Launcher)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxdFhmhSI/AAAAAAAAA7M/CG9yLiGQRSw/s1600-h/0xdroid-devkit8k-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 362px; height: 400px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxdFhmhSI/AAAAAAAAA7M/CG9yLiGQRSw/s400/0xdroid-devkit8k-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5446876650096985378" border="0" /&gt;&lt;/a&gt;(調整為直式顯示，符合原本 Android 的預期輸出假設)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxy9HPLNI/AAAAAAAAA7U/__p_K2xNbbE/s1600-h/0xdroid-devkit8k-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 359px; height: 400px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxy9HPLNI/AAAAAAAAA7U/__p_K2xNbbE/s400/0xdroid-devkit8k-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5446877025796041938" border="0" /&gt;&lt;/a&gt;目前支援 Android Donut 與 Eclair，在 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 即是 beagle-donut 與 beagle-eclair，需要搭配最新的 &lt;a href="http://gitorious.org/0xlab-kernel"&gt;0xlab-kernel&lt;/a&gt;，對 &lt;span id="thread_subject_site"&gt;&lt;a href="http://elinux.org/DevKit8000"&gt;DevKit8000&lt;/a&gt;&lt;/span&gt; 週邊做出更好的支援。以下是簡要的功能特徵描述：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;支援 &lt;span id="thread_subject_site"&gt;&lt;a href="http://elinux.org/DevKit8000"&gt;DevKit8000&lt;/a&gt;&lt;/span&gt; 特有週邊：Ethernet, LCD panel / touchscreen, keypad&lt;/li&gt;&lt;li&gt;提供對應的使用者介面 (UI) 設定程式，包含 Ethernet 與 Touchscrren calibration UI&lt;/li&gt;&lt;li&gt;延續之前 &lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt; 在 TI OMAP3 平台的&lt;a href="http://code.google.com/p/0xdroid/wiki/Benchmarks"&gt;效能改善成果&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="thread_subject_site"&gt;近期內我們將會釋出新的 image installer，並持續改善 TI OMAP3 平台的 Android Eclair，而在今年的 &lt;a href="http://osdc.tw/"&gt;OSDC.tw&lt;/a&gt; 研討會上，有個針對 &lt;/span&gt;&lt;a href="http://code.google.com/p/0xdroid/"&gt;0xdroid&lt;/a&gt;&lt;span id="thread_subject_site"&gt; 的議程，歡迎前來指教，也希望對 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 一系列開放原始碼專案有興趣的朋友，可來 &lt;a href="http://groups.google.com/group/0xlab-devel"&gt;0xlab-devel&lt;/a&gt; 郵件討論區參與討論，謝謝！&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-6939371260469383300?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/6939371260469383300/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2010/03/0xdroid-devkit8000.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6939371260469383300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6939371260469383300'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2010/03/0xdroid-devkit8000.html' title='0xdroid 正式支援 DevKit8000 開發板'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XYo3WYqTnPk/S5cxQ3U_rmI/AAAAAAAAA7E/iFu7af_PGPg/s72-c/0xdroid-devkit8k-1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-1933577827077806583</id><published>2009-12-09T16:53:00.005+08:00</published><updated>2009-12-09T17:23:03.171+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>libacc : Android 2.0 內建的輕量級 C Compiler</title><content type='html'>Android 2.0 (Eclair) 原始程式碼已於一個月前釋出，在目錄 system/core 下有個 libacc 的子項目，這是開發者修改自 Fabrice Bellard 的大作 &lt;a href="http://fabrice.bellard.free.fr/otcc/"&gt;OTCC (Obfuscated Tiny C Compiler)&lt;/a&gt;，以 C++ 與 Android 的執行時期函式庫重寫。libacc 的功能是提供給 Android 2.0 的 RenderScript 一個 C-like 語法的描述，如此一來，開發者可撰寫高效能的視覺效果與動畫，不過這部份並未完成，詳情可參考 "&lt;a href="http://www.inter-fuser.com/2009/11/android-renderscript-more-info-and.html"&gt;Android renderscript, more info' and an example application&lt;/a&gt;" 一文。&lt;br /&gt;&lt;br /&gt;關於 libacc 的整合部份，可參考 frameworks/base/libs/rs 目錄下的兩個檔案：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rsScriptC.cpp&lt;/li&gt;&lt;li&gt;rsScriptC_Lib.cpp&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;筆者準備了一份可單獨執行於 GNU/Linux 環境的套件："&lt;a href="http://0xlab.org/%7Ejserv/libacc.tar.bz2"&gt;libacc.tar.bz2&lt;/a&gt;"，除去 Android 的相依性並補上 Makefile，測試方式如下：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;libacc$ make&lt;br /&gt;g++ -I./include -DHAVE_PTHREADS -c acc.cpp&lt;br /&gt;gcc -I./include -DHAVE_PTHREADS -c hashmap.c&lt;br /&gt;gcc -I./include -DHAVE_PTHREADS -c logd_write.c&lt;br /&gt;g++ -I./include -DHAVE_PTHREADS -c tests/main.cpp&lt;br /&gt;g++ -I./include -DHAVE_PTHREADS -c tests/runtimeTest.cpp&lt;br /&gt;g++ -o main \&lt;br /&gt;  acc.o \&lt;br /&gt;  hashmap.o \&lt;br /&gt;  logd_write.o \&lt;br /&gt;  main.o \&lt;br /&gt;  -ldl&lt;br /&gt;g++ -o runtimeTest \&lt;br /&gt;  acc.o \&lt;br /&gt;  hashmap.o \&lt;br /&gt;  logd_write.o \&lt;br /&gt;  runtimeTest.o \&lt;br /&gt;  -ldl&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;libacc 的 Code generator 支援以下硬體架構：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;x86 / IA32&lt;/li&gt;&lt;li&gt;x86_64&lt;/li&gt;&lt;li&gt;ARMv5&lt;/li&gt;&lt;/ul&gt;以 IA32 的環境為例，可透過測試程式來驗證 libacc： (參數 -R 表示作執行的動作)&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;libacc$ ./main -R tests/data/hello.c&lt;br /&gt;Executing compiled code:&lt;br /&gt;Hello, world&lt;br /&gt;result: 0&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;其中 tests/data/hello.c 的內容為：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;libacc$ cat tests/data/hello.c&lt;br /&gt;int main() {&lt;br /&gt;printf("Hello, world\n");&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;若平台是 ARM 的話，還可以支援反組譯輸出，libacc 是 RenderScript 背後很重要的基礎建設，允許動態編譯 Android Graphics 的 RenderScript，輸出成機械碼並執行。參考檔案 tests/runtimeTest.cpp 可得知 RenderScript 的寫法，整個 libacc 可內嵌於程式中，比方說：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;const char* text = "void op_int(int a);\n"&lt;br /&gt;   "void op_float12(float a, float b, float c, float d,\n"                   &lt;br /&gt;   "           float e, float f, float g, float h,\n"&lt;br /&gt;   "           float i, float j, float k, float l);\n"&lt;br /&gt;   "void script() {\n"&lt;br /&gt;   "  globalVar += 3;\n"&lt;br /&gt;   "  op_int(123);\n"&lt;br /&gt;   "  op_float12(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0);\n"&lt;br /&gt;   "}\n";&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;這個字串經過 libacc 的函式呼叫後，可得到以下的編譯與執行結果：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;libacc$ ./runtimeTest&lt;br /&gt;Executing script:&lt;br /&gt;op_int(123)&lt;br /&gt;op_float12(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)&lt;br /&gt;After script globalVar = 20&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;目錄 tests 還包含可在 Android 環境執行的自動測試 Python script。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-1933577827077806583?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/1933577827077806583/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/12/libacc-android-20-c-compiler.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1933577827077806583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/1933577827077806583'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/12/libacc-android-20-c-compiler.html' title='libacc : Android 2.0 內建的輕量級 C Compiler'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-7446554314949672577</id><published>2009-09-18T14:38:00.006+08:00</published><updated>2009-09-18T17:31:49.417+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='omap'/><category scheme='http://www.blogger.com/atom/ns#' term='openmax'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>在 0xdroid 充分發揮 Beagleboard/OMAP3 的硬體特性</title><content type='html'>最近 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的開發者持續改善 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt;，在 &lt;a href="http://gitorious.org/"&gt;gitorious&lt;/a&gt; 的團隊排名維持在前五名的活躍程度，除了稍早提及針對 ARMv7 與底層軟體架構的改進外，&lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; 也加入了對 &lt;a href="http://beagleboard.org/"&gt;Beagleboard&lt;/a&gt; / TI OMAP3 硬體更充分的支援。現在與多媒體處理相關的架構圖可參考以下：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/SrNPM_OywoI/AAAAAAAAAxE/v7N2vdcx8R4/s1600-h/0xdroid-multimedia.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 367px; height: 400px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/SrNPM_OywoI/AAAAAAAAAxE/v7N2vdcx8R4/s400/0xdroid-multimedia.png" alt="" id="BLOGGER_PHOTO_ID_5382733064188379778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;紅色的部份是 Android 的 framework 層面 (Media framework, Media server)，而藍色則是實做 framework 所需服務的元件 (如 OpenCore)，剩下綠色的地方自然是 0xlab 關注、與硬體平台相關的元件，這裡簡要列出：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;libaudio : 透過 &lt;a href="http://www.alsa-project.org/"&gt;ALSA&lt;/a&gt; 處理 Audio In/Out，針對 TI OMAP3 平台做了調整&lt;br /&gt;&lt;/li&gt;&lt;li&gt;libcamera : 以 &lt;a href="http://v4l2spec.bytesex.org/"&gt;V4L2&lt;/a&gt; (Video For Linux) API 為基礎，提供上層 Android framework 對 camera 所需的硬體支援。透過 TI OMAP3 平台的 video overlays 作 preview 影像處理，並善用 TI DSP 的能力作 JPEG 處理&lt;br /&gt;&lt;/li&gt;&lt;li&gt;libopencorehw : 銜接 OpenCore，允許透過 TI OMAP3 平台的 video overlay 作高效能顯示處理&lt;br /&gt;&lt;/li&gt;&lt;li&gt;liboverlay : 讓 libcamera 與 libopencorehw 共用的 video overlay 操作模組&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TI DSP / OMX : 透過 &lt;a href="http://www.khronos.org/openmax/"&gt;OpenMAX&lt;/a&gt; 標準介面，使用 TI DSP 實做的硬體多媒體 codec 運算&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FFmpeg / OMX : 透過 &lt;a href="http://www.khronos.org/openmax/"&gt;OpenMAX&lt;/a&gt; 標準介面，使用針對 ARMv7/NEON 優化的硬體多媒體 codec 運算，這部份採納 &lt;a href="http://ffmpeg.org/"&gt;FFmpeg&lt;/a&gt; 的基礎&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;目前上述的硬體特有的元件已有初步實做，待驗證與調整 HAL 後，就會陸續整合到 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; 的公開 repository，至於開發相關的議題，可到 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的郵件討論群組 &lt;a href="http://groups.google.com/group/0xlab-devel"&gt;0xlab-devel&lt;/a&gt; 交流，謝謝。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-7446554314949672577?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/7446554314949672577/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/09/0xdroid-beagleboardomap3.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7446554314949672577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7446554314949672577'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/09/0xdroid-beagleboardomap3.html' title='在 0xdroid 充分發揮 Beagleboard/OMAP3 的硬體特性'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XYo3WYqTnPk/SrNPM_OywoI/AAAAAAAAAxE/v7N2vdcx8R4/s72-c/0xdroid-multimedia.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-2620674116796698287</id><published>2009-08-25T10:54:00.005+08:00</published><updated>2009-08-25T11:35:18.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>在 Beagleboard 上比較 Dalvik 與 CVM-jit 的效能</title><content type='html'>前文「&lt;a href="http://jserv.blogspot.com/2009/08/string.html"&gt;對 String 操作的改進&lt;/a&gt;」與「&lt;a href="http://jserv.blogspot.com/2009/05/android-dalvik-vm-vs-java-vm.html"&gt;Android Dalvik VM vs. Java VM&lt;/a&gt;」談及基於 &lt;a href="http://java.sun.com/javame/technology/cdc/"&gt;CVM 引擎&lt;/a&gt;的 Java VM 與 Dalvik 的效能差異後，最近 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 內部也因為挑選硬體平台，持續分析 &lt;a href="http://www.benchmarkhq.ru/cm30/info.html#The%20Embedded%20CaffeineMark"&gt;Embedded CaffeineMark&lt;/a&gt; 一類量化效能的報告。參考的硬體組態是 OMAP3/ARMv7 500 MHz，粗略的效能評比如下圖：&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=530x320&amp;amp;cht=bvg&amp;amp;chtt=Dalvik%20vs.%20CVM-jit%20on%20Beagleboard&amp;amp;chd=s:EDFIDFF,Y9d6Okh&amp;amp;chco=ff0000,0000ff&amp;amp;chdl=Dalvik%7CCVM-jit&amp;amp;chxl=0:%7CSieve%7CLoop%7CLogic%7CString%7CFloat%7CMethod%7COverall%7C1:%7CEmbedded%20CaffeineMark%7C&amp;amp;chxt=x,x" /&gt;&lt;br /&gt;Dalvik 取自 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; (cupcake + backported from donut)，而 CVM-jit 則源自 &lt;a href="https://phoneme.dev.java.net/"&gt;phoneME&lt;/a&gt; &lt;a href="http://java.sun.com/javame/technology/cdc/"&gt;CVM&lt;/a&gt; svn r19264，整體分數為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dalvik VM : 1034&lt;/li&gt;&lt;li&gt;CVM + jit : 7526&lt;/li&gt;&lt;/ul&gt;CVM 的組態設定：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cached constant&lt;/li&gt;&lt;li&gt;cached constant inlining&lt;/li&gt;&lt;li&gt;array init bounds check elimination&lt;/li&gt;&lt;li&gt;Hardware fpu = NEON&lt;/li&gt;&lt;li&gt;AAPCS&lt;/li&gt;&lt;/ul&gt;當然 Just-In-Time compiler 不是萬靈丹，從上述效能評比可發現，&lt;a href="http://java.sun.com/javame/technology/cdc/"&gt;CVM&lt;/a&gt; 在若干地方做了重要的微調，比方說透過 CNI 實做若干 class library 的關鍵 method，以及善用硬體 floating-point 操作 (注意：本組態未引入 ARMv6 與 ARMv7 的 Thumb2/Thumb-EE 指令集)。儘管 Android 團隊中 Dalvik 開發者 fadden 在郵件討論群組&lt;a href="http://osdir.com/ml/android-platform/2009-06/msg00076.html"&gt;談及&lt;/a&gt;：&lt;br /&gt;&lt;blockquote&gt;Four String methods -- charAt, compareTo, equals, and length -- are&lt;br /&gt;"inlined" by the VM, and are not going to get much faster.&lt;br /&gt;&lt;br /&gt;There are probably a few others that could benefit from this&lt;br /&gt;treatment, but I'm guessing that most string-centric processing in&lt;br /&gt;Java will likely be dominated by the cost of String allocations.  (The&lt;br /&gt;above weren't inlined because of a measured performance need -- the&lt;br /&gt;inlining was an experiment that needed a test subject.)&lt;/blockquote&gt;Dalvik 理論上可施加這些優化技術 (string allocation / native method inlining)，不過目前開放的實做中，尚未引入 (至少在 donut branch 中)。即便在保持 pure interpreter 的架構下，現有 class library 與 GC (garbage collector) 仍可作些調整，以改善 Android 的應用程式執行效能與 (圖形應用導向的) 使用者互動反應表現。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-2620674116796698287?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/2620674116796698287/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/08/beagleboard-dalvik-cvm-jit.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/2620674116796698287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/2620674116796698287'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/08/beagleboard-dalvik-cvm-jit.html' title='在 Beagleboard 上比較 Dalvik 與 CVM-jit 的效能'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-9106781612563279945</id><published>2009-08-13T22:37:00.004+08:00</published><updated>2009-08-13T23:15:13.884+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='surface'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>SDL 在 Android SurfaceFlinger 的初步移植</title><content type='html'>本日仍在追蹤 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; 的穩定性與效能議題，進行壓力測試時，順便將知名的 &lt;a href="http://www.libsdl.org/"&gt;SDL 函式庫&lt;/a&gt;移植到 Android window system，更具體來說，就是允許在 Android Surface Manager (SurfaceFlinger) 上運作 SDL 應用程式，背景知識請參考 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 圖形處理達人 &lt;a href="http://olvaffe.blogspot.com/"&gt;olv&lt;/a&gt; 的簡報 "&lt;a href="http://people.debian.org.tw/%7Eolv/surfaceflinger/surfaceflinger.pdf"&gt;Introduction to Android Window System&lt;/a&gt;" (PDF)。依據 &lt;a href="http://olvaffe.blogspot.com/"&gt;olv&lt;/a&gt; 提供的&lt;a href="http://people.debian.org.tw/%7Eolv/surfaceflinger/demo.tar.gz"&gt;範例 SurfaceFlinger 操作程式&lt;/a&gt;，libSDL 可很快地加上 Android video backend，接著透過 libui 的 EventHub 取得來自 Linux input subsystem 的事件。現在初步的移植成果可參考下圖：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XYo3WYqTnPk/SoQqKwtGE0I/AAAAAAAAAu8/kk1hx5atoA8/s1600-h/nesterdc-sdl-android.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 364px;" src="http://4.bp.blogspot.com/_XYo3WYqTnPk/SoQqKwtGE0I/AAAAAAAAAu8/kk1hx5atoA8/s400/nesterdc-sdl-android.png" alt="" id="BLOGGER_PHOTO_ID_5369463020093576002" border="0" /&gt;&lt;/a&gt;上圖展示一個以 &lt;a href="http://www.libsdl.org/"&gt;SDL&lt;/a&gt; 撰寫的 NES 任天堂模擬器，顯示更新於新建立的 Android Surface 上，筆者將該 Android surface 的起始座標位置挪到 (100, 100)，並設定其半透明度值，載入筆者最愛的泡泡龍 (Bubble Bobble) 遊戲 ROM。目前僅算堪用的狀態，未來要考慮到 Android Surface 限制 color space 為 RGB565 (針對 16-bit depth 顯示所做的優化限制)，勢必得在 &lt;a href="http://www.libsdl.org/"&gt;libSDL&lt;/a&gt; 引入若干 color space 轉換的繁瑣運算，可透過 ARM NEON 一類的硬體加速機制去改善效能。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-9106781612563279945?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/9106781612563279945/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/08/sdl-android-surfaceflinger.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/9106781612563279945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/9106781612563279945'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/08/sdl-android-surfaceflinger.html' title='SDL 在 Android SurfaceFlinger 的初步移植'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XYo3WYqTnPk/SoQqKwtGE0I/AAAAAAAAAu8/kk1hx5atoA8/s72-c/nesterdc-sdl-android.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-4888415918742048231</id><published>2009-08-13T04:40:00.004+08:00</published><updated>2009-08-13T05:35:39.298+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><title type='text'>對 String 操作的改進</title><content type='html'>之前的文章「&lt;a href="http://jserv.blogspot.com/2009/05/android-dalvik-vm-vs-java-vm.html"&gt;Android Dalvik VM vs. Java VM&lt;/a&gt;」提及純 interpreter 的 Dalvik VM 與具備 Just-In-Time compiler 的 JBend JVM (基於 &lt;a href="http://java.sun.com/javame/technology/cdc/"&gt;CVM 引擎&lt;/a&gt;) 的效能比較，以修改過的 &lt;a href="http://www.benchmarkhq.ru/cm30/info.html#The%20Embedded%20CaffeineMark"&gt;Embedded CaffeineMark&lt;/a&gt; 作為量化的依據，可發現 String 測試項目差了一個數量級 (491 vs. 5109)，整體的分數是 1:4.18 (1811:433)。稍早 &lt;a href="http://blog.ansoncat.com/"&gt;ansoncat&lt;/a&gt; 做了初步分析：&lt;blockquote&gt;「這部分應該是由於在 CVM 中，&lt;wbr&gt;使用了 &lt;a href="http://wiki.java.net/bin/view/Mobileandembedded/PhoneMEAdvancedCVMNativeMethods#CNI_and_KNI_methods"&gt;CNI&lt;/a&gt; 來實作 String class 的重要操作 ... 因為 String 的分數拉高了平均，&lt;wbr&gt;其它 benchmark 的效能差異會比平均分數的差異大的多」&lt;br /&gt;&lt;/blockquote&gt;目前 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; 在不更動 Dalvik VM  實做的前提 (後續再談改進的途徑)，對 bionic libc 的 string 相關函式作調整，移植來自 &lt;a href="http://www.codesourcery.com/"&gt;CodeSourcery&lt;/a&gt;/ARM 的 ARMv7 Thumb2 優化實做，就 micro-benchmark 的角度來說，效能改進約有 25% (初步分析，要考慮到不同的環境配置)，但整合到 Android/Dalvik 的表現又是如何呢？筆者的實驗結果如下： (score 大者為佳)&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=530x250&amp;amp;cht=bvg&amp;amp;chtt=Improvements%20on%20String&amp;amp;chd=s:bWf2Wd,bWf9Xd&amp;amp;chco=ff0000,0000ff&amp;amp;chdl=armv7%7Carmv7-opt&amp;amp;chxl=0:%7CSieve%7CLoop%7CLogic%7CString%7CFloat%7CMethod%7C1:%7CCaffeineMark%20score%7C&amp;amp;chxt=x,y" /&gt;&lt;br /&gt;測試環境是 Beagleboard (500MHz) 運作 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt;，以 &lt;a href="http://downloads.0xlab.org/toolchain/armv7/"&gt;ARMv7 GNU Toolchain&lt;/a&gt; 編譯，"armv7" 是 bionic 更動前的數據，而 "armv7-opt" 則是更動後的表現。很顯然發現，String 一項的改進大幅受到壓抑 (score = 1898:2140)，致使兩者最終僅有些微的落差，可見 JNI 帶來 overhead 的著實不小。又，大部分應用程式的效能瓶頸往往在於圖形處理、系統資源的調度、檔案讀寫等 I/O 操作，所以現階段我們的想法是儘量調整 native 的部份，針對 ARM core 與 SoC 的特性作調整，並提出可行的輕量級 native method invocation 實做。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-4888415918742048231?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/4888415918742048231/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/08/string.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4888415918742048231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4888415918742048231'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/08/string.html' title='對 String 操作的改進'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-5695298214886191140</id><published>2009-08-13T03:33:00.004+08:00</published><updated>2009-08-13T03:59:35.754+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='busybox'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>強化 Android 的 shell</title><content type='html'>Android 預設的 shell 就是 /system/bin/sh 這個 process，移植自 NetBSD 早期的 sh 程式，原本功能算是完整，但被 Android 開發團隊移去相當多功能，致使在 shell 下的操作苦不堪言，只好透過 adb 作遠端指令的下達，但問題是，移植 Android 的平台在初期往往缺乏有效的連線機制，又需要作些調整與嘗試，實在很不方便。所以筆者就在 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 最近釋出的 &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; 專案上，引入來自 &lt;a href="http://www.busybox.net/"&gt;Busybox&lt;/a&gt; 的 ash 實做，試著保持相近的 footprint 的前提下，提供更多的功能。&lt;br /&gt;&lt;br /&gt;因此，我們有以下考量：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;必須動態連結到 bionic libc&lt;/li&gt;&lt;li&gt;簡化 Busybox 的實做，修改 libbb 與對應的 applet&lt;/li&gt;&lt;li&gt;保有 bash 相容模式, Line edit, history, readline 等 Busybox 特徵&lt;/li&gt;&lt;/ul&gt;稍早，&lt;a href="http://0xlab.org/"&gt;0xlab &lt;/a&gt;的成員 &lt;a href="http://walkingice.twbbs.org/blog/"&gt;walkingice&lt;/a&gt; 就做了評估與實驗，讓整個 &lt;a href="http://www.busybox.net/"&gt;Busybox&lt;/a&gt; 得以動態連結到 bionic libc 並確保功能可運作，這部份有很多 hacking，暫時不談。現在這些更動已初步提交到 &lt;a href="http://gitorious.org/0xdroid/system_core"&gt;system/core repository&lt;/a&gt;。在 0xdroid 的 beagle-cupcake branch 下，相關的 ash 設定組態如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CONFIG_ASH_BASH_COMPAT&lt;/li&gt;&lt;li&gt;CONFIG_ASH_READ_NCHARS&lt;/li&gt;&lt;li&gt;CONFIG_ASH_READ_TIMEOUT&lt;/li&gt;&lt;li&gt;CONFIG_ASH_ALIAS&lt;/li&gt;&lt;li&gt;CONFIG_ASH_GETOPTS&lt;/li&gt;&lt;li&gt;CONFIG_ASH_BUILTIN_ECHO&lt;/li&gt;&lt;li&gt;CONFIG_ASH_OPTIMIZE_FOR_SIZE&lt;/li&gt;&lt;li&gt;CONFIG_ASH_EXPAND_PRMT&lt;/li&gt;&lt;/ul&gt;佔用的磁碟空間：&lt;blockquote&gt;&lt;pre&gt;[build_host]$ ls -lh system/bin/{ash,sh}&lt;br /&gt;87K 2009-08-13 02:24 &lt;span style="font-weight: bold;"&gt;system/bin/ash&lt;/span&gt;&lt;br /&gt;98K 2009-08-13 01:15 system/bin/sh&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;佔用的記憶體空間：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;[beagleboard] # ps&lt;br /&gt;USER     PID   PPID  VSIZE RSS   WCHAN    PC         NAME&lt;br /&gt;root     1     0     300   192   c00b2394 0000ca6c S /init&lt;br /&gt;root     777   1     736   324   c0057648 afe0c3fc S /system/bin/sh&lt;br /&gt;root     835   777   744   356   c0057648 afe0c3fc S &lt;span style="font-weight: bold;"&gt;/system/bin/ash&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;可以發現，新引入的 /system/bin/ash 佔用的磁碟與記憶體空間相似，但功能完整度卻大不相同，後者允許我們回顧歷史指令並編輯， 以及在 Embedded Linux 熟悉的操作環境。目前 ash 的移植還有很多調整改進的空間，不過算是堪用了，可在 init.rc 檔案中，將預設的 shell 指定為 /system/bin/ash。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-5695298214886191140?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/5695298214886191140/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/08/android-shell.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/5695298214886191140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/5695298214886191140'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/08/android-shell.html' title='強化 Android 的 shell'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-7501924824431228039</id><published>2009-08-08T21:45:00.007+08:00</published><updated>2009-08-08T22:37:04.823+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>提供給 Beagleboard 的 Image Installer</title><content type='html'>這幾周，&lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 的開發者都在準備新的 Android distribution，標的平台是 Beagleboard，可望在 &lt;a href="http://coscup.org/"&gt;COSCUP&lt;/a&gt; 到來前釋出，過程中順便寫了一個簡單易用的 Image Installer，可從 SD card 開機並將可運作的 Android system image 植入 Beagleboard 之上的 NAND flash，而不必依據&lt;a href="http://code.google.com/p/beagleboard/wiki/BeagleNANDFlashing"&gt;繁瑣的流程&lt;/a&gt;，才能體驗我們的新創作。目前已有初步成果，可參見下圖：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sn2EWcx-9DI/AAAAAAAAAuc/E6KP-qThgNE/s1600-h/0xflash.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 352px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sn2EWcx-9DI/AAAAAAAAAuc/E6KP-qThgNE/s400/0xflash.png" alt="" id="BLOGGER_PHOTO_ID_5367591852113327154" border="0" /&gt;&lt;/a&gt;已實做的特徵有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;僅需要放置單一檔案 (uImage.bin) 到 VFAT 格式的 SD card 中，在 Beagleboard 插入 SD 開機進入 Image Installer，即有簡單俐落的 UI&lt;/li&gt;&lt;li&gt;整個 Image Installer (kernel + busybox + file system + MTD tools + UI) 佔用不到 2Mb 的空間&lt;/li&gt;&lt;li&gt;預設讀取 SD card 裡頭的 android_beagle.ubi 與 0xkernel-beagle.bin 兩個檔案，自動寫入 NAND flash，並設定必要的 u-boot 環境參數。放置 image 檔案的動作可在多數的作業系統平台下進行，舉凡 MS-Windows, GNU/Linux, Mac OS X 等等，只要支援 VFAT 與 SD/MMC 讀寫即可&lt;/li&gt;&lt;/ul&gt;貌似單純的 Image Installer 開發，卻折騰了好幾天，歸納有若干因素：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;準備在 Beagleboard/OMAP3 環境下可最小可啟動的 Linux image，需要考慮到 device driver 間的相依性，比方說若將 USB subsystem 完全移除的話，很可能無法正常開機。又，OMAP3 內建的 MFD (Multi-Function Device) 要注意到驅動順序的議題，不然功能無法正確運作&lt;/li&gt;&lt;li&gt;要留意 TI OMAP3 / Beagleboard 啟動順序，即使 boot from SD，但 u-boot 與其 u-boot bootenv 很可能仍讀取自 NAND flash，這導致後續啟動的 Linux kernel 採用了預設值，致使 Image Installer 無法在預期的環境參數下啟動&lt;/li&gt;&lt;li&gt;ARM/Linux 啟動過程中，會試圖自一段特別的記憶體空間讀取 command line parameters，這空間稱為 ATAGS，係由 boot loader (以 Beagleboard 來說就是由 X-Loader 帶起的 u-boot) 填寫的記憶體內容，也就是所謂的 u-boot bootenv。但對 Image Installer 來說，雖然 u-boot 給予頗大的彈性，但也使得執行環境充滿不確定性&lt;/li&gt;&lt;/ul&gt;關於 ARM/Linux 的 ATAGS 實做程式碼可參考 arch/arm/boot/compressed/head.S 與 arch/arm/kernel/setup.c 兩個檔案，筆者做了簡單的 hack 以迴避：&lt;br /&gt;&lt;pre&gt;--- android-omap.orig/arch/arm/kernel/setup.c 2009-08-08 18:40:30.000000000 +0800&lt;br /&gt;+++ android-omap/arch/arm/kernel/setup.c 2009-08-08 18:43:09.000000000 +0800&lt;br /&gt;@@ -613,7 +613,6 @@&lt;br /&gt;&lt;br /&gt;static int __init parse_tag_cmdline(const struct tag *tag)&lt;br /&gt;{&lt;br /&gt;- strlcpy(default_command_line, tag-&gt;u.cmdline.cmdline, COMMAND_LINE_SIZE);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;由此可見，原本的動作是將 u-boot 對 ATAGS 寫入的資料寫入預設的 command line。至於安裝 Linux kernel image 與 root file system image 到 NAND flash 後，還得作 (NAND 裡頭的) u-boot bootenv 的編輯動作，這部份的工作原理可參考 Openmoko 開發的 &lt;a href="http://wiki.openmoko.org/wiki/Devirginator"&gt;Devirginator&lt;/a&gt;。喔，忘了說，這些惱人的限制，會在轉換到 &lt;a href="http://wiki.openmoko.org/wiki/Qi"&gt;Qi boot-loader&lt;/a&gt; 後迎刃而解 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-7501924824431228039?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/7501924824431228039/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/08/beagleboard-image-installer.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7501924824431228039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7501924824431228039'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/08/beagleboard-image-installer.html' title='提供給 Beagleboard 的 Image Installer'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XYo3WYqTnPk/Sn2EWcx-9DI/AAAAAAAAAuc/E6KP-qThgNE/s72-c/0xflash.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-3200238376497248660</id><published>2009-07-28T20:07:00.008+08:00</published><updated>2009-07-28T20:46:13.259+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='coscup'/><title type='text'>0xlab 在 COSCUP 2009 的議程分享</title><content type='html'>&lt;center&gt;&lt;img src="http://coscup.org/2009/zh_tw/wp-content/uploads/2009/06/0xlab-logo.png" height="80" width="160" /&gt;&lt;/center&gt;一年一度的「&lt;a href="http://coscup.org/2009/zh_tw/"&gt;COSCUP / 開源人年會&lt;/a&gt;」即將於八月 15 與 16 兩日舉辦，今年的規模與議程深廣度再創新紀錄，依據公佈的&lt;a href="http://coscup.org/2009/zh_tw/program"&gt;議程大綱&lt;/a&gt;，今年大會有四個主題：&lt;ul&gt;&lt;li&gt;Android 和嵌入式系統&lt;/li&gt;&lt;li&gt;雲端運算和 Web 技術&lt;/li&gt;&lt;li&gt;開發者工具&lt;/li&gt;&lt;li&gt;使用者桌面&lt;/li&gt;&lt;/ul&gt; 而 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 除了很榮幸能成為 &lt;a href="http://coscup.org/2009/zh_tw/sponsors"&gt;COSCUP 贊助單位&lt;/a&gt;之外，也有四位開發者獲邀分享若干技術議程，以下摘錄 COSCUP 的&lt;a href="http://coscup.org/2009/zh_tw/program/abstract"&gt;演講摘要&lt;/a&gt;：&lt;br /&gt;&lt;dl class="speak_desc" id="s_36"&gt;&lt;dt&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uzOaEpTI/AAAAAAAAAt8/tvVtRaHeJ3U/s1600-h/olv.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 83px; height: 83px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uzOaEpTI/AAAAAAAAAt8/tvVtRaHeJ3U/s320/olv.png" alt="" id="BLOGGER_PHOTO_ID_5363486770053031218" border="0" /&gt;&lt;/a&gt;講題：&lt;span style="font-weight: bold;"&gt;Android Wave Is Not Google Wave&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt&gt;講者：Chia-I Wu "&lt;span style="font-weight: bold;"&gt;olv&lt;/span&gt;" (0xlab)&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;摘要：&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;There is 3D acceleration on our laptops/netbooks. There is no reason that we cannot accelerate Android when it runs on the same devices. This talk is about 3D acceleration on Android. However, it will focus more on &lt;a href="http://www.mesa3d.org/"&gt;Mesa/DRI&lt;/a&gt; and focus less on Android, as the former is more open to our definitions.&lt;/dd&gt;&lt;/dl&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/Sm7udqUbUDI/AAAAAAAAAts/bIVBvHnqrYY/s1600-h/walkingice.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 92px; height: 89px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/Sm7udqUbUDI/AAAAAAAAAts/bIVBvHnqrYY/s320/walkingice.png" alt="" id="BLOGGER_PHOTO_ID_5363486399588421682" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;How Android Differs from GNU/Linux? And How can we FIX it?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;講者： &lt;span style="font-weight: bold;"&gt;walkingice&lt;/span&gt; (0xlab)&lt;br /&gt;&lt;dl class="speak_desc" id="s_36"&gt;&lt;dd&gt;摘要：&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;Android is indeed an open platform and large-scale open source project, which is amazing, but it excludes some well-known free and open source software such as glibc. This talk is about to share the experience about migrating from traditional GNU/Linux to Android. Also, 0xlab introduces some non-trivial modifications in order to leverage existing native Linux software into Android.&lt;/dd&gt;&lt;/dl&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uXucelAI/AAAAAAAAAtk/7J9wyda-vLs/s1600-h/tick.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 91px; height: 87px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uXucelAI/AAAAAAAAAtk/7J9wyda-vLs/s320/tick.png" alt="" id="BLOGGER_PHOTO_ID_5363486297616716802" border="0" /&gt;&lt;/a&gt;講題： &lt;span style="font-weight: bold;"&gt;Happy Build with OpenEmbedded&lt;/span&gt;&lt;br /&gt;&lt;dl class="speak_desc" id="s_31"&gt;&lt;dt&gt;講者： &lt;span style="font-weight: bold;"&gt;tick&lt;/span&gt; (0xlab)&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt class="clearleft"&gt;摘要：&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://www.openembedded.org/"&gt;Openembedded&lt;/a&gt; is a flexible and powerful autobuild system. It helps us porting different distributions to different hardwares without too much pain. I'd like to introduce the &lt;a href="http://www.openembedded.org/"&gt;OpenEmbedded&lt;/a&gt; system via creating a tiny distribution and running it on a real embedded system. I will use &lt;a href="http://beagleboard.org/"&gt;beagleboard&lt;/a&gt; to demonstrate the image. If you have &lt;a href="http://beagleboard.org/"&gt;beagleboard&lt;/a&gt;, you can take that and play at the same time.&lt;/dd&gt;&lt;/dl&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sm7umGJqd2I/AAAAAAAAAt0/0TPIMhZjTb0/s1600-h/jserv.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 97px; height: 92px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/Sm7umGJqd2I/AAAAAAAAAt0/0TPIMhZjTb0/s320/jserv.png" alt="" id="BLOGGER_PHOTO_ID_5363486544498423650" border="0" /&gt;&lt;/a&gt;講題：&lt;span style="font-weight: bold;"&gt;Linux Virtualization Goes Mobile&lt;/span&gt;&lt;dl class="speak_desc" id="s_15"&gt;&lt;dt&gt;講者：Jim Huang "&lt;span style="font-weight: bold;"&gt;jserv&lt;/span&gt;" (0xlab)&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt class="clearleft"&gt;摘要：&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;Although the concept of virtualization has existed since the 1960s, the applications become mature and diverse recently. the term "hypervisor" is referred to the original goal: providing a virtualization layer that strictly isolates virtual machines from each other for security and reliability purposes, that meets the requirement of rich mobile devices nowadays. the talk covers running operating systems in isolated run-time environments on a single hardware platform, and what we can benefit from it: flexible system configurations, legal/contractual liability, secure designs, etc.&lt;/dd&gt;&lt;/dl&gt;涵蓋 Android 3D、Android / Embedded Linux 開發，與 Linux virtualization 等等，屆時我們也會發布最近幾個月的成果，期待您的蒞臨指教，謝謝！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-3200238376497248660?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/3200238376497248660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/07/0xlab-coscup-2009.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3200238376497248660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3200238376497248660'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/07/0xlab-coscup-2009.html' title='0xlab 在 COSCUP 2009 的議程分享'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XYo3WYqTnPk/Sm7uzOaEpTI/AAAAAAAAAt8/tvVtRaHeJ3U/s72-c/olv.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-6505969895140689185</id><published>2009-07-13T11:13:00.007+08:00</published><updated>2009-07-13T12:07:57.415+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='simd'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android/Beagle 效能改善簡記</title><content type='html'>以圖表展現前文「&lt;a href="http://jserv.blogspot.com/2009/07/androidomap-opengles.html"&gt;在 Android/OMAP 展現硬體加速的 OpenGL|ES 與影片播放&lt;/a&gt;」與「&lt;a href="http://jserv.blogspot.com/2009/07/armv7-android.html"&gt;針對 ARMv7 優化的 Android&lt;/a&gt;」所提到的效能改善，可參見以下：&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=500x270&amp;amp;cht=bhg&amp;amp;chtt=Time%20to%20finish%20%28us%29&amp;amp;chd=s:Yg9g,SDDD&amp;amp;chco=ff0000,0000ff&amp;amp;chdl=baseline%7Chardware-opt&amp;amp;chxl=0:%7Cmofified%20512x512%20blit%7Cunmofified%20512x512%20blit%28x2%29%7Cunmofified%20512x512%20blit%7C302700%20bytes%20memcpy%7C&amp;amp;chxt=y" /&gt;&lt;br /&gt;分析若干繪圖操作：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;302700 bytes memcpy&lt;/li&gt;&lt;li&gt;512x512 unmodified texture, 512x512 blit&lt;/li&gt;&lt;li&gt;512x512 unmodified texture, 512x512 blit (x2)&lt;/li&gt;&lt;li&gt;512x512 modified texture, 512x512 blit&lt;/li&gt;&lt;/ul&gt;baseline 是原本 &lt;a href="http://free-electrons.com/blog/android-beagle/"&gt;Android on Beagle&lt;/a&gt; 的移植，而 hardware-opt 則是運用 ARM NEON 指令集與硬體 OpenGL|ES 加速，基準 baseline 302700 bytes memcpy 時間為 1373 us，整體時間越短越佳。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-6505969895140689185?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/6505969895140689185/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/07/androidbeagle.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6505969895140689185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6505969895140689185'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/07/androidbeagle.html' title='Android/Beagle 效能改善簡記'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-7075056972129666369</id><published>2009-07-08T15:05:00.006+08:00</published><updated>2009-07-08T16:26:10.833+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>在 Android/OMAP 展現硬體加速的 OpenGL|ES 與影片播放</title><content type='html'>&lt;a href="http://beagleboard.org/"&gt;BeagleBoard&lt;/a&gt; 是 &lt;a href="http://0xlab.org/"&gt;0xlab&lt;/a&gt; 內部用來驗證 ARM 硬體的參考平台，這兩個月內，我們整合了若干無線通訊大廠的 WLAN/Bluetooth 晶片組，而 TI OMAP 353x SoC 的表現著實令人驚豔。初步對 ARMv7 做了優化後，我們進一步運用 OMAP DSP 與 Display Subsystem 的特性，下圖即是在 Android 上硬體加速的 OpenGL|ES 與影片播放，&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/SlRTtzNQE3I/AAAAAAAAAs0/V_L_ED0qHYw/s1600-h/gles-video-overlay.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 277px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/SlRTtzNQE3I/AAAAAAAAAs0/V_L_ED0qHYw/s320/gles-video-overlay.jpg" alt="" id="BLOGGER_PHOTO_ID_5355997903155368818" border="0" /&gt;&lt;/a&gt;透過 DVI-HDMI 到顯示器，呈現 1024x768 的解析度，圖上方可見 Android 的狀態資訊列，而最上層就是 video overlay，而下方是 OpenGL|ES 的繪圖區，被遮蔽的最底層則為 Android surface。TI OMAP 3 整體示意圖可參考下圖：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XYo3WYqTnPk/SlRUZhBWMgI/AAAAAAAAAs8/uyugsXKVMGo/s1600-h/overlay.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 129px;" src="http://3.bp.blogspot.com/_XYo3WYqTnPk/SlRUZhBWMgI/AAAAAAAAAs8/uyugsXKVMGo/s320/overlay.png" alt="" id="BLOGGER_PHOTO_ID_5355998654187844098" border="0" /&gt;&lt;/a&gt;硬體支援三個 stacked overlays，其中 Video 2 和 Video 1 overlay 提供 RGB 及 YCbCr/YUV 的 color space，搭配 TI DSP 與 ARM NEON 加速指令集，可帶來相當順暢且華麗的展現。以下是稍早所作的 OpenGL|ES 與 HW video overlay 人機介面展示影片：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://0xlab.org/%7Ejserv/demo/beagle-gfx.avi"&gt;beagle-gfx.avi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;OpenGL|ES 由 &lt;a href="http://en.wikipedia.org/wiki/PowerVR"&gt;PowerVR/Imagination Technologies&lt;/a&gt; 提供，搭配 OMAP2/3 嶄新的 &lt;a href="http://lists-archives.org/video4linux/24364-new-display-subsystem-for-omap2-3.html"&gt;DSS2 顯示架構&lt;/a&gt;，需要對 Linux kernel driver 作些調整，可參考筆者提供的&lt;a href="http://0xlab.org/%7Ejserv/omap3-sgx-modules/"&gt;套件與修改部份&lt;/a&gt;。當然這一切僅是基礎建設，銜接於 Android 及 ARM SoC 所需要的功夫仍相當多，期望不久的將來，我們的&lt;a href="http://olvaffe.blogspot.com/"&gt;圖形處理達人&lt;/a&gt;會提出更多新玩意 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-7075056972129666369?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/7075056972129666369/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/07/androidomap-opengles.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7075056972129666369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/7075056972129666369'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/07/androidomap-opengles.html' title='在 Android/OMAP 展現硬體加速的 OpenGL|ES 與影片播放'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XYo3WYqTnPk/SlRTtzNQE3I/AAAAAAAAAs0/V_L_ED0qHYw/s72-c/gles-video-overlay.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-6015709184538132976</id><published>2009-07-01T10:41:00.003+08:00</published><updated>2009-07-01T14:12:44.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='simd'/><category scheme='http://www.blogger.com/atom/ns#' term='neon'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>針對 ARMv7 優化的 Android</title><content type='html'>前文「&lt;a href="http://jserv.blogspot.com/2009/06/android-gnu-toolchain-gcc-44.html"&gt;升級 Android 內建 GNU Toolchain 到 gcc 4.4&lt;/a&gt;」提及使用更新的編譯器平台，現在追蹤的是 gcc 4.4/4.5，不排除引入 &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;，這些準備都是為了允許施加更多優化、展現平台的特性，而在 Android 的 build system 也需要作一些更動，至少涵蓋以下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;針對硬體平台的編譯參數&lt;/li&gt;&lt;li&gt;Dalvik machine-dependent interpreter implementation (mterp)&lt;/li&gt;&lt;li&gt;針對硬體特徵優化的關鍵軟體，如 BlueZ 中處理音訊 Bluetooth low-complexity, subband codec (SBC) 的實做&lt;/li&gt;&lt;/ul&gt;當然優化是無止盡的，我們只求在合理的工程資源，能解決夠多的技術議題即可。筆者的參考修改可見 &lt;a href="http://tick.is-a-geek.net/%7Ejserv/android-armv7.patch"&gt;android-armv7.patch&lt;/a&gt;，其中做了以下調整：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;設定 gcc 編譯參數為 "-march=armv7-a -mtune=cortex-a8 -mfpu=neon"，適用於 BeagleBoard (TI OMAP 353x) 平台&lt;/li&gt;&lt;li&gt;額外啟動 gcc 的 &lt;a href="http://gcc.gnu.org/projects/tree-ssa/vectorization.html"&gt;Auto-vectorization&lt;/a&gt; 優化策略&lt;/li&gt;&lt;li&gt;以 ARM NEON 指令集優化 SBC 的執行效能&lt;/li&gt;&lt;/ul&gt;前期我們還是著重於泛 ARMv7 平台的優化技術，再來就是針對 SoC 平台的 DSP 與特性去作進一步處理。為了證明以上的修改發揮作用，可檢視 libjpeg 是否自動的做了 vectorized，也就是看看有無 ARM NEON 指令集的生成：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ./prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-objdump -d \&lt;br /&gt;out/target/product/generic/obj/STATIC_LIBRARIES/libjpeg_intermediates/jdmerge.o | egrep "v[add|mov]"&lt;br /&gt;1d4:   f2c09012        vmov.i32        d25, #2 ; 0x00000002&lt;br /&gt;1d8:   f3c01210        vmov.i32        d17, #32768     ; 0x00008000&lt;br /&gt;200:   f26048a9        vadd.i32        d20, d16, d25&lt;br /&gt;204:   f22069b8        vmul.i32        d6, d16, d24&lt;br /&gt;208:   f26438a9        vadd.i32        d19, d20, d25&lt;br /&gt;20c:   f2266821        vadd.i32        d6, d6, d17&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;至於 ARM NEON 指令集，這裡不贅述，可參考 ARM 官方文獻 &lt;a href="http://www.arm.com/products/multimedia/neon/"&gt;NEON Technology&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-6015709184538132976?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/6015709184538132976/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/07/armv7-android.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6015709184538132976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/6015709184538132976'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/07/armv7-android.html' title='針對 ARMv7 優化的 Android'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-4961765087644530665</id><published>2009-06-22T04:36:00.004+08:00</published><updated>2009-06-22T04:49:22.420+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='power management'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>簡報： Power Management from Linux Kernel to Android</title><content type='html'>上週五 (June 19)，Matt 跟我分享 Android 之上 Power Management 的背景概念、實做，以及可改進的方向，而論及 Android 的系統架構設計時，不免得先談談 Linux PM，期待這份簡報對進行系統移植與客製化的同好有助益：&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1616565"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/jserv/power-management-from-linux-kernel-to-android?type=presentation" title="Power Management from Linux Kernel to Android"&gt;Power Management from Linux Kernel to Android&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=android-power-090621153439-phpapp02&amp;amp;stripped_title=power-management-from-linux-kernel-to-android"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=android-power-090621153439-phpapp02&amp;amp;stripped_title=power-management-from-linux-kernel-to-android" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/jserv"&gt;Jim Huang&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;授權方式採用 Creative Commons S-A 3.0，不完善與謬誤處，請多指教，謝謝！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-4961765087644530665?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/4961765087644530665/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/06/power-management-from-linux-kernel-to.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4961765087644530665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4961765087644530665'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/06/power-management-from-linux-kernel-to.html' title='簡報： Power Management from Linux Kernel to Android'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-3455197849883669373</id><published>2009-06-18T18:04:00.005+08:00</published><updated>2009-06-19T04:28:13.501+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>升級 Android 內建 GNU Toolchain 到 gcc 4.4</title><content type='html'>GNU GCC 4.4 已於 Apr 21, 2009 正式釋出，伴隨眾多改進、修正，與硬體平台改善，詳情可見"&lt;a href="http://gcc.gnu.org/gcc-4.4/changes.html"&gt;GCC 4.4 Release Series Changes, New Features, and Fixes&lt;/a&gt;"，不過 Android repository 裡頭的 prebuilt GNU Toolchain 仍停留在 gcc-4.2.1 (Release date: Jul 18, 2007)，總是有些遺憾，且讓我們動手改變。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labs.embinux.org/"&gt;EMBINUX™ Lab&lt;/a&gt; 提供一份 &lt;a href="http://labs.embinux.org/index.php/Toolchain_For_Android"&gt;prebuilt GNU Toolchain for Android&lt;/a&gt;，參考其 git 的更動，可建立一套基於 gcc-4.4 與 binutils-2.19.1 的 toolchain，筆者準備打包好的套件： &lt;a href="http://tick.is-a-geek.net/%7Ejserv/prebuilt/toolchain-arm-eabi-4_4_0.tar.bz2"&gt;toolchain-arm-eabi-4_4_0.tar.bz2&lt;/a&gt;。另外，因為 gcc-4.4 對於 C/C++ 語意更加嚴格，像是應用程式對 va_list 的使用就需要調整，筆者將這些小修改整理為 &lt;a href="http://tick.is-a-geek.net/%7Ejserv/migrate-gcc44.patch"&gt;migrate-gcc44.patch&lt;/a&gt;。以下是簡要的升級方式：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# cd mydroid&lt;br /&gt;# cd prebuilt/linux-x86/toolchain&lt;br /&gt;# tar jxvf toolchain-arm-eabi-4_4_0.tar.bz2&lt;br /&gt;# cd ../../..&lt;br /&gt;# patch -p1 &amp;lt; migrate-gcc44.patch&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;重新編譯與建構 Android 即可。需要更動的部份，列出作參考：&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# diffstat migrate-gcc44.patch&lt;br /&gt;core/combo/linux-arm.mk             |    2 +-&lt;br /&gt;dist/sqlite3.h                      |    2 +-&lt;br /&gt;envsetup.sh                         |    2 +-&lt;br /&gt;pdk/ndk/samples/sample/Makefile.lib |    2 +-&lt;br /&gt;4 files changed, 4 insertions(+), 4 deletions(-)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-3455197849883669373?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/3455197849883669373/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/06/android-gnu-toolchain-gcc-44.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3455197849883669373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3455197849883669373'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/06/android-gnu-toolchain-gcc-44.html' title='升級 Android 內建 GNU Toolchain 到 gcc 4.4'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-936292465035195238</id><published>2009-06-18T14:34:00.005+08:00</published><updated>2009-08-11T09:40:18.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='simd'/><category scheme='http://www.blogger.com/atom/ns#' term='neon'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>改善 Android 中 memcpy 效能</title><content type='html'>在 Android 內部實做中，有許多細節涉及大量的 memcpy() 操作，比方說將一塊使用者定義的繪圖區域傳遞給 SurfaceFlinger 管理的過程，由於得先轉換成 texture，再對應為 Surface，之間至少需要三次 memcpy。由於 BeagleBoard (TI OMAP3) 透過 HDMI 輸出 (max: 1280x1024)，居中涉及大量的繪圖操作，意味著 memcpy() 頻繁被呼叫著，對整體效能有顯著的影響，於是筆者花了一些時間分析。&lt;br /&gt;&lt;br /&gt;Android 的 libc 實做 -- &lt;a href="http://android.git.kernel.org/?p=platform/bionic.git;a=summary"&gt;bionic&lt;/a&gt; -- 已包含針對 ARMv5 優化過的 memcpy()，詳情可參考 &lt;a href="http://android.git.kernel.org/?p=platform/bionic.git;a=blob_plain;f=libc/arch-arm/bionic/memcpy.S;hb=HEAD"&gt; libc/arch-arm/bionic/memcpy.S&lt;/a&gt;，而 GNU Toolchain (glibc) 中，其實也有一份針對 ARMv5 優化過的 memcpy() 實做，也利用到 ARMv5 的 data prefetch 指令。既然我們採用 ARMv7 架構的 BeagleBoard，何不使用其引入的 NEON SIMD 加速指令集呢？以下就是在 BeagleBoard 所作的 benchmark：&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=400x150&amp;amp;cht=bhs&amp;amp;chd=s:pz9&amp;amp;chxl=0:%7Carmv7a%7Cbionic-armv5%7Cglibc-armv5%7C1:%7CB/s%7C2:%7Cmemcpy%20benchmark%7C&amp;amp;chxt=y,x,t" /&gt;&lt;br /&gt;數據如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;glibc-armv5 : 181884276 B/s&lt;/li&gt;&lt;li&gt;bionic-armv5 : 225881095 B/s&lt;/li&gt;&lt;li&gt;armv7 : 269294302 B/s&lt;/li&gt;&lt;/ul&gt;參考的 ARM NEON 優化 memcpy() 實做如下：  (arm-neon-memcpy.S from Måns Rullgård &lt;mans@mansr.com&gt;)&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="text" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        .fpu neon                                                                          &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        .text&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt; &lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        .global memcpy_neon&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt; &lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        .func   memcpy_neon&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;memcpy_neon:&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        push            {r4-r11}&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        mov             r3, r0&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;1:      subs            r2, r2, #128&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        pld             [r1, #64]&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        pld             [r1, #256]&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        pld             [r1, #320]&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        ldm             r1!, {r4-r11}&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        vld1.64         {d0-d3},   [r1,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        vld1.64         {d4-d7},   [r1,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        vld1.64         {d16-d19}, [r1,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        stm             r3!, {r4-r11}&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        vst1.64         {d0-d3},   [r3,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        vst1.64         {d4-d7},   [r3,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        vst1.64         {d16-d19}, [r3,:128]!&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        bgt             1b&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        pop             {r4-r11}&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;        bx              lr&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;        .endfunc&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;至於 SurfaceFlinger 的操作仍有優化的空間，稍後再討論。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-936292465035195238?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/936292465035195238/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/06/android-memcpy.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/936292465035195238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/936292465035195238'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/06/android-memcpy.html' title='改善 Android 中 memcpy 效能'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-526058960361705052</id><published>2009-05-10T22:04:00.008+08:00</published><updated>2009-06-19T04:27:11.318+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eflow'/><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='jblend'/><title type='text'>Android Dalvik VM vs. Java VM</title><content type='html'>Google Android 開發團隊為了技術自主、迴避 Java 商標爭議等考量，建構了嶄新的 &lt;a href="http://android.git.kernel.org/?p=platform/dalvik.git;a=tree;f=docs;hb=refs/heads/master"&gt;Dalvik Virtual Machine&lt;/a&gt;，骨子裡頭仍支援 Java 程式語言，但 Dalvik VM 設計稍異於典型 JVM，網路上已有豐富的比較，本文就不贅述，筆者想探討的，則是&lt;a href="http://www.eflow.jp/en/"&gt;日本 eFlow 公司&lt;/a&gt;最近提出的 'Android™'s Dalvik VM on "Mobile Java"'，目標就是讓原本的 Java 執行平台 (主要是 Java ME)，得以運作針對 Android Dalvik VM 設計的應用程式。日前該專案已開放原始程式碼，主體依據 GNU GPLv2，以下是相關資訊：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;新聞稿： &lt;a href="http://www.eflow.jp/en/news/dalvikvm_javacldc031709.html"&gt;eflow Releases First Implementation of Android™'s Dalvik VM on "Mobile Java" as Open Source&lt;/a&gt;&lt;/li&gt;&lt;li&gt;專案開發主頁： &lt;a href="http://code.google.com/p/android-dalvik-vm-on-java/"&gt;android-dalvik-vm-on-java&lt;/a&gt;&lt;a id="project_summary_link" href="http://code.google.com/p/android-dalvik-vm-on-java/" style="text-decoration: none; color: rgb(0, 0, 0);"&gt; : Pure Java implementaion of Android's Dalvik virtual machine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;目前的進度來說 (svn r22)，支援以下功能：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a name="Currently_supported_functions"&gt;Dalvik Execution file format (.dex)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="Currently_supported_functions"&gt;&lt;/a&gt;&lt;a name="Currently_supported_functions"&gt;Complete Dalvik instruction set&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="Currently_supported_functions"&gt;&lt;/a&gt;&lt;a name="Currently_supported_functions"&gt;J2ME CLDC API&lt;/a&gt;&lt;a name="Currently_supported_functions"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="Currently_supported_functions"&gt;Multi-thread (include synchronized block, wait and notify) &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;至於是否能達到 eFlow 公司 CEO -- Koichi Makabe 所預期的效益：&lt;br /&gt;&lt;blockquote&gt;"We believe this implementation will particularly benefit manufacturers currently developing Android-powered devices, with a number of which we are cooperating to port the Dalvik VM to their specific hardware and software architectures. By making this implementation available today as open source, and by accelerating our porting and development efforts, we have the firm intention to make a significant contribution to the broader Android community."&lt;/blockquote&gt;這裡無從得知，不過，該專案四月底時，一併將 &lt;a href="http://code.google.com/p/android-dalvik-vm-on-java/source/browse/#svn/trunk/dalvikvm_benchmark"&gt;dalvikvm_benchmark&lt;/a&gt; 釋出，伴隨&lt;a href="http://code.google.com/p/android-dalvik-vm-on-java/source/browse/trunk/dalvikvm_benchmark/doc/BenchmarkResults.txt"&gt;內部的效能分析數據&lt;/a&gt;，非常有意思。從裡頭的資料來看，標的硬體平台有兩個：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google Dev Phone 1 (528MHz - Qualcomm MSM7201A)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ja.wikipedia.org/wiki/P905i"&gt;P905i&lt;/a&gt; (500MHz - &lt;a href="http://www.semicon.panasonic.co.jp/en/catalog/uniphier/"&gt;Panasonic UniPhier&lt;/a&gt; 4M + &lt;a href="http://www.aplixcorp.com/en/"&gt;JBlend&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;前者無疑就是用來比較的基準，硬體是 Qualcomm 平台，軟體組態當然是跑 Dalvik VM，運作時脈為 528 MHz。後者就相當有意思，&lt;a href="http://ja.wikipedia.org/wiki/P905i"&gt;P905i&lt;/a&gt; 是日本 NTT 電信的第三代手機平台，以豐富的多媒體與超長待機時間著稱，硬體採用 &lt;a href="http://www.semicon.panasonic.co.jp/en/catalog/uniphier/"&gt;Panasonic UniPhier&lt;/a&gt; 家族，運作時脈達 500MHz，軟體方面，則內建 &lt;a href="http://www.aplixcorp.com/en/"&gt;JBlend&lt;/a&gt; 這個商業 Java ME CLDC/MIDP 執行環境。儘管軟硬體組態均大相逕庭，不過研究&lt;a id="project_summary_link" href="http://code.google.com/p/android-dalvik-vm-on-java/" style="text-decoration: none; color: rgb(0, 0, 0);"&gt; &lt;/a&gt;&lt;a href="http://code.google.com/p/android-dalvik-vm-on-java/"&gt;android-dalvik-vm-on-java&lt;/a&gt; 提供的&lt;a href="http://code.google.com/p/android-dalvik-vm-on-java/source/browse/trunk/dalvikvm_benchmark/doc/BenchmarkResults.txt"&gt;內部的效能分析數據&lt;/a&gt;，多少有參考的價值。筆者整理為以下圖表：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chart.apis.google.com/chart?chs=400x300&amp;amp;cht=bvg&amp;amp;chtt=dalvikvm%20benchmark&amp;amp;chd=s%3ATdb9MKO%2CGHFGEFF&amp;amp;chco=ff0000%2C00ff00&amp;amp;chdl=P905i%7CG1&amp;amp;chxl=0%3A%7CSieve%7CLoop%7CLogic%7CString%7CFloat%7CMethod%7COverall%7C&amp;amp;chxt=x"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://chart.apis.google.com/chart?chs=400x300&amp;amp;cht=bvg&amp;amp;chtt=dalvikvm%20benchmark&amp;amp;chd=s%3ATdb9MKO%2CGHFGEFF&amp;amp;chco=ff0000%2C00ff00&amp;amp;chdl=P905i%7CG1&amp;amp;chxl=0%3A%7CSieve%7CLoop%7CLogic%7CString%7CFloat%7CMethod%7COverall%7C&amp;amp;chxt=x" alt="" border="0" /&gt;&lt;/a&gt;綠色部份 (靠右側者) 為 Google Dev Phone 1，紅色 (靠左側者) 則是 &lt;a href="http://ja.wikipedia.org/wiki/P905i"&gt;P905i&lt;/a&gt;，分數越高者越佳。在同一份 benchmark 測試方式來看，兩者有極為顯著的落差，整體表現數據為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google Dev Phone 1 (528MHz - Qualcomm MSM7201A) :: 433&lt;/li&gt;&lt;li&gt;&lt;a href="http://ja.wikipedia.org/wiki/P905i"&gt;P905i&lt;/a&gt; (500MHz - &lt;a href="http://www.semicon.panasonic.co.jp/en/catalog/uniphier/"&gt;Panasonic UniPhier&lt;/a&gt; 4M + &lt;a href="http://www.aplixcorp.com/en/"&gt;JBlend&lt;/a&gt;) :: 1811&lt;/li&gt;&lt;/ul&gt;數字背後的意義則是，Dalvik VM 進一步優化的空間仍相當大，至於如何在 ARM11 平台，透過若干進階的技巧 (JIT, register allocation, ...)，發揮 Dalvik 這個 register-based VM 的效能，是不少研究人員關心的議題。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-526058960361705052?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/526058960361705052/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/05/android-dalvik-vm-vs-java-vm.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/526058960361705052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/526058960361705052'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/05/android-dalvik-vm-vs-java-vm.html' title='Android Dalvik VM vs. Java VM'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-9096216702777395239</id><published>2009-05-10T17:26:00.005+08:00</published><updated>2009-05-10T17:55:46.129+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='native'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android 上的原生 OpenGL/ES</title><content type='html'>olv 日前在「&lt;a href="http://olvaffe.blogspot.com/2009/04/android-binder.html"&gt;一千零一夜之 Android Binder&lt;/a&gt;」一文提及：&lt;br /&gt;&lt;blockquote&gt;surface manager 可以準備一塊 surface，把 surface 的 fd (一塊 ashmem 記憶體) 傳給一個 app，讓 app 可以在上面作畫。有了這層理解，我們對 android 可以有更自由的發揮，例如，可以不改一行 cairo 的程式碼，就利用 cairo 與 c++ 寫出一個會動的時鐘&lt;/blockquote&gt;而 Surface manager 顧名思義，就是管理邏輯上眾多的 surface，其底層對應於 OpenGL|ES 的實做。透過 surface 的處理，我們可讓像 &lt;a href="http://cgit.freedesktop.org/xorg/app/fdclock/"&gt;fdclock&lt;/a&gt; 這樣原生 (native) 的 C 語言程式，透過同樣在 GNU/Linux 上原生的 Cairo 函式庫，無痛的顯示處理。這實在很吸引人，畢竟若能在 Android 平台充分重用 GNU/Linux 既有的軟體功能，會是多麼有趣的事。且讓我們思考是否能在 Android 上撰寫 C 語言的 OpenGL/ES 應用程式。&lt;br /&gt;&lt;br /&gt;Android 已提供初步的 OpenGL/ES 封裝，實做則是透過 agl (Android OpenGL) 底層的 PixelFlinger 與 GPU。關於 Java 部份的 OpenGL APIs 操作，可參閱原始程式碼 frameworks/base/opengl/java/android/opengl/GLSurfaceView.java ，不過現在只看 C 程式的部份。動態連結函式庫必須連結到以下三者：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;libEGL : OpenGL/ES APIs&lt;br /&gt;&lt;/li&gt;&lt;li&gt;libGLESv1_CM : Reference implementation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;libui : Android UI framework (native)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;準備好我們的程式碼之後，其建構過程如下：&lt;br /&gt;&lt;blockquote&gt;$ . build/envsetup.sh&lt;br /&gt;$ cd angeles-test/&lt;br /&gt;$ mm                                                                          &lt;br /&gt;make: Entering directory `/home/jserv/Myth/mydroid'&lt;br /&gt;target arm C: angeles-test &lt;= /home/jserv/Myth/mydroid/angeles-test/demo.c&lt;br /&gt;...&lt;br /&gt;&lt;/blockquote&gt;參考的螢幕顯示如下：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/SgakJBBRsaI/AAAAAAAAAq0/cc3us0AjSAU/s1600-h/opengl-android.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 195px; height: 320px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/SgakJBBRsaI/AAAAAAAAAq0/cc3us0AjSAU/s320/opengl-android.png" alt="" id="BLOGGER_PHOTO_ID_5334131283466498466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;不過，在模擬器顯示的狀況會比實體遜色頗多，可見到相當嚴重的重繪動作，但基本上是可用的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-9096216702777395239?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/9096216702777395239/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/05/android-opengles.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/9096216702777395239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/9096216702777395239'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/05/android-opengles.html' title='Android 上的原生 OpenGL/ES'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XYo3WYqTnPk/SgakJBBRsaI/AAAAAAAAAq0/cc3us0AjSAU/s72-c/opengl-android.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-3169891637098012121</id><published>2009-04-29T17:25:00.004+08:00</published><updated>2009-04-29T18:01:33.502+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openmax'/><category scheme='http://www.blogger.com/atom/ns#' term='gstreamer'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>整合 GStreamer 到 Android</title><content type='html'>Thinker 在「&lt;a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_id_doc/391"&gt;GStreamer 和 OpenMAX IL 的比較&lt;/a&gt;」一文提到：&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.gstreamer.net/"&gt;GStreamer&lt;/a&gt; 是知名的 open source multimedia framework，相當於 Windows 下的 &lt;a href="http://en.wikipedia.org/wiki/DirectShow"&gt;DirectShow&lt;/a&gt; 。而 &lt;a href="http://www.khronos.org/openmax/"&gt;OpenMAX IL&lt;/a&gt; 則是多家知名廠商參與制定的標準，其功能和 GStreamer 也有些類似。目前已有一些 multimedia framework 開始支援 OpenMAX IL，以使用 OpenMAX IL 相容的 component 。 OpenMAX IL 是一個 codec 的標準介面，實作該介面的 codec 可以被任何 OpenMAX IL client 所使用。目前 &lt;a href="http://heaven.branda.to/%7Ethinker/GinGin_CGI.py/show_kw_docs/Android"&gt;Android&lt;/a&gt; 使用的 opencore 所支援的 codec 實在很少，如果可以透過實作 OpenMAX IL 的 wrapper ，讓 FFmpeg 之類的 multimedia framework 所提供的 codec 能當成 OpenMAX IL 的 component 載入，那麼 opencore 瞬間就多出許多 codec 可以使用。&lt;/blockquote&gt;這個想法已經被 Prajnashi S 初步實現，雖然層面不同，但還是有很大的參考價值。下午將之前的程式碼升級到 Android cupcake (1.5 Release)，做了一些微調，在 target 上運作起來，先看看有哪些 plugin：&lt;br /&gt;&lt;blockquote&gt;# gst-inspect-0.10                               &lt;br /&gt;audiotestsrc:  audiotestsrc: Audio test source&lt;br /&gt;videotestsrc:  videotestsrc: Video test source&lt;br /&gt;omx:  omx_dummy: OpenMAX IL dummy element&lt;br /&gt;omx:  omx_mpeg4dec: OpenMAX IL MPEG-4 video decoder&lt;br /&gt;omx:  omx_h263dec: OpenMAX IL H.263 video decoder&lt;br /&gt;omx:  omx_h264dec: OpenMAX IL H.264 video decoder&lt;br /&gt;omx:  omx_mp3dec: OpenMAX IL MP3 audio decoder&lt;br /&gt;omx:  omx_amrnbdec: OpenMAX IL AMR-NB audio decoder&lt;br /&gt;omx:  omx_amrwbdec: OpenMAX IL AMR-WB audio decoder&lt;br /&gt;omx:  omx_aacdec: OpenMAX IL AAC audio decoder&lt;br /&gt;audioflingersink:  audioflingersink: Audio Sink (AudioFlinger)&lt;br /&gt;videoflip:  videoflip: Video flipper&lt;br /&gt;quicktime:  qtdemux: QuickTime demuxer&lt;br /&gt;coreelements:  capsfilter: CapsFilter&lt;br /&gt;coreelements:  fakesrc: Fake Source&lt;br /&gt;coreelements:  fakesink: Fake Sink&lt;br /&gt;coreelements:  fdsrc: Filedescriptor Source&lt;br /&gt;coreelements:  fdsink: Filedescriptor Sink&lt;br /&gt;coreelements:  filesrc: File Source&lt;br /&gt;coreelements:  identity: Identity&lt;br /&gt;coreelements:  queue: Queue&lt;br /&gt;coreelements:  filesink: File Sink&lt;br /&gt;coreelements:  tee: Tee pipe fitting&lt;br /&gt;coreelements:  typefind: TypeFind&lt;br /&gt;coreelements:  multiqueue: MultiQueue&lt;br /&gt;ffmpegcolorspace:  ffmpegcolorspace: FFMPEG Colorspace converter&lt;br /&gt;surfaceflingersink:  surfaceflingersink: android's surface flinger sink&lt;br /&gt;coreindexers:  memindex: A index that stores entries in memory&lt;br /&gt;videoscale:  videoscale: Video scaler&lt;br /&gt;staticelements:  bin: Generic bin&lt;br /&gt;staticelements:  pipeline: Pipeline object&lt;br /&gt;&lt;br /&gt;Total count: 12 plugins, 31 features&lt;/blockquote&gt;這表示，透過 &lt;a href="http://www.gstreamer.net/"&gt;GStreamer&lt;/a&gt;，Android 瞬間多了許多高品質的 plugin 與外加功能，也就能以 &lt;a href="http://www.ffmpeg.org/"&gt;FFmpeg&lt;/a&gt; 或既有的 gst-plugins 來處理各式的多媒體資料。現在 video 的處理，可透過 Surface Flinger sink 來操作，測試方式：&lt;br /&gt;&lt;blockquote&gt;# gst-launch-0.10 videotestsrc ! surfaceflingersink&lt;/blockquote&gt;以下是對應的螢幕輸出：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sfgko4Ar1eI/AAAAAAAAAqU/iD92breAUks/s1600-h/gst-on-android.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 194px; height: 320px;" src="http://1.bp.blogspot.com/_XYo3WYqTnPk/Sfgko4Ar1eI/AAAAAAAAAqU/iD92breAUks/s320/gst-on-android.png" alt="" id="BLOGGER_PHOTO_ID_5330050443641607650" border="0" /&gt;&lt;/a&gt;稍後，我們再來探討整合的議題。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-3169891637098012121?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/3169891637098012121/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/04/gstreamer-android.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3169891637098012121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/3169891637098012121'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/04/gstreamer-android.html' title='整合 GStreamer 到 Android'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XYo3WYqTnPk/Sfgko4Ar1eI/AAAAAAAAAqU/iD92breAUks/s72-c/gst-on-android.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-4277210739819268984</id><published>2009-04-27T07:55:00.005+08:00</published><updated>2009-04-29T18:01:12.765+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>0xlab 開幕！</title><content type='html'>愛因斯坦說過：「對一個人來說，所斯望的不是別的，而僅僅是他能全力以赴和獻身於一種美好事業」，今天，台灣有一小群工程背景的朋友，憑恃著如此的信念，打算為台灣的資訊產業，作些事情，所以成立 &lt;a href="http://www.0xlab.org/"&gt;0xlab&lt;/a&gt;。愛因斯坦又說：「信念最好能由經驗和明晰的思想來支持」，我們的成員則根基於過去參與自由軟體 / 開放原始碼專案的協同開發經驗，以及對追求理想和真善美的堅持，透過 &lt;a href="http://www.0xlab.org/"&gt;0xlab&lt;/a&gt; 這個嶄新的嘗試，將原本散落各地的開發資源，集中起來一同打拼，目前為止的成員有 8 位，依序是 Erin, Jeremy, John, Jserv, Julian, Olv, Thinker, Tick。每個人各有其專擅的領域，我們希望以團隊的優勢提供完整戰力，為軟體界做出些許貢獻，以技術的方式來愛台灣！&lt;br /&gt;&lt;br /&gt;個人一直認為，工程師若要愛台灣，最好的方式，就是強化本職學能，無論是軟硬體技術，使其累積、成長，進而提升到更高的層次。今天，2009 年 4 月 27 號，是 &lt;a href="http://www.0xlab.org/"&gt;0xlab&lt;/a&gt; 的誕生日，專注於推動硬體廠商與開放軟體社群的聯繫，成為軟硬體整合方案提供者，讓更多基於開放軟體的裝置走入日常生活。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-4277210739819268984?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/4277210739819268984/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/04/0xlab.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4277210739819268984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/4277210739819268984'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/04/0xlab.html' title='0xlab 開幕！'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1795333590425870072.post-5839041280929471093</id><published>2009-04-26T03:48:00.009+08:00</published><updated>2009-04-29T18:00:49.831+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dalvik'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='llvm'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='doom'/><title type='text'>當 Compiler 遇上 Mobile</title><content type='html'>過去我們很難聯想進階的編譯器 (compiler) 技術到底與移動平台何涉，但隨著基礎建設的突破，我們就該有不同的思維。&lt;br /&gt;&lt;br /&gt;從1960 年代發展至今，編譯器技術已是電腦科學最成熟的基礎之一，不斷地成長與蛻變，而透過 open source，GNU GCC 與 &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; (Low Level Virtual Machine) 計畫獲得空前的成功，累積了驚人的編譯器技術。儘管 parser 仍是 compiler 的關鍵技術，但今日，我們會著重於打通任督二脈的技術展現，過去耳熟能詳卻貌似獨立的項目，比方說 virtual machine, binary translator, JIT compiler, HotSpot JVM, 等等，如今好似整合了金庸書中的武功精髓、淬湅出武術菁華，形成一套獨到的武功系統，透過 LLVM 一類的整合性技術而一瀉千里。&lt;br /&gt;&lt;br /&gt;幾年前，知名的遊戲設計公司 &lt;a href="http://www.idsoftware.com/"&gt;id Software&lt;/a&gt; 在該公司靈魂人物 John Carmack 的主導下，將 Doom (毀滅戰士) 核心的遊戲引擎以 GNU GPL 開放授權釋出，自此開啟廣泛的平台移植與功能強化的的濫觴。早期的 Doom GPL 程式碼被 Sam Lantinga 移植到 &lt;a href="http://www.libsdl.org/"&gt;SDL 圖形函式庫&lt;/a&gt;，藉由 SDL 優異的可攜性，眾多硬體環境得以運行 Doom 遊戲，儘管遊戲的資料檔並非自由軟體。另一方面，現在最火熱的移動平台，就屬 Google Android 開放源碼平台，為了迴避 Sun Microsystems 對 Java 的控制權 (logo + patent)，該平台整合大部分 Apache &lt;a href="http://harmony.apache.org/"&gt;Harmony&lt;/a&gt; 專案的成果，建立了一套貌似 Java 語言但執行環境大異於 Java 的嶄新虛擬機器 -- &lt;a href="http://en.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik&lt;/a&gt;，將原本 stack-based VM (JVM) 轉換為 register-based VM (Dalvik VM)，而無論這裡頭有多少玄機，就 Android 的程式設計來說，Java 是唯一可用的程式語言，要不得搭配 Android framework / class library，不然就是透過 JNI 去呼叫 C/C++ 撰寫的動態函式庫。作為一個「&lt;a href="http://blog.linux.org.tw/%7Ejserv/archives/001965.html"&gt;慣 C 魔人&lt;/a&gt;」， 筆者反覆思考，是否能將以 C 語言搭配 SDL 函式庫撰寫的 Doom，透過編譯器轉換為 Android 平台可運作的 Dalvik bytecode 呢？此舉不僅讓 C/C++ 程式跨平台執行，還為移動平台提供了新的附加價值，於是，筆者就開始一系列的 hacking，現在有初步的成果，日前已發表於 &lt;a href="http://osdc.tw/"&gt;OSDC.tw&lt;/a&gt; 2009 的「窮得只剩下 Compiler」議程中，請參考以下螢幕快照：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/SfNuAxG1dsI/AAAAAAAAAps/01Kfcpjz9bg/s1600-h/doom-on-android.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 205px; height: 320px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/SfNuAxG1dsI/AAAAAAAAAps/01Kfcpjz9bg/s320/doom-on-android.jpg" alt="" id="BLOGGER_PHOTO_ID_5328723743570491074" border="0" /&gt;&lt;/a&gt;這可不是紙老虎或單純貼圖，電動玩具當然是設計來玩的：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XYo3WYqTnPk/SfNuQHl4kDI/AAAAAAAAAp0/mswEoUOG60s/s1600-h/doom-on-android2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 205px; height: 320px;" src="http://2.bp.blogspot.com/_XYo3WYqTnPk/SfNuQHl4kDI/AAAAAAAAAp0/mswEoUOG60s/s320/doom-on-android2.jpg" alt="" id="BLOGGER_PHOTO_ID_5328724007304335410" border="0" /&gt;&lt;/a&gt;詳細的資訊可參閱發表於 OSDC.tw 的議程簡報：&lt;br /&gt;&lt;center&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1314323"&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=compiler-new-era-090420000939-phpapp01&amp;amp;stripped_title=what-can-compilers-do-for-us"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=compiler-new-era-090420000939-phpapp01&amp;amp;stripped_title=what-can-compilers-do-for-us" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/jserv"&gt;Jim Huang&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/center&gt;筆者同事 &lt;a href="http://luse.blogspot.com/"&gt;luse&lt;/a&gt; 嘗言：「現在是一個充滿編譯器的世界，身為一個工程師，每次聽到編譯器技術，覺得深不可測 (或是腦海忽然浮現起自動機的回憶) 而輕言放棄，實著可惜」。許多人印象中艱澀的 (dynamic) Compiler 技術，其實廣泛應用於我們電腦資訊產業中，以「到處都是 Compiler」來闡述現實，一點也不為過。如此的案例多如牛毛，比方說，現在 Web 2.0 與 Mobile web browser 正火熱，為了要能改善 Web 應用程式的效能，Google 與 Apple 兩家公司的工程團隊，各自推出 V8 與 SquirrelFish Extreme 等 Just-In-Time compiler for JavaScript，而 Mozilla Foundation 更是將高速的 JavaScript 引擎當作 Mozilla 2 的重要賣點，知名的自由軟體開發者 &lt;a href="http://www.red-bean.com/%7Ejimb/"&gt;Jim Blandy&lt;/a&gt; 甚至離開專業 GNU Toolchain 開發公司 &lt;a href="http://www.codesourcery.com/"&gt;CodeSourcery&lt;/a&gt;，加入 Mozilla Corporation，就為了致力開發 &lt;a href="https://wiki.mozilla.org/JavaScript:ActionMonkey"&gt;ActionMonkey&lt;/a&gt; (整合 Mozilla 原有 &lt;a href="http://www.mozilla.org/js/spidermonkey/"&gt;SpiderMonkey&lt;/a&gt; 與 Adobe 貢獻的 &lt;a href="http://www.mozilla.org/projects/tamarin/"&gt;Tamarin&lt;/a&gt;)。自此，這個在瀏覽器平台的戰役，從桌面系統延續到手機，又將從手機移轉到各種不同的資訊裝置上。&lt;br /&gt;&lt;br /&gt;而，撇開 JavaScript 執行引擎不論，實際上，連 Firefox/Mozilla 底層的向量繪圖函式庫 &lt;a href="http://www.cairographics.org/"&gt;Cairo&lt;/a&gt;，也透過 JIT compiler 技術，去提昇整體繪圖的效能與使用者體驗。日前，Dan Amelang 揭露他的開發成果，可參見郵件論壇的訊息 "&lt;a href="http://lists.cairographics.org/archives/cairo/2009-January/016186.html"&gt;JIT for pixman&lt;/a&gt;"。&lt;a href="http://cgit.freedesktop.org/pixman/"&gt;pixman&lt;/a&gt; 是提供給 X Window System 與 Cairo 使用的 pixel-manipulation 函式庫，顧名思義，就是處理 image compositing 與 trapezoid rasterization 等操作，而在 Dan Amelang 的論文 "&lt;a href="http://vpri.org/pdf/tr2008002_jitblt.pdf"&gt;Jitblt: Efficient Run-time Code Generation for Digital Compositing&lt;/a&gt;" 給予令人振奮的突破，無疑是個極佳的突破點，我們也可預見 (dynamic) compiler 技術在更多資訊領域的廣泛應用。&lt;br /&gt;&lt;br /&gt;當編譯器技術走入新的層次時，就需要更強大且多元的 Toolkit，&lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; 專案的出現，在整個電腦技術典範移轉 (paradigm shift) 的衝擊下，以嶄新編譯器架構、自由軟體協同開發模式，給予我們突破限制的可能性，顯然，我們可確定 LLVM 應用於 Android 應用程式開發，僅是一個牛刀小試，好戲才要登場呢。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1795333590425870072-5839041280929471093?l=jserv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jserv.blogspot.com/feeds/5839041280929471093/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://jserv.blogspot.com/2009/04/compiler-mobile.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/5839041280929471093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1795333590425870072/posts/default/5839041280929471093'/><link rel='alternate' type='text/html' href='http://jserv.blogspot.com/2009/04/compiler-mobile.html' title='當 Compiler 遇上 Mobile'/><author><name>jserv</name><uri>http://www.blogger.com/profile/16050238364148074589</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_XYo3WYqTnPk/TU9xv-_42AI/AAAAAAAABFI/BED_eBBS4JI/s220/jserv-elder.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XYo3WYqTnPk/SfNuAxG1dsI/AAAAAAAAAps/01Kfcpjz9bg/s72-c/doom-on-android.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
