2016年12月2日 星期五

[C語言]讀取txt檔案內容輸出bin file

手邊有個txt檔案,檔案內容如下

00 FF FF FF FF FF FF 00 4C 2D 1B 0D 45 4D 5A 5A
29 1A 01 03 0E 30 1B 78 2A 4A 05 A2 5A 52 A1 27
0D 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00
A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C
45 00 DD 0C 11 00 00 1E 00 00 00 FD 00 38 4B 1E
51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53
32 32 46 33 35 30 0A 20 20 20 20 20 00 00 00 FF
00 48 34 5A 48 41 30 30 30 39 36 0A 20 20 01 EB

我想把txt內容轉換成*.bin file

1. 開發環境 : DEV C++

2. 程式碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

size_t ReadTxtFile(FILE *inf, unsigned char *dest, FILE *outfile) 
{
    size_t count = 0;
    int n;
    unsigned char OneByte;
    
    if (dest == NULL) 
    {  
        //讀取txt檔案內容,轉成16進制.直到讀取結束     
        while ((n = fscanf(inf, "%hhx", &OneByte)) == 1 ) 
        {
          //printf("@@ %x\n",OneByte);
          //把讀取出來的資料寫入bin檔  
          fwrite(&OneByte, sizeof(unsigned char), 1, outfile);
          count++;
        }
    }
  
    if (n != EOF) 
    {
        ;  // handle syntax error
    }
    
    //printf("count=%d\n",count);
    return count;
}

int main() 
{
    //讀取txt檔案,檔案一定要放在跟目錄下不然會找不到 
    FILE *FileIn = fopen("d:\\21.txt", "rt");
    //如果檔案為空return fail 
    if (!FileIn) 
    {
        fclose(FileIn);
        return -1;
    }
    
    //創建一個bin檔 
    FILE* FileOut = fopen("d:\\fileOut.bin","wb+");
    //如果檔案為空return fail
    if (!FileOut) 
    {
        fclose(FileOut);
        return -1;
    }
    
    //轉換檔案 
    size_t n = ReadTxtFile(FileIn, NULL, FileOut);
    
    //把指標指向檔案頭 
    rewind(FileIn);
  
    //關閉檔案 
    fclose(FileIn);
    fclose(FileOut);
    
    system("PAUSE");
    return 0;
 }



2016年2月25日 星期四

上海地鐵一日遊

蘇州to上海一日遊
1.  上網訂大陸火車訂票
蘇州火車站 到 上海火車站
https://kyfw.12306.cn/otn/leftTicket/init
G系列最快 2等座位大約 40 RMB
蘇州跟上海有好幾個火車站要注意
PS . 早上買票時 記得要買來回車票 以免沒車票回蘇州
2.  高鐵到上海站後
坐地鐵 4 號線轉10號線 到 豫園站下車
往城隍廟跟豫園方向走 是個很大的商圈
豫園跟蘇州園林很像看過蘇州園林可以跳過豫園
到豫園旁邊吃小籠包 很貴 嘗鮮即可
3. 田子坊
捷運9號線 打浦橋站下車 往田子坊
田子坊是個古色古香的商圈
街道裡面都小小的賣很多小物品
也很多復古的小物品
是個很好敗家的地方 => 要控制好你身邊的女性 不要隨便放開他的手
4. 新天地
捷運10號線 新天地站下車
新天地附近很多百貨商場
往新天地酒吧街走去
裡面很多賣咖啡跟酒的店家 => 裡面商品價位都不便宜
街道裡古色古香 走累了可以找間有FU的店家 進去坐坐讓腳的血液回流
5. 南京步行街
捷運2號線 南京東路站下車
南京步行街很像台北東區
周邊都是賣商品的店家
往外灘方向行走
可以看到一些歷史的建築物
6. 外灘 [ 建議晚上到 ]
外灘是上海最著名的夜景觀看處
晚上時對岸陸家嘴的高樓會開燈
可以謀殺不少底片
而外灘轉頭往南京東路看去
一整排歷史建築物在你眼前
都是舊上海時期保留下來的
到外灘時要小心包包 小偷很多

2015年2月3日 星期二

VirtualBox enable Shared Folder from Ubuntu 14.10

