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/

2012年4月2日 星期一

[Linux] JDK,JRE and open jdk,sun jdk差別

JDK跟JRE的差別:
JDK和SDK其實我們通常指的都是同一個東西, 而JDK與JRE的差別是,JDK可以拿來編譯,你所寫的Java程式, 如果你想要學Java, 就請裝JDK.如果只是要執行Java的程式, 你只要裝JRE就可以了. (JRE是JDK的子集)

JDK版本介紹:
JDK(Java Development Kit)就是Java的開發工具包,是給Java開發者使用,所以以照自己的需求來安裝套件。
Java SE=Java Standard Edition (主要用於桌面程序,控制台開發)
Java EE=Java Enterprise Edition (企業級開發)
Java ME=Java Mobile Edition (嵌入式開發)

在大多數的Linux發行版裡面,幾乎都會內建OpenJDK這套JDK.
什麼是OpenJDK?
這裡就簡述一下其歷史:
OpenJDK簡單來說就是JDK7的開放原始碼版本。
你可以從 http://openjdk.java.net/projects/jdk6/ 很清楚的看到,自從JDK7 b10以後,就產生了一個新計畫 OpenJDK ,它是一個開放原始碼計畫,以 GPL釋出。OpenJDK已經成為了JDK7的主幹開發,而Sun JDK7則是基於OpenJDK7的原始碼所發布的,其大部分原始碼都相同,只有少部份原始碼被取代掉,使用JRL(非自由軟體的開放原始碼)釋出。

那麼OpenJDK6呢?很多人都認為它就是JDK6的分支,那你就錯了,實際上JDK6還是屬於JRL釋出,且與OpenJDK6有很大的差異,OpenJDK6僅是一個OpenJDK7的分支,並且去除Java SE 7的特性,盡量使其符合Java SE 6。

以下說明Sun JDK(以後可能要叫做Oracle JDK)與OpenJDK的不同:

釋出授權條款的不同:
OpenJDK 採用GPLv2 釋出而 Sun JDK則採用 JRL釋出。兩者協議雖然都是開放原始碼的,但在使用上卻有很大的不同,其中最大的便是,GPLv2允許在商業上面使用,而JRL僅允許個人研究使用。OpenJDK並不包含Deployment(部署)功能:部署的功能包含:Browser Plugin、Java Web Start、以及Java控制面板。這些功能在OpenJDK中找不到。然而Icedtea計畫自行開發了一個Plugin與整合了 netx 這個 Java Web Start 計畫,使得OpenJDK也可以體會到部份部署的功能。

原始碼尚未完整:
OpenJDK大致上與Sun JDK原始碼相符合,然而部份原始碼因為產權問題無法開放給 OpenJDK使用,其中最主要的部份就是JMX中的可選元件SNMP部份的程式碼。因此這些不能開放的原始碼將它作成plug,以供OpenJDK編譯時使用,你也可以選擇不要使用plug。而Icedtea則為這些不完整的部份開發了相同功能的程式碼(僅有OpenJDK6),促使OpenJDK更加完整。

部份程式碼以開放原始碼專案替代:
OpenJDK由於產權問題,剝離了很多產權非Sun的程式碼。為了補足這些程式碼,因此使用了許多功能一樣的開放原始碼專案。最明顯的例子就是:字體柵格化引擎,使用FreeType替代。

只包含最精簡的JDK:
OpenJDK不包含其他軟體包,如:Rhino、Java DB(Apache Derby)、JAXP(僅提供原始碼下載網址)...... 且可以分離的軟體包也盡量的分離。然而這些計畫大多數也是自由軟體,你可以自行下載並且加入。在Icedtea裡面,也重新加入了這些軟體包,因此你使用Icedtea編譯OpenJDK時,它可能會要求你安裝或指定Rhino位置。

