2012年2月10日 星期五

Android 開發筆記 - 實機模擬 GPS 座標變化 @ Android 3.2

DDMSLocation


對 Android 模擬器來說,可以透過 DDMS 模擬 GPS 座標及其變化,然而在實體機器上卻沒看到幾篇相關文章?之所以用實體機器的主因,實在是平板模擬器跑太慢了!程式還是在實體機器跑得順多囉。


用法:


在 AndroidManifest.xml 檔案中,增加 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 設定。


新增函數:


public void setMockLocation(double latitude, double longitude)
{
    LocationManager testLM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
   if( testLM != null )
   {
      try
      {
         String mocLocationProvider = testLM.GPS_PROVIDER;
         testLM.addTestProvider(mocLocationProvider, false, false, false, false, false, false, false, 0, 5);
         testLM.setTestProviderEnabled(mocLocationProvider, true);
         Location loc = new Location(mocLocationProvider);
         loc.setTime(System.currentTimeMillis());
         loc.setLatitude(latitude);
         loc.setLongitude(longitude);
         testLM.setTestProviderLocation(mocLocationProvider, loc);
         Toast.makeText(getApplicationContext(), "MockGPS Set", Toast.LENGTH_SHORT).show();
      }
      catch( Exception e )
      {
         Toast.makeText(getApplicationContext(), "MockGPS Failed", Toast.LENGTH_SHORT).show();
      }
  }
  else
      Toast.makeText(getApplicationContext(), "No LocationManager", Toast.LENGTH_SHORT).show();
}


之後,在程式碼中就可以透過 setMockLocation(0,0) 用來,來模擬假的 GPS 囉,最大的缺點仍是需要寫程式。


 應用:


除了在應用程式中模擬 GPS 的測試外,這東西應該有機會跟其他 GPS 定位裝置結合,例如用藍芽傳輸或 wifi 傳輸的 GPS 定位裝置,把收到的 GPS 給手機定位。


2012年2月5日 星期日

BeagleBoard-xM 教學筆記 - 安裝 Android 2.3 Gingerbread 和 Android 4.0 ICS @ Ubuntu 10.04

bbxm_ics-01 bbxm_g-03


在任何嵌入式開發板上安裝 Android 好像是近幾年的習俗慣例?!所以也就來試了一下,而今年的目標定的半年目標是在開發板上安裝 Android 和進行效能調適,再遠一點則是 Webkit 方面的事。只是當我了解更多了之後,發現 Android Porting 其實沒那麼簡單,另外,做完 porting 不代表能用。


最初想只拿 Android Open Source 跟板子相關檔案後,親自一步步調教,後來發現這些事就是國內外有名的 project 在搞得,看來一個人弄真的太累了 XD 除此之外,網路上絕大部分的 porting 筆記都只是把別人設定好的安裝方式跑一次就結束了 Orz 看到這讓我輕鬆(失落)了不少。


Android 4.0 ICS 使用 rowboat Prebuilt Images:


$ wget http://rowboat.googlecode.com/files/beagleboard-xm.tar.gz
$ md5sum beagleboard-xm.tar.gz
1255347a549530fc6653772d1711a305 beagleboard-xm.tar.gz (@2012-02-04)
$ tar -xvf beagleboard-xm.tar.gz
$ cd beagleboard-xm
$ sudo ./mkmmc-android.sh /dev/sdX


Assuming Default Locations for Prebuilt Images
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdX2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdb doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


重新把 microSD 插入,修改 rootfs 權限部份,否則開機會看到 Kernel panic - not syncing: No init found. 訊息


$ sudo chmod 777 -R /media/rootfs/
$ sync
$ umount /dev/sdX*


bbxm_ics-04 bbxm_ics-03


之後安置好 beagleboard-xM 後,開機約 12 分鐘就可以看到 Android ICS 介面,可以透過滑鼠去操作,只是操作上滿卡的!還滿常出現 ANR (Application is Not Responding)。果真 porting 是一回事,能不能用又是另一回事了。


Android 2.3 Gingerbread 使用 TI Prebuilt Images:


$ wget http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_DevKit_1_0/exports/TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ md5sum TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
ff14ff771aa067dff5cc40106527d119 TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz (@2012-02-03)
$ tar -xvf TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ cd TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm
$ sudo ./mkmmc-android.sh /dev/sdX