記錄一下以免忘記

在VirtualBox 安裝完 Ubuntu 後enable Shared Folder

STEP 1

1. 安裝VBoxguestadditions.iso

2. 裝置 => 插入Guest additions CD 

STEP 2

1. VirtualBox => 管理員 => 設定值 => 公用資料夾



設定要分享的資料夾路徑與名稱,另外把「自動掛載」與「設為永久」兩個選項也勾起來,


STEP 3

執行ubuntu

ALT+CTRL+T 叫出terminal

將所有需要用到分享資料夾的帳號加入 vboxsf 群組。
sudo adduser <username> vboxsf
STEP 4

登出虛擬機器的 Linux,重新登入。

STEP 5

開啟 /media/,就可以看到分享的資料夾了。

參考文章:
http://www.gtwang.org/2013/03/virtualbox-shared-folder.html
http://ubuntuportal.com/2012/06/how-to-access-virtualbox-shared-folder-from-ubuntu-12-04-guest-machine.html

Virtualbox中,安裝Ubuntu 14.10 x64 畫面亂掉無法安裝

今天在安裝 新版ubuntu 時遇到

安裝畫面亂掉問題

google了一下原來是因為解析度太低造成

如下圖


方法就是:

在畫面亂掉後,按鍵盤「右邊的CTRL鍵」+「F1鍵」,然後

再按鍵盤「右邊的CTRL鍵」+「F7鍵」,切換回去!

安裝畫面就正常了


參考網址:
http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=92710

2012年5月6日 星期日

[android] 建立service範例

記錄一下以免以後忘記
Service是沒有UI的,它永遠是在背景工作
練習題目:當執行APP上的播放按鈕後,會開始播放音樂,按下停止就不會繼續播放

Step 1.在eclipse建立一個android project
File -> New -> Other -> Android Project
Step 2.專案建立完成後,建立UI
res -> layout -> main.xml
加入兩個button[紅色字體]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnStartService" //service ID & name參見R.java
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start Service" //模擬器上button秀出來的名稱
        />

    <Button
        android:id="@+id/btnStopService" //service ID & name參見R.java
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Stop Service" //模擬器上button秀出來的名稱
        />
</LinearLayout>
Step 3.新增一個class for 繕寫service
在eclipse右邊的package explorer專案中的src,點一下箭頭處,展開src,下面的xxx.xxx,點一下箭頭處,展開xxx.xxx,按滑鼠右鍵New -> Class
Name: Servicetest[第一個字要大寫]
Superclass: android.app.Service
如果Superclass用key的沒反應請在右邊的browse點進去再choose a type處key in
完成後按下finish就可以看到多一個Servicetest.java

Step 4.開啟src -> xxx.xxx -> Service.java加入以下程式碼
package com.nash.service;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Service_without_UI extends Activity {
    private Button btnStartService;
    private Button btnStopService;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnStartService = (Button) findViewById(R.id.btnStartService);
        btnStopService = (Button) findViewById(R.id.btnStopService);
        
        btnStartService.setOnClickListener(new View.OnClickListener() {
   
     @Override
     public void onClick(View v) {
  // TODO Auto-generated method stub
  Intent i = new Intent(Service_without_UI.this,Servicetest.class);
  startService(i);
     }
 });
        
        btnStopService.setOnClickListener(new View.OnClickListener() {
   
     @Override
     public void onClick(View v) {
         // TODO Auto-generated method stub
         Intent i = new Intent(Service_without_UI.this, Servicetest.class);
         stopService(i);
     }
 });
  
    }
}
Step 5.開啟新增的Servicetest.java加入以下程式碼
/**
 * 
 */
package com.nash.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
//import android.util.Log;
import android.widget.Toast;

/**
 * @author nash
 *
 */
public class Servicetest extends Service {