不能使用Java商標:
由於OpenJDK並不完整,因此不是標準的Java,也就無法使用Java商標。但是Icedtea則致力於補完OpenJDK的不完整,至今已經大致上補完了,也可通過JCK認證,因此若使用Icedtea補丁的OpenJDK,你輸入 "java -version" 就可以看到最前面顯示的是 "Java" 而不是 "OpenJDK" 。基本上,在 Sun Java 體系中,Java SE 這部份開放原始碼還不夠徹底,而 JavaFX 則是僅開放 Compiler 的原始碼(註解1),其中的理由部份是產權問題。此外,也希望Oracle能讓JCP更自由一點,讓廠商們有公平發表機會,並且開放其JCK與TCKs工具。一旦開放之後,相信Java發展將會更加迅速,每個人都有提供意見的管道,並使Java能夠更普及,甚至在動態網頁上,Java Applet能夠重回原本被 Flash取代的地位。

註解1:你會發現你沒有安裝JavaFX,卻可以執行JavaFX的程式。實際上你正要執行JavaFX程式時,網頁會提供一個JavaFX的下載地點,一旦你瀏覽到含有JavaFX的網站,就會自動去JavaFX官方網站下載JavaFX執行環境來執行。

2012年3月21日 星期三

[Linux] 強制設定x window解析度

OS: ubuntu 11.04版
HW: disktop VIA VX900 內建顯卡
在x window裡因為讀不到顯示器的EDID,所以需要強制設定輸出解析度
How change display resolution settings using xrandr
1.查詢預設定解析度的內容
nash@ubuntu:/$ cvt 1920 1080 57
# 1920x768 56.9 Hz (CVT) hsync: 63.67 kHz; pclk: 163.0 MHz
Modeline "1920x1080_57.00" 163.00 1920 2042 2240 2560 1080 1083 1088 1119 -hsync +vsync
2.加入新的解析度到linux中
nash@ubuntu:/$ xrandr --newmode "1920x1080_57.00" 163.00 1920 2042 2240 2560 1080 1083 1088 1119 -hsync +vsync
3.查詢顯示器名稱
nash@ubuntu:/$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1080, maxumum 4096 x 4096
VGA-1 connected 1920x1080+0+0(normal left inverted right x axis y axis)0mm x 0mm
1360x768 59.8
1024x768 60 * #表示目前使用中的解析度
800x600  60.3    56.2
848x480  60
640x480  59.6    59.9
4.加入預設定解析度到linux中
nash@ubuntu:/$ xrandr --addmode VGA-1 1920x1080_57.00
5.查詢解析度是否加入
nash@ubuntu:/$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1080, maxumum 4096 x 4096
VGA-1 connected 1920x1080+0+0(normal left inverted right x axis y axis)0mm x 0mm
1360x768 59.8
1024x768 60 * #表示目前使用中的解析度
800x600  60.3    56.2
848x480  60
640x480  59.6    59.9
1920x1080_57.00  57.0 #新增的解析度
6.輸出
建議用x window裡面system->Preferences->Monitors去設定新增的解析度,因為如果新增解析度不支援他在30秒後會回復到原本的設定解析度,不會一直卡在黑畫面,然後要重開機進到single去修改
如果有支援可用command line設定輸出

nash@ubuntu:/$ xrandr --output VGA-1 --mode 1920x1080_57.00 #此時畫面解析度就會變化了
7.以上設定均為暫時性所以需要寫到開機時執行以求每次開機都會設定此解析度
nash@ubuntu:/$ gksudo gedit /etc/gdm/Init/Default
..........
..........
PATH=/usr/bin:$PAT  #找到此兩行把指令加入到他下面即可
OLD_IFS=$IFS
xrandr --newmode "1920x1080_57.00" 163.00 1920 2042 2240 2560 1080 1083 1088 1119 -hsync +vsync
xrandr --addmode VGA-1 1920x1080_57.00
xrandr --output VGA-1 --mode 1920x1080_57.00
8.重新開機檢查是否成功

參考資料:
http://www.ubuntugeek.com/how-change-display-resolution-settings-using-xrandr.html
http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=34432&forum=3&post_id=159036#forumpost159036
https://wiki.ubuntu.com/X/Config/Resolution
http://shanereustle.com/blog/force-screen-resolutions-on-ubuntu.html