Assuming Default Locations for Prebuilt Images
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdX2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdb doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


bbxm_g-01 bbxm_g-02


之後安置好 beagleboard-xM 後,開機約 23 分鐘就可以看到 Android Gingerbread 介面,但是USB滑鼠鍵盤沒被啟用,在加上我也沒觸控面板,所以測試就停在這邊。


至於手動編譯及安裝 Android 的流程,方向大概如下:



  1. get toolchain & AOSP & kernel & u-boot & x-load (有些 project 已內含不需額外再抓)

  2. build u-boot (x-boot)

  3. build x-load (MLO)

  4. build AOSP (uImage & tools)

  5. build android_rootfs (透過 AOSP 產出 /out/target/product/beagleboard 裡的 root 跟 system 來建立)

  6. build boot.scr

  7. export to microSD


以 TI-Android-GingerBread-2.3-DevKit-1.0_DeveloperGuide 為例:


取得 android source code (patched):


$ mkdir ~/rowboat-android && cd ~/rowboat-android
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-GingerBread-2.3-DevKit-1.0.xml
$ repo sync


取得 TI_Android_DevKit:


$ cd ~/
$ wget http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_DevKit_1_0/exports/TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ tar -xvf TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ ls -R TI_Android_GingerBread_2_3_DevKit_1_0/Tools/


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/:
flashing-utility.tar.gz mk-bootscr mk-mmc pinmux-utility.tar.gz signGP


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-bootscr:
mkbootscr mkimage README


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-mmc:
mkmmc-android.sh README.txt


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/signGP:
signGP signGP.c


環境準備:


$ mkdir ~/rowboat-android-build
$ vim ~/.bashrc
export USE_CCACHE=1
export PATH=/home/user/rowboat-android/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin:/home/user/bin:$PATH


建立 x-load:


$ cd ~/rowboat-android/x-load-omap3
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- omap3beagle_config
$ make CROSS_COMPILE=arm-eabi-
$ cp x-load.bin ~/rowboat-android-build/
$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Tools/signGP/signGP ~/rowboat-android-build/
$ cd ~/rowboat-android-build/
$ $ ./signGP ./x-load.bin
$ mv x-load.bin.ift MLO


建立 u-boot:


$ cd ~/rowboat-android/u-boot-omap3/
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- omap3_beagle_config
$ make CROSS_COMPILE=arm-eabi-
$ cp u-boot.bin ~/rowboat-android-build/
$ cp tools/mkimage ~/bin


建立 kernel:


$ cd ~/rowboat-android/kernel
$ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
$ make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage
$ cp arch/arm/boot/uImage ~/rowboat-android-build/


建立 android rootfs:


$ cd ~/rowboat-android/
$ time make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3
TARGET_PRODUCT=omap3evm
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRH55
============================================
...
real 106m20.076s (依機器情況而定,此例是在 Virtualbox 中的 Ubuntu 10.04 desktop,而 Host CPU 是 AMD x4 945)
user 115m30.980s
sys 7m31.390s
$ cd out/target/product/beagleboard
$ mkdir android_rootfs
$ cp -r root/* android_rootfs
$ cp -r system android_rootfs
$ sudo ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2
$ cp rootfs.tar.bz2 ~/rowboat-android-build/


建立 boot.scr:


$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-bootscr/mkbootscr ~/rowboat-android-build/
$ cd ~/rowboat-android-build/
$ ./mk-bootscr


匯入 microSD:


$ cd ~/rowboat-android-build/
$ cp -r ~/TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm/Media_Clips/ ~/rowboat-android-build/
$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm/mkmmc-android.sh ~/rowboat-android-build/
$ sudo ./mkmmc-android /dev/sdX MLO u-boot.bin uImage boot.scr rootfs.tar.bz2 Media_Clips
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdx2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdX doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


參考資料:


http://code.google.com/p/rowboat/wiki/ICSonBeagleboard
http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3-DevKit-1.0_DeveloperGuide
http://androside.com/page_contents/page_android_beagleGingerPorting.html


2012年2月1日 星期三

BeagleBoard-xM 教學筆記 - 嘗試安裝 Ubuntu Natty Narwhal (11.04) @ Ubuntu 10.04

嘗試完把 microSD 恢復到原廠後,接著在 BeagleBaord xM 安裝 Ubuntu 看看。網路上可以找到不少文件和教學,但有些過程繁瑣老舊,就來試試看 Ubuntu 官網上提的步驟了:OmapNetbook。結果?可以看到系統裝起來,但缺乏 usb 跟網路的功能,不曉得是不是因為 BeagleBoard-xM Rev C 的關係?因此若真的需要把玩 Ubuntu 的,建議使用 http://elinux.org/BeagleBoardUbuntu#Demo_Image (Ubuntu 11.10) 即可,一個步驟安裝完,並且網路或 USB 鍵盤都 ok 啦。


對我而言,第一次接觸碰到幾個問題:


什麽是 OMAP?


OMAP是德州儀器(IT)提出的「 開放式多媒體應用平台」架構。在 BBxMSRM_latest.pdf 中可以查到這塊 BeagleBoard xM 板子的 CPU 是 DM3730,而 BeagleBoard 是 OMAP3530 的,然而 DM3730 是啥?在網路上找了一下,有人說這是 OMAP3630 的開發版,其中 DM 是開發版,OMAP是客戶版,但又有一說是 OMAP 是給 cell phone 的,剩下的是 AM/DM/davinci 等等,並且說在 BeagleBoard 上的 OMAP3630/DM3730 是對應到 cell phone 上的 OMAP3530 和 OMAP 3630等,總之故事好像不少,但我需要的只是確定 DM3730 也是指 OMAP 3系列的就好,有興趣的可以在 http://www.beagleboard.org/irclogs/index.php?date=2011-02-16搜尋 DM3730 關鍵字。


什麽是 Netbook?


查 wiki 的結果就是小筆電的意思,可以去看看 Ubuntu Netbook Edition - wiki 的介紹,其中有提到 Ubuntu Netbook 11.04 已經規劃納入 Desktop 版本,因此在 11.10 時,只會看到 OMAP3 preinstalled desktop image 版本,在這之前可以看到 Instruments OMAP3 preinstalled netbook image 等。


由於 DM3730 是 OMAP3630 for cell phone world 的關係,所以在此採用 OMAP3 系列。在 http://cdimage.ubuntu.com/releases/11.04/release/ 挑選 Texas Instruments OMAP3 preinstalled netbook image 和 Texas Instruments OMAP3 preinstalled headless image 來玩玩。


https://wiki.ubuntu.com/ARM/OmapNetbook 指示即可完工,在此列一些指令筆記:


$ sudo umount /media/* (或 umount /dev/sdX* )


$ sudo time sh -c 'zcat ./ubuntu-11.04-preinstalled-headless-armel+omap.img.gz | dd bs=4M of=/dev/sdc ; sync '
0+51047 records in
0+51047 records out
1675173888 bytes (1.7 GB) copied, 1961.25 s, 854 kB/s
64.90user 5.95system 32:41.61elapsed 3%CPU (0avgtext+0avgdata 5760maxresident)k
417368inputs+3271824outputs (2major+1417minor)pagefaults 0swaps

$ sudo cp ./uImage /media/PartitionBoot/
$ sudo cp ./vmlinuz-2.6.38-8-omap /media/PartitionRoot/boot


擺好 microSD 後就可以啟動 beagleboard-xM 啦,接好 RS232 to USB 後,可以透過 screen -U /dev/ttyUSB0 115200 來查看板子目前的設定狀況(建議先用 minicom 初始化後,關掉 minicom,再用 screen,可避免 screen 有時沒資料出來),通常大概 6 分鐘以內就能看到相關設定畫面,後來的流程就像安裝 Ubuntu 一樣的選單,而 microSD(此為一開始內建卡)的讀寫速度將影響啟動所耗費的時間。選好環境設定後,大概又要等 15 分鐘的安裝初始化。


只是無論是 desktop(netbook) 或 server(headless) 版,從 USB 接的鍵盤跟滑鼠都無用 XD 這樣對 desktop 版就無法進入的初始化設定啦,而 Server 版倒可以透過 /dev/ttyUSB0 來作設定,只是設定完還是無用。在網路上打滾了一會,看到的解法大概都是更新 uImage 和 boot.src,有的是取得 Angstrom Linux Demo 的檔案,有的就乾脆依照 elinux.org 的安裝方法了 BeagleBoardUbuntu#Demo_Image


所以,我就很懶的直接用 elinux.org - BeagleBoardUbuntu#Demo_Image,只需安裝相關軟體後,按一下指令就搞定了!經過測試,網路、鍵盤無痛搞定,並且因為檔案很小,只花不到 10 分鐘(上面都要30起跳)。


$ wget http://rcn-ee.net/deb/rootfs/oneiric/ubuntu-11.10-r3-minimal-armel.tar.xz
$ tar -xJf ubuntu-11.10-r3-minimal-armel.tar.xz (若不行記得安裝xz-utils)
$ cd ubuntu-11.10-r3-minimal-armel
$ sudo time ./setup_sdcard.sh --mmc /dev/sdX --uboot "beagle_xm" (/dev/sdX是 microSD 位置)
...
Are you 100% sure, on selecting [/dev/sdX] (y/n)? y
...
Downloading Device's Bootloader ...
Unmounting Partitions ...
Using fdisk to create BOOT Partition ...
Setting Boot Partition's Boot Flag ...
Creating rootfs ext4 Partition ...
Formating Boot Partition ...
Populating Boot Partition ...
Using mkimage to create uImage ...
Using mkimage to create uInitrd ...
Copying uEnv.txt based boot scripts to Boot Partition ...
Finished populating Boot Partition ...
Transfer of Base Rootfs Complete, syncing to disk ...
Finished populating rootfs Partition
-----------------------------
setup_sdcard.sh script complete
1.32user 2.52system 6:54.94elapsed 0%CPU (0avgtext+0avgdata 14848maxresident)k
2234inputs+1093280outputs (3major+55864minor)pagefaults 0swaps


收工,改天在找看看如何解決官方 Ubuntu 提供的 Image 問題。


2012年1月22日 星期日

iPad2 iOS 5.0.1 Jailbreak @ Mac OS X

昨天看到一堆討論串,剛好我也有想研究的 app ,心一橫就跟著做把 iPad2 Wifi iOS 5.0.1 給 JB 了!為啥要心一橫?因為 JB 有風險,除此之外,還要在自己的機器執行別人寫的程式!多麼的危險啊!!


此筆記僅供個人參考,沒特別需要請不要 JB 且 JB 有風險,請自行承擔


總之,需要的檔案大概 2 個:



流程:


  1. 用 iTunes 備份 iPad2 資料(請移除備份密碼)

  2. 在 Mac OS X 上,執行 Absinthe 程式 (該程式會顯示目前 JB 進度)

  3. 當 iPad2 重新啟動後,就會多一個 Absinthe App

  4. 記得把網路設定好並且開啟 VPN 功能

  5. 點選 Absinthe App,順利的話就可以看到網頁以及進入 iPad2 重新啟動的流程

  6. 經過重新啟動後, iPad2 上頭就看到 Cydia 啦!


參考資料:





2012年1月20日 星期五

[Linux] 解決 SCIM 輸入法導致視窗失焦問題 @ Ubuntu 10.04 Desktop

預設的輸入法是用 iBUS,我忘了啥理由換成 SCIM,總之現在就是透過 SCIM 使用酷音輸入法。當初似乎是用 Synaptic 安裝的,使用 SCIM 時常常會有失焦的現象,也就是突然無法對某個視窗做事情,包括對該視窗進行操作或是滑鼠框點全選等等功能,解決方式就是透過 tab+alt 切換到其他視窗再切回來,或是動該視窗一些按鈕作動作(例如存檔),才解決了這個怪現象。


所幸網路上也有人碰到這種問題,解法就是安裝 scim-bridge-client-gtk (預設可能已經裝了)和調整 SCIM 預設的設定:


$ sudo apt-get install scim-bridge-client-gtk
$ sudo vim /etc/X11/xinit/xinput.d/scim
# GTK_IM_MODULE=xim # 舊的,把他替換掉
GTK_IM_MODULE="scim-bridge"


如此之後,重新登入視窗,顯示上有點不一樣,例如用 gedit 編輯文件時,發現打得關鍵字若串的起來會反白,大概算是更換成功吧?但反白也以點麻煩,因為我把gedit底色調黑字調白,於是又找到把這種東西弄掉的方式:


$ scim-setup
IMEngine -> Chewing -> Decorative Color -> 把一堆顏色淡(白灰色)的都改成適合的就行了(因為 chrome 輸入網址是白色的,不能用全黑 XD)


終於,忍了一個多月 SCIM 失焦問題,希望可以從此解決囉!