 MediaPlayer m;
 /* (non-Javadoc)
  * @see android.app.Service#onBind(android.content.Intent)
  */
 @Override
 public IBinder onBind(Intent arg0) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
 }

 @Override
 public void onStart(Intent intent, int startId) {
  Toast.makeText(this, "Service start", Toast.LENGTH_SHORT).show();

  if (m!=null) m.stop();
  
  m = MediaPlayer.create(this, R.raw.deal); //raw是放mp3的資料夾,deal是mp3的檔名
  m.start();
 }
 
 @Override
 public void onDestroy() {
  Toast.makeText(this, "Service stop", Toast.LENGTH_SHORT).show();
  m.stop();
  m.release();
 }
}
Step 6.開啟AndroidManifest.xml加入以下程式碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nash.service"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Service_without_UI"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".Servicetest"
            android:label="@string/app_name">
        </service>
    </application>

</manifest>
參考資料:
http://www.kfsoft.info/article-40-9--%E5%BB%BA%E7%AB%8BService.html
http://www.jollen.org/blog/2009/01/jollen-android-programming-8.html

2012年4月24日 星期二

[Linux]ubuntu 11.04(64 bit)抓取android4.0.4原始碼跟編譯source code/SDK/kernel

1.環境
一.vmware 8.0下掛載ubuntu 11.04(64 bit)
二.main OS : win 7
1.1軟體需求
一般情況下,你將需要以下工具:
1.1.1.Python 2.5 -- 2.7.
1.1.2.GNU Make 3.81 -- 3.82.建議安裝3.81
1.1.3.JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older.
1.1.4.Git 1.7 or newer.
1.1.5 GCC and GCC++ : 4.4 -- 4.5
1.1.1.Python:
檢查版本,沒有就安裝
[nash@.....]# python --version
[nash@.....]# sudo apt-get install python
1.1.2.GNU Make 3.81 -- 3.82.
檢查版本,沒有就安裝
[nash@.....]# make --version
[nash@.....]# sudo apt-get install make
1.1.3.JDK 6
檢查版本,沒有就安裝
[nash@.....]# java -version
Installing the JDK
請見[Linux] ubuntu 11.04(32 bit)建立開發環境
1.1.4.Git
檢查版本,沒有就安裝
[nash@.....]# git --version
[nash@.....]# sudo apt-get install git
1.1..編譯android source code需要的套件
64 bit
[nash@.....]# sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc
1.1.7.設定 USB 存去(有ROOT全線可跳過)
在GNU/Linux系統(Ubuntu系統),默認情況下,普通用戶不能直接訪問USB設備。該系統需要進行配置,來允許此類訪問。
推薦的方法是創建一個文件/etc/udev/rules.d/51-android.rules(作為root用戶),內容如下
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
這種方式在Ubuntu Hardy Heron (8.04.x LTS)和Lucid Lynx (10.04.x LTS)已經測試過可行。其他版本的GNU/Linux的Ubuntu或其他變種可能需要不同的配置。
1.1.8.Setting up ccache(“compiler cache”的縮寫)
該工具會高速緩存編譯生成的信息,並在編譯的特定部分使用高速緩存信息,比如header,這樣就節省了使用cpp解析這些信息所需的時間。假如foobar.h中包含對其他header的引用,ccache會用那文件的cpp-parsed版本来取代include。ccache只是將最後的文本拷貝到只文件中,讓他可以立即被編譯,而不是真的去讀取、理解並解釋其內容。
您可以選擇性地構建使用ccache的編譯工具。 ccache的作用,用於加快重新編譯。如果你時常"make clean",或者如果你經常切換不同的建置產品。
在/home/user/.bashrc中加入環境變數
export USE_CCACHE=1
默認情况下cache會保存在~/.ccache目錄下,如果主目錄位於NFS或其他非本地文件系統上,也將下面環境變數加到/home/user/.bashrc:
export CCACHE_DIR=<path-to-your-cache-directory> #修改為cache目錄位置。
推薦的cache目錄大小50-100GB
prebuilt/linux-x86/ccache/ccache -M 50G
該設置會保存到CCACHE_DIR中,該命令為長效的,不會因為系統重啟而失效。
1.1.8 gcc
Ubuntu11.04 gcc與g++版本為4.5,如果想修改系統default gcc or g++
[nash@.....]# ls -l gcc*
lrwxrwxrwx 1 root root      7 2012-04-02 13:36 gcc -> gcc-4.5
-rwxr-xr-x 1 root root 237012 2011-04-19 04:22 gcc-4.5
安裝比較舊的版本
[nash@.....]# sudo apt-get install gcc-4.4
[nash@.....]# sudo apt-get install gcc++-4.4
安裝完後進到/usr/bin目錄下,檢查結果
[nash@.....]# ls -l gcc*
lrwxrwxrwx 1 root root      7 2012-04-02 13:36 gcc -> gcc-4.5
-rwxr-xr-x 1 root root 224488 2011-04-01 03:31 gcc-4.4
-rwxr-xr-x 1 root root 237012 2011-04-19 04:22 gcc-4.5
發現gcc鏈接gcc-4.5,需將它改為鏈接到gcc-4.4,方法如下:
[nash@.....]# $sudo mv gcc gcc.bak 
[nash@.....]# $sudo ln -s gcc-4.4 gcc
同理發現gcc++鏈接gcc++-4.5,需將它改為鏈接到gcc++-4.4,方法如下:
[nash@.....]# ls -l g++*
lrwxrwxrwx 1 root root      7 2012-04-02 13:36 g++ -> g++-4.5
-rwxr-xr-x 1 root root 228520 2011-04-01 03:29 g++-4.4
-rwxr-xr-x 1 root root 236948 2011-04-19 04:18 g++-4.5
[nash@.....]# $sudo mv g++ g++.bak  
[nash@.....]# $sudo ln -s g++-4.4 g++
在查看gcc和g++版本:
[nash@.....]# ls -l gcc*
lrwxrwxrwx 1 root root      7 2012-04-03 20:18 gcc -> gcc-4.4
-rwxr-xr-x 1 root root 224488 2011-04-01 03:31 gcc-4.4
-rwxr-xr-x 1 root root 237012 2011-04-19 04:22 gcc-4.5
lrwxrwxrwx 1 root root      7 2012-04-02 13:36 gcc.bak -> gcc-4.5
[nash@.....]# ls -l g++*
lrwxrwxrwx 1 root root      7 2012-04-03 20:18 g++ -> g++-4.4
-rwxr-xr-x 1 root root 228520 2011-04-01 03:29 g++-4.4
-rwxr-xr-x 1 root root 236948 2011-04-19 04:18 g++-4.5
lrwxrwxrwx 1 root root      7 2012-04-02 13:36 g++.bak -> g++-4.5
均顯示gcc version 4.4.5 ,說明gcc 4.4安裝成功。
======================================================================
2:下載android source code
2.1.Installing Repo
Repo 是 Google 為 Android source tree 的管理而寫的一個 script工具,以方便處理 Android 源碼包含的上百個 git repositories,可以更容易地使用Git,更多關於 Repo 的資訊,請參考 Version Control
請按照下列步驟:
2.1.1請確保在你的主目錄有一個 bin /目錄,並且它有設定在path路徑:
注意在安裝JDK時已經宣告PATH所以可能會讓repo失敗
[nash@.....]# mkdir ~/bin #在home/nash/下建立一個bin的資料夾
[nash@.....]# PATH=~/bin:$PATH
2.1.2下載 Repo script 並確保它是可執行文件:
[nash@.....]# curl https://android.git.kernel.org/repo > ~/bin/repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                                         Dload  Upload   Total    Spent    Left    Speed
  0 19933    0     0    0     0      0      0 --:--:-- --:--:-- --:--:100 19933  100 19933    0     0  22306      0 --:--:-- --:--:-- --:--:100 19933  100 19933    0     0  22302      0 --:--:-- --:--:-- --:--:--  117k
[nash@.....]# chmod a+x ~/bin/repo
2.2.Initializing a Repo client
安裝完成Repo後, 設置用戶端存取 android 原始碼庫:
2.2.1 建一個空目錄來保存你的文件:
[nash@.....]# mkdir Android
[nash@.....]# cd Android
2.2.2 執行 repo init 去獲取最新最新版本的Repo 與 所有最新的修正檔。 您必須指定manifest的URL, 指出包含在 Android source的各種資源庫 將被放置在您的目錄。
[nash@.....]# repo init -u https://android.googlesource.com/platform/manifest
Your Name  [nash.lin]: nash.lin
Your Email [nash.lin@mantis-1.(none)]: xxxxx@gmail.com
Your identity is: nash.lin 
is this correct [y/N]? y
Testing colorized output (for 'repo diff', 'repo status'):
  black    red      green    yellow   blue     magenta   cyan     white
  bold     dim      ul       reverse
Enable color display in this user account (y/N)? y
repo initialized in /home/nash.lin/Android
2.2.3 要開 branch 分支, 加上參數 -b:
[nash@.....]# repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
2.3 Getting the files
[nash@.....]#repo sync
如果斷線就在重複上面指令即可
下載完成後修改權限
[nash@.....]# chmod -R 777 <PATH android source code>
======================================================================
3 編譯android source code
[nash@.....]# cd Android
3.1 envsetup.sh腳本初始化環境
[nash@.....]# source build/envsetup.sh
including device/moto/wingray/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
3.2 選擇target
[nash@.....]# lunch
You're building on Linux
Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_wingray-userdebug
     5. full_crespo-userdebug
     6. full_maguro-userdebug
     7. full_panda-userdebug

Which would you like? [full-eng] 1 
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=4.0.4.0.4.0.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-2.6.38-8-generic-x86_64-with-Ubuntu-11.04-natty
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
OUT_DIR=out
============================================
3.4 開始編譯android source code
[nash@.....]# make
編譯完成後會在source code資料夾內會產生一個out資料夾,在/out/target/product/generic目錄下產生出一些*.img檔,例如 system.img / userdata.img /ramdisk.img等
======================================================================
4. 編譯kernel
在下載下來source code資料夾裡面建立kernel資料夾
[nash@.....]# mkdir kernel
4.1 下載kernel source code
[nash@.....]# git clone https://android.googlesource.com/device/ti/panda
Cloning into panda...
remote: Counting objects: 23, done
remote: Counting objects: 515, done
remote: Finding sources: 100% (85/85)
remote: Getting sizes: 100% (40/40)
remote: Compressing objects: 100% (18/18)
Receiving objects: 100% (492/492), 63.74 MiB | 275 KiB/s, done.
remote: Total 492 (delta 219), reused 489 (delta 216)
Resolving deltas: 100% (219/219), done.
[nash@.....]# ls
Panda
[nash@.....]# cd Panda
4.2 查看kernel目前版本資訊
[nash@.....]# git log kernel
commit 793defdaa84b0375d34757db4dfb8fe437bf4340
Author: Jean-Baptiste Queru 
Date:   Fri Feb 24 12:34:52 2012 -0800

    PandaBoard prebuilt kernel
    
    ebb6cb6 Panda: Support data usage statistic collection.
……………………..
4.3 選擇下載的檔案
[nash@.....]# git clone https://android.googlesource.com/kernel/common.git
[nash@.....]# git clone https://android.googlesource.com/kernel/goldfish.git
[nash@.....]# git clone https://android.googlesource.com/kernel/msm.git $ git clone 
[nash@.....]# https://android.googlesource.com/kernel/omap.git $ git clone 
[nash@.....]# https://android.googlesource.com/kernel/samsung.git $ git clone 
[nash@.....]# https://android.googlesource.com/kernel/tegra.git
4.4 選擇一個版本check out
[nash@.....]# cd goldfish/
[nash@.....]# git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/android-goldfish-2.6.29
  remotes/origin/master
[nash@.....]# git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
[nash@.....]# git branch -a
4.5 設定編譯參數
[nash@.....]# gedit Makefile
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\   
#                  $(call ld-option, -Wl$(comma)--build-id,))
LDFLAGS_BUILD_ID =
[nash@.....]# sudo gedit ~/.bashrc
把前面安裝JDK的PATH mark起來在加入以下參數
export  PATH=$PATH:/home/nash/Android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm 
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi- 
[nash@.....]# source ~/.bashrc
4.6 開始編譯kernel
[nash@.....]# make goldfish_defconfig
#
# configuration written to .config
#
[nash@.....]# make
完成後會在/kernel/Panda/goldfish/arch/arm/boot/下產生一個zImage文件
======================================================================
5. 編譯SDK
在android source code目錄下, 下make PRODUCT-sdk-sdk即可
[nash@.....]# make PRODUCT-sdk-sdk
完成後所產生的SDK會存放在/out/host/linux-x86/sdk裡面,會有兩個檔案 1. android-sdk_eng.xxx_linux-x86.zip 2. android-sdk_eng.xxx_linux-x86 P.S : xxx為使用者帳號名稱 android-sdk_eng.xxx_linux-x86就是我們需要的SDK,建議大家備份起來,因為編譯單獨模組時,有可能會清除SDK目錄


參考資料:
http://source.android.com/source/initializing.html
http://www.2cto.com/os/201201/116762.html
http://www.cnblogs.com/dwayne/archive/2011/11/11/2245383.html
http://www.linuxidc.com/Linux/2011-12/49775.htm

2012年4月3日 星期二

[Linux] ubuntu 11.04(32 bit)建立android APP開發環境

環境:
OS: vmware下掛載ubuntu 11.04(32 bit)
======================================================================
Step 1: 確認環境
1.更新ubuntu
[nash@.....]# sudo apt-get update
[nash@.....]# sudo apt-get upgrade
2.確認環境中是否已安裝sun java,如沒有請往下繼續做
[nash@.....]# java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode, sharing)
3.檢查gcc版本,是否為gcc4.4,如果大於or小於gcc4.4請安裝gcc4.4,編譯android source code用可跳過
[nash@.....]# gcc -v
.........
gcc version 4.4 (Ubuntu/Linaro 4.4-8ubuntu4) 
======================================================================
Step 2: 下載以下套件到linux環境中:
一: SUN_JDK_6 -> jdk-6u25-linux-i586.bin
二: SDK ->android-sdk_r17-linux.tgz
三: ECLIPSE ->eclipse-java-indigo-SR2-linux-gtk.tar.gz
四: ADT [Android Development Tools]->ADT-17.0.0.zip
======================================================================
Step 3: 開始安裝
手動安裝流程
1.建立android專用資料夾
2.複製Step 2下載的套件到android專用資料夾裡
3.解壓縮SDK/ECLIPSE到android專用資料夾
4.修改資料夾跟檔案權限
5.安裝SUN JDK
6.啟動eclipse,安裝ADT
7.建立android專案
8.編譯並執行 HelloAndroid
======================================================================
Part 1.建立android資料夾
[nash@.....]# sudo mkdir /home/nash/Android
Part 2.複製下載套件到android專用資料夾
[nash@.....]# cp /home/nash/Downloads/* /home/nash/Android 
Part 3.解壓縮SDK/ECLIPSE到android專用資料夾
[nash@.....]# tar zxvf /home/nash/Android/android-sdk_r17-linux.tgz
[nash@.....]# tar zxvf /home/nash/Android/eclipse-java-indigo-SR2-linux-gtk.tar.gz 
Part 4.修改資料夾跟檔案權限
[nash@.....]# chmod -R 775 /home/nash/Android
Part 5.安裝SUN JDK
一.確認/usr/lib/是否有jvm資料夾,沒有就建立
[nash@.....]# sudo mkdir /usr/lib/jvm
二.安裝"java-common"
[nash@.....]# sudo apt-get install java-common
三.檢查JAVA版本,是否為sun jdk不是open jdk
[nash@.....]# java -version
四.不是sun jdk,請下載SUN_JDK_6 bin file到android資料夾
五.寫一個安裝script簡化手動安裝jdk流程
install_sun_javajdk6.sh
[nash@.....]# vi /home/nash/Android/install_sun_javajdk6.sh
#!/bin/sh
echo 'You need to sudo apt-get install java-common First. Press  if you have already apt-got it...'
read dummy
JAVA_CV="1.6.0_25" #jdk版本如有不同請自行修改
JAVA_DIR="java-6-sun"
sudo chmod +x jdk-6u25-linux-i586.bin #jdk版本如有不同請自行修改
sudo chmod +x jdk_config.sh
./jdk-6u25-linux-i586.bin #jdk版本如有不同請自行修改
sudo mv jdk$JAVA_CV /usr/lib/jvm/$JAVA_DIR-$JAVA_CV
sudo ln -s /usr/lib/jvm/$JAVA_DIR-$JAVA_CV /usr/lib/jvm/$JAVA_DIR #建立java連結
sudo ./jdk_config.sh $JAVA_DIR
sudo update-java-alternatives -s java-6-sun #設定OS所使用的java版本
echo "------- DONE -------"
echo "Your Java Home is: $JAVA_HOME, JAVA Version: "
java -version #檢查OS使用的java版本
read dummy
jdk_config.sh
[nash@.....]# vi /home/nash/Android/jdkconfig.sh
#!/usr/bin/env bash
# ----------------------------------------------------------------------
# Description
# Setup a Sun Java 6 JDK with the alternatives system.
#
# Usage
# To setup the alternatives system:
# $ sudo ./configure-java-6.sh
#
# To set the configured JDK as the system default one, you can then run:
# $ sudo update-java-alternatives -s java-6-sun
#
# Prerequisites
# /usr/lib/jvm/java-6-sun must point to the JDK to setup.
#
# ----------------------------------------------------------------------


# ----------------------------------------------------------------------
# Constants
# ----------------------------------------------------------------------

#JDK_ALIAS=java-6-sun
JDK_ALIAS=$1 # Set it from command prompt
JDK_DIRECTORY=/usr/lib/jvm/$JDK_ALIAS
JDK_ALTERNATIVE_PRORITY=1
JINFO_FILE=/usr/lib/jvm/.$JDK_ALIAS.jinfo


# ----------------------------------------------------------------------
# Functions
# ----------------------------------------------------------------------

# Check the execution rights.
check_rights()
{
  if [[ $USER != 'root' ]]; then
echo "Error: You must run this script as root."
    exit 1
  fi
}

# Check that $JDK_DIRECTORY contains a Sun Java JDK 6.
check_jdk()
{
  if [[ ! -e $JDK_DIRECTORY ]] && [[ ! -e $JDK_DIRECTORY/jre/bin/java ]] && [[ ! -e $JDK_DIRECTORY/bin/java ]] ; then
echo "Error: '$JDK_DIRECTORY' must point to a valid Sun Java 6 JDK home."
    exit 1
  fi
}

# Register the JRE executable.
setup_jre_alternative()
{
  update-alternatives --verbose --install /usr/bin/$1 $1 $JDK_DIRECTORY/jre/bin/$1 $JDK_ALTERNATIVE_PRORITY
  echo "jre $1 $JDK_DIRECTORY/jre/bin/$1" >> $JINFO_FILE
}

# Register the JDK executable.
setup_jdk_alternative()
{
  update-alternatives --verbose --install /usr/bin/$1 $1 $JDK_DIRECTORY/bin/$1 $JDK_ALTERNATIVE_PRORITY
  echo "jdk $1 $JDK_DIRECTORY/bin/$1" >> $JINFO_FILE
}

# Start the .jinfo file.
generate_jinfo_header()
{
  echo "name=$JDK_ALIAS" > $JINFO_FILE
  echo "alias=$JDK_ALIAS" >> $JINFO_FILE
  echo "priority=$JDK_ALTERNATIVE_PRORITY" >> $JINFO_FILE
  echo "section=non-free" >> $JINFO_FILE
}


# ----------------------------------------------------------------------
# Main
# ----------------------------------------------------------------------

# Check execution rights.
check_rights

# Check that there is a JDK at the right place.
check_jdk

# Generate a .jinfo file for the update-java-alternatives command.
generate_jinfo_header

# Register the executables with the alternatives system.
setup_jre_alternative java
setup_jre_alternative keytool
#setup_jre_alternative kinit
#setup_jre_alternative klist
#setup_jre_alternative ktab
setup_jre_alternative orbd
setup_jre_alternative pack200
setup_jre_alternative policytool
setup_jre_alternative rmid
setup_jre_alternative rmiregistry
setup_jre_alternative servertool
setup_jre_alternative tnameserv
setup_jre_alternative unpack200
setup_jdk_alternative appletviewer
setup_jdk_alternative apt
setup_jdk_alternative extcheck
setup_jdk_alternative idlj
setup_jdk_alternative jar
setup_jdk_alternative jarsigner
setup_jdk_alternative javac
setup_jdk_alternative javadoc
setup_jdk_alternative javah
setup_jdk_alternative javap
setup_jdk_alternative jconsole
setup_jdk_alternative jdb
setup_jdk_alternative jinfo
setup_jdk_alternative jmap
setup_jdk_alternative jps
setup_jdk_alternative jsadebugd
setup_jdk_alternative jstack
setup_jdk_alternative jstat
setup_jdk_alternative jstatd
setup_jdk_alternative native2ascii
setup_jdk_alternative rmic
setup_jdk_alternative serialver

# Log a message about the jinfo file.
echo "The file '$JINFO_FILE' containing metadatas used by the 'update-java-alternatives' command has been generated."
六.修改install_sun_javajdk6.sh &jdk_config.sh檔案權限
[nash@.....]# chmod -R 775 /home/nash/Android/
七.執行install_sun_javajdk6.sh
[nash@.....]# sudo ./install_sun_javajdk6.sh
八.檢查安裝結果
[nash@.....]# java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode, sharing) 
Part 6.啟動eclipse,安裝ADT
一.進入/home/nash/Android/eclipse資料夾,執行eclipse
[nash@.....]# ./home/nash/Andriod/eclipse/eclipse
二.若是初次開啟,請關掉 Welcome 畫面初次開啟 eclipse 的時候,會有歡迎畫面 Welcome。直接在 Welcome旁,按X 把它關掉即可
三.安裝ADT,可分兩種方式1.網路安裝,2.手動下載安裝
1.網路安裝:
執行 Eclipse 後,Main Menu -> Help -> Install New Software … 開啟畫面[如圖p1],在彈出視窗的 Add 按鍵,打入名稱以及在 Location中輸入"https://dl-ssl.google.com/android/eclipse/",並且在Name 輸入AndroidDeveloperPlugin-Tools (其實 Name 隨你怎麼打都行)[如圖p2],接著會開始抓取套件,抓到後會秀在中間的視窗中,如圖p3,選取你要的套件,然後按Next進入安裝,安裝完成後會問你是否要restart,restart後環境就設定完成,接下來就可以開始建立android專案
p1


p2
p3


2.選擇手動安裝ADT
a.執行 Eclipse 後,Main Menu -> Help -> Install New Software … 開啟畫面,在彈出視窗的 Add 按鍵 , 打入名稱以及在 Location中選擇ADT-17.0.0.zip放置的資料夾,安裝好之後他會問你要不要重新啟動,選 Restart,重新啟動後要你選擇SDK是否要安裝選YES就是網路安裝選下面就是手動安裝SDK
b.如果想修改SDK的路徑,在eclipse 之中設定 android sdk path ,Main Menu -> Windows -> Preference -> Android選取”SDK Location”這邊要設定 Android SDK的路徑,即可
Part 7.建立android專案
一.我們需要開啟的Perspective 不是 Java EE 而是 Java,Main Menu -> Windows -> Open Perspective -> Other,選擇 Java 按 OK
二.在Java Perspective 中新增 Android 專案,Main Menu -> File -> New -> Other -> Android Project
p4
p5


三.設定
Project name 設 HelloAndroid
Contents 設 Create new project in workspace


Build Target 設 Android 4.0,按Next
p7


Properties.Application name 設 HelloAndroid
Package name 設 Milosamples.HelloAndroid
Create Activity 打鉤並設 HelloAndroidActivity,按Finish
p8


四.設定完成後按下 Finish 按鈕便可完成一個Hello World的 Android sample
p9
Part 8.編譯並執行 HelloAndroid
一.建立編譯執行的 configuration, Main Menu -> Run -> Run configurations …
p10
二.請 double-click Android Application ,會產生 New_configuration
p11
設定 Name 為 AdnroidAppConig_1
Project為 HelloAndroid
三.Target選automatic,設定完成後apply,and close
p12
四.設定AVD Manager, Main Menu -> Window -> AVD Manager
p13
NEW一個virtual device
Name : AVD4[隨便取都行]
Target : 選android 4.0
SD Card:沒用到可以不用填
Skin : 畫面大小
Hardware : 選取開發HW條件
p14
五.完成後執行,Main Menu -> Run
p15
六.開機完成
p16
參考資料:
http://milochen.wordpress.com/2010/05/22/newbie-tutorial-to-create-android-app-developer-environment-on-ubuntu-10-04-9-10-64bits/