2009年5月30日 星期六

window環境下載Android source code

今天寫程式的時候突然想看一下Android的原始碼長怎樣
因為在寫ListActivity類別的時候對他的架構很好奇,但是SDK裡面的android.jar並沒有.java檔,所以找了一下windows下載原始碼的方法

首先要有下載工具,請到下列網址下載git,c


http://code.google.com/p/msysgit/downloads/list
直接下載(可能因為版本更新而失效)
Git-1.6.3-preview20090507-2.exe


之後到Android source網站
http://android.git.kernel.org/
裡面有Linux直接下載的方法,window要下載必須用上面的工具
上面的工具下載下來安裝後,執行Git Bash



之後會出現類似cmd的畫面,要下載source code,就輸入

git clone git://android.git.kernel.org/ + project path.


project path參照http://android.git.kernel.org/
請照自己的需要下載,整個Android原始碼2G多
舉個例子,我只想看android開發的相關類別像是TextView等等
我就只須要下載platform/frameworks/base.git,Android的framework都放在這
輸入

git clone git://android.git.kernel.org/platform/frameworks/base.git

就會開始下載了,之後就可以遨遊Android的世界

2009年5月29日 星期五

Log配合logcat

在Android除錯最常用的方式就是開Logcat來觀看,他可以取代JRE的Console來幫忙偵錯
不然每次程式錯誤都要寫個AlertDialog也是個麻煩
LogCat叫出方法,Window -> Show View -> Other,找Android -> LogCat

而在Android有個Log類別可以跟Logcat配合,他可以幫忙除錯,有點像以前我們寫C/C++用土法煉鋼printf來看資訊一樣

Log基本用法

Log.類型(標籤名子,訊息)

Log的類型大概分以下幾類
  1. Log.v(TAG,Message) :Verbose 記錄詳細訊息
  2. Log.d(TAG,Message) :Debug 除錯
  3. Log.i(TAG,Message) :INFO 資訊
  4. Log.w(TAG,Message):Warning 警告
  5. Log.e(TAG,Message) : Error 錯誤

------------
其中TAG是可以幫助我們篩選訊息,因為一般logcat會擷取一大堆訊息,包括GC做了什麼
自定Tag可以幫我們下Filter

LogCat雜七雜八訊息

而我加入了自己的訊息,假設我想記錄開啟程式成功與否

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);
Log.i("Create Android", "Test");
findVuew();
setClick();


}

而我想過濾那些雜七雜八的訊息,可以從右上的綠色加號增加filter

之後會跳出設定視窗

裡面幾個必要參數
  1. Filter Name:過濾名稱 可以隨自己喜好取
  2. by Log Tag:想留下的Tag名稱,在此設我剛剛取的Create Android
  3. by Log level :這選項是可選的,可以過濾Log的類型,在此我選none


而接下來,就只會剩下我想看到的訊息

Android一些資源站

在開發程式的時候總是希望自己的程式美美的
尤其是在講就豐富使用者介面的現在,更是須要美化程式界面的方法
從書上看到的一些資源站,主要是各種免費且漂亮的界面圖片、icon等等

Tango
http://tango.freedesktop.org/Tango_Icon_Library#Download

Nuvola
http://www.icon-king.com/projects/nuvola/

openclipart
http://openclipart.org/media/view/media/developer

使用findViewById傳回Null及Android重構

今天在寫Android的時候,使用findViewById尋找layout上的物件
原本好好的,但是想不到重構後變成不會跑了,後來用logcat看了一下
原來是findViewById回傳了null的物件,結果丟出NullPointerException
重構前程式

private EditText _width;
private EditText _height;
...
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_width=(EditText)findViewById(R.id.width_text);
_height=(EditText)findViewById(R.id.height_text);
}

重構後程式

private EditText _width;
private EditText _height;
...
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
findView();
setContentView(R.layout.main);

}
private void findView(){
_width=(EditText)findViewById(R.id.width_text);
_height=(EditText)findViewById(R.id.height_text);
}

------------
原來是我把findViewById的動作移到了 setContentView(R.layout.main);之前
在Android如果在使用setContentView把顯示元件創造出來之前
findViewById是找不到任何東西的,所以必須把findViewById的動作放到setContentView之後


這邊順便介紹一下,在Android裡有提供一個好用的重構工具:Extract Android String
在Android通常會把常數字串放到string.xml裡面存取,而當我們寫程式的時候通常很懶的再把東西寫到另外一個檔案裡面,這個工具可以簡單替我們辦到
而這項重構工具在Refactor->Android->Extract Android String




順便筆記一下,如果想存取string.xml,也就是R.string之下的東西,必須配合getText函式

_result.setText(getText(R.string.data);

2009年5月26日 星期二

Android 1.5 使用JUnit測試框架

對於一些習慣TDD開發方式的人來說
沒用JUnit好像少了什麼似的,就順便研究了一下在Android下如何使用JUnit
----------------
在Android裡面基本上有兩個方案

傳統JUnit


有需要的話可以到http://www.junit.org/ 下載
因為Android用的不是JDK在跑程式,而是用他自己的虛擬機器
所以在eclipse必須修改一下JUnit的執行環境才能跑,而且也只能跑一些java的邏輯測試或業務封裝,對於Andorid的測試不能用一般的JUnit去跑,這個可以用第二個方案解決

先介紹第一種一般JUnit的使用法,把junit-4.6.jar(版本可能有異)下載下來後
先在eclipse的 project->properties 跳出設定視窗後選擇Java Build Path->Libraries
選擇Add External JARs,把剛才下載的junit-4.6.jar加入eclipse
這個方法可用於想加入任何第三方API時使用


之後File->New->JUnit Test Case新增一個TestCase
假設程式碼如下

public class TestActor extends TestCase{

public TestActor(String name){
super(name);
}
public void testAction(){
assertEquals(true, true);//請修改為自己的測試程式
}

}

----
之後開啟Run Configutrations(不知道請參照使用eclipse開發Andrio 1.5)

開啟視窗後請先依序幾個步驟
  1. 先在左邊的JUnit那欄點兩下,會出現右邊這種設定卡,先選Test這個Tag
  2. 再來取個喜歡的名子
  3. 這個步驟比較重要,選定要執行的測試類別
  4. 選定Junit版本
  5. 點選Apply
再來跳到Classpath這個Tag,一開始會看到Bootstrap Entries是Android 1.5(版本可能有異)

請點選Android 1.5 後按下 Advanced 將他改成JRE



他會先跳出一個Advanced Options的選單,選則Add Classpath Variables後按下OK




他會又跳出一個選單,選擇你的JRE環境後按下OK,在此我的是JRE_LIB


最後在Bootstrap Entries上就會出現JRE的環境,這邊要注意一下User Entries有沒有Junit
沒有的話用Add External JARs將他加進來,之後按下Apply




之後再要測試的Testcast calss上按右鍵 Run As->JUnit Test就可以跑了


如果出現詢問視窗的話,先在Override workspace setting上打勾
而後選擇Eclipse JUnit Launcher按下OK就行了



注意一下Run的選單


這是1.5後才出現的,以後或許會再改也不一定,畢竟Android現在比起J2ME等仍然是不夠完善

Android JUnit Test


這是第二個方案,專門給Android專案作測試用的,Android的APIDemo裡面就有很詳盡的用法
註:1.5版後的ApiDemo範例改放到
android-sdk-windows-1.5_r1\platforms\android-1.5\samples目錄底下


-----
Android JUnit Test用法一樣是到Run Configutrations下產生一個新的JUnit的Config出來
不同的是程式寫法
首先一定要有繼承Activity的類別

public class Game extends Activity {
.....
}

然後寫測試程式,他必須繼承ActivityInstrumentationTestCase,而且泛型樣版必須放進一個繼承 Activity的類別

public class Test extends ActivityInstrumentationTestCase<Game> {
public Test(){
super("com.android.ut", Game.class);
}

public void testRun()
{
assertEquals(true, true);
}
}


這裡有一點要注意
super("com.android.ut", Game.class);
super第一個參數一定要是你專案的package名稱,不然跑出來結果會錯誤,在此我是隨便舉的例


之後我產生一個JUnit的Config,用預設的就好
再來最重要的是修改AndroidManifest.xml設定檔

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.cusano.star"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Game"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="org.cusano.star"
android:label="Tests "/>

<uses-sdk android:minSdkVersion="3" />
</manifest>


-----------
用顏色標住起來的地方就是我們要加進去的東西
<uses-library android:name="android.test.runner" />

是跟Android說要引進這個lib,不然Android不知道
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="org.cusano.star"
android:label="Tests "/>



有三個屬性,第一個屬性是固定的,targetPackage屬性要填專案當初設定的package名稱
label屬性則是在Android會看到的標籤


再來就可以選擇第一個Android JUnit Test去Run了

在此之前,可以叫出Logcat去觀察他的結果,Logcat是Android很好用的工具,可以幫忙觀察很多錯誤,叫出方法,Window -> Show View -> Other,找Android -> LogCat


在跑Android JUnit Test他會去叫出模擬器(avd記得先設定好),之後可以去Dev Tools下的Instrumentation,找到我們的測試程式,名子是AndroidManifest.xml當初設定label屬性,也就是Tests







按下去後就可以在Eclipse或是Logcat上面看結果

2009年5月25日 星期一

自由軟體說明文件的授權選擇

OSSF 127電子報上的一篇文章,個人覺得還不錯就轉過來了

原文出處:自由軟體說明文件的授權選擇


零、前言

我們在寫程式的過程中,起初學習階段所寫的程式往往是練習的作品或是單純寫給自己使用的,接著愈寫愈熟練之後,我們開始會把自己寫的程式分享給同 學、朋友,讓他人試試有什麼問題,一方面知道使用者還需要怎樣的功能,二方面也能使除錯的工作能做的更澈底;甚至可能後來這個程式非常叫好,大家都很有意 願下載使用以及共同開發,這時就面臨到撰寫說明文件的大工程了!這時,如果我們撰寫的說明文件是搭配自由軟體一併散佈,則文件本身的著作權也必須要經過授 權,才能讓使用者在重製改作時不會產生擔心侵權的後顧之憂。只是文件的授權也是 GPL 嗎?還是另有專屬於文件的授權條款呢?本文的目的就是要對這個問題做一個簡單的說明。我們在自由軟體說明文件的授權方式選擇有二類:GNU Free Documentation License(GFDL)及 Creative Commons(創用 CC)。

一、自由軟體說明文件不得直接套用自由軟體授權條款

從各個自由軟體授權條款文字上來看,其所規範的權利義務關係、所授權的範圍,都是以程式碼(程式著作)作為對象,而不及於程式碼以外的部分。之所以 要用自由軟體授權條款來授權程式,是為了要跳脫現行著作權法的原則性規定,即:著作權人一旦完成其作品,就享有完整的著作權;在沒有任何聲明及授權的情況 之下,他人若重製、散佈該作品,就會造成侵權的可能性。因為自由軟體授權條款只就程式著作的部分授權,該文件若非屬程式的一部分,則不在該自由軟體授權條 款所授權的範圍內;若該文件檔已整合於程式中,該文字的程式碼雖會一併以其自由軟體授權條款進行授權,惟就文件的特性、本質而言亦不適合以自由軟體授權條 款做為自由文件的授權。

因為,就多數自由軟體授權條款要求修改者必須在某些情況下提供其原始碼的規定以觀,此與文件的性質有所扞格。之所以要求修改者提供原始碼,原因在 於,單單取得程式目的碼實在難以研究、修改;反觀文件中的文字說明,我們則不在意是否為原始碼,就好比一本書,我們在乎的是文字的本身,而不在於這本書是 用哪種印刷的技術、排版所用的方法,甚至是實體書本還是電子檔。既然在乎的是文本,則後手取得文字即足,並無要求前手提供該文字的原始碼之必要,自不必以 GPL 等自由軟體授權條款來授權這份自由軟體說明文件。

所以我們可知,自由軟體說明文件不應採用專屬程式碼的自由軟體授權條款(諸如 GPL 等),而應該採用專屬說明文件、手冊的 GFDL 或是更有彈性的創用 CC 來進行授權,以釐清公眾利用此著作的權利義務關係。

GFDL 是自由軟體界教父 Richard M. Stallman 主筆,由自由軟體基金會(Free Software Foundation)於 2000 年時所提出。其目的在於:使採用 GFDL 授權的使用手冊、教科書以及功能性、實用性的文件能夠自由地被公眾重製、修改以及再散佈,不論是否以非商業性的方法為之。不過當然任何其他文件皆得以此條 款授權,並不限這裡列舉的例子。

GFDL 重點在於其 Copyleft 的授權拘束性,要求後手必須繼續使用 GFDL 向後授權,才能使自由文件永遠保持其可自由重製、修改及再散佈的特性。這是搭配 GPL 特色的相應規定。

GFDL 在格式上有一些規定,例如一份文件當中,必須要加 入 GFDL 附錄中規定的聲明文字,以及文本內容中關於「次要章節(Secondary Section)」、「恆常章節(Invariant Sections)」及「封面文字(Cover Texts)」等相關規定;另外,GFDL 也要求該文本檔案格式要是透明(Transparent)的格式,才能讓收受者可以自由閱讀。本文篇幅有限,詳情在此不贅。(註一)

目前 GFDL 最新版本是 2008 年 11 月發佈的 1.3 版,與舊版本的差異在於:新增第 11 段「再授權(Relicensing)」的部分,使之就「大規模多人創作站台」(Massive Multiauthor Collaboration Site, MMC Site)在原先採行 GFDL 的情況下,得與 Creative Commons BY-SA 3.0創用CC 姓名標示-相同方式分享 3.0 )相容(註二)。如果我們的說明文件是多位作者一同在 wiki 之類的平台共同撰寫編輯,依 GFDL v1.3 的規定得與 CC-BY-SA 3.0 相容(註三);亦即,採行 GFDL & CC-BY-SA 的雙重授權則是因為 Wikipedia 要將 GFDL 與 CC 相容時所提出的解決方式。據筆者觀察,開發者較少以 MMC Site 共同撰寫其說明文件,故本文並未將此種授權方式列為一般的文件授權選項之一。本段僅為補充性說明,在此無意就 Wikipedia 之授權移轉/整合事件為更深入的討論。

三、Creative Commons(創用 CC)

創用 CC 由法律學家 Lawrence Lessig 提出,並於 2001 年成立「Creative Commons」非營利組織管理創用 CC 條款。由於各個國家的文化背景及著作權法有所不同,為推動創用 CC 至全世界每個司法管轄領域內,創用 CC 進行了本土化的運動,以我國為例,目前的版本為:「創用 CC 2.5 台灣」。

創用 CC 的運用目的在於保護自由的文化,希望透過創用 CC 授權使著作的授權方式更為清楚,使利用人可以放心使用,故理論上所有著作權法上所認定的著作,包括文字、圖片、聲音、影像等等,皆得適用創用 CC 條款,較 GFDL 所涵蓋的範圍更多。與自由軟體授權條款及 GFDL 相較,創用 CC 條款並沒有嚴格的授權拘束性規定,意即,後來利用原以 CC 授權的作品新創或改作時,除非有採 SA(Shard Alike,相同方式分享)授權要素的條款,後手不必以相同創用 CC 條款來授權該衍生作品。故就此點較 GFDL 更有彈性。

關於創用 CC 的授權有很多種,是以四項授權要素(Elements)排列組合成數個選擇,這四項要素是:姓名標示(Attribution, BY)、非商業性(Noncommercial, NC)、相同方式分享(Share Alike, SA)與禁止改作(No Derivative Works, ND)。其中,NC 與 ND 是 GFDL 所無的規範,因為 GFDL 並不反對商業利用,且 ND 更不符四大自由的精神。BY 是為了保存出處及原作者的聲譽與文責,SA 則包含 Copyleft 的精神,其精神與 GFDL 相容(註四);不過,其舊版條款法律文字使得二者間無法雙邊相容,這也就是為什麼後來新版的 GFDL v1.3 與 CC-BY-SA 3.0 刻意修改為相容的原因了。

在此羅列上述四種授權要素所組成之創用 CC 的六份授權條款:

姓名標示(BY);

姓名標示-非商業性(BY-NC);

姓名標示-禁止改作(BY-ND);

姓名標示-相同方式分享(BY-SA);

姓名標示-非商業性-相同方式分享(BY-NC-SA);

姓名標示-非商業性-禁止改作(BY-NC-ND)。(以下提及創用 CC 相關條款時,統一以英文縮寫表示為主。)

選擇 GFDL 與創用 CC 的差別在於,GFDL 起初就是專門為了程式手冊或說明文件設計的,所以有特定的格式及相關規定可供開發者依循;而因創用 CC 不是專為此設計,所以沒有要求固定的章節格式,僅要求加註創用 CC 標章及相關文字即足。再加上,創用 CC 有六種條款供選擇,所以整體來說創用 CC 較 GFDL 來的有彈性。

四、寫完程式說明書的你,該怎麼選擇這份文件的條款

如果你希望你的文件也可以具有 Copyleft 的特性,使得未來後手在修改散佈時也必須依照相同的方式來分享,這時你可以選擇 GFDL 或是 CC-BY-SA 的其中一種來授權,因為它們都是 Copyleft 授權條款(同註四)。

如果你覺得選擇 GFDL 或是 CC-BY-SA 的其中一種都可以,但並不希望被其他人拿去做商業行為,則可選擇 CC-BY-NC-SA。因為 GFDL 並沒有禁止商業性利用的規定。

如果你希望你的文件不要被他人修改,只有自己有修改的權利,則可選擇 CC-BY-ND 或是 CC-BY-NC-ND。

綜合說明,這兩類條款的差異在於:

創用 CC 允許非商業性與禁止改作,這是 GFDL 所做不到的,若真有人不願自己的說明文件被商業化,或不願被修改,例如有些作者願意釋出一些文件,但因為未來準備出書賺版稅,所以不願意被商業利用,也不 願意他人修改,這時即可採用包含 NC 或 ND 的創用 CC 條款;GFDL 講求格式透明,這是貫徹四大自由的研究精神,因為 GFDL 是配合 GPL 一起誕生的,GPL 講求要讓人可以研究與玩程式,因此要求一定要可以拿到原始碼,而說明文件是輔助他人來「知道如何好好玩程式」的重要說明,所以透明度與流通性都是很重要 的。相對地,創用 CC 所針對的創作型態著重在文學、圖畫、音樂等藝術創作,有些藝術創作者對於自己創作品的美學有所堅持,認為只要修改原作一丁點,就失掉了他所堅持的美學,因 此創用 CC 有 ND 可供其選擇。這樣不同的出發點跟自由軟體的協同開發很不一樣,所以若是軟體本身採用 GPL 類的條款授權的話,個人建議可以避免選用包含 ND 的 CC 授權條款,這樣若是有人修改軟體,也可以一併修改說明文件,這樣後手才會拿到軟體與說明文件一致的資料,玩起來才會有趣!

五、我能不能撤回/變更原來的文件授權條款?

我們的程式說明文件,不論是採用 GFDL 或是 CC,只要一經授權出去,就無法撤回,這點與 GPL 之於程式碼相同(註五)。所以我們在採用授權時,務必要先了解你選用的授權條款的內容及權利義務關係,否則可能會有覆水難收的情況。但有一個不算完備的補 救之道,就是新增內容,更換說明文件的版本,並重新以其他條款授權。這樣子的做法並不能終止前版本文件的授權,但我們可以用版本作為控制授權的類型,亦 即,只要我是該文件的原始著作權人,就可以在推出新版的說明文件時,一併改用新的授權方式。反之,如果我不是原始著作權人,而是取用他人文件的改作作者, 在該文件原來採行 Copyleft 授權條款的情況下(提醒,CC 的排列組合中,只有包含 SA 的組合才具有 Copyleft 的特性)(同註四),我所改作的衍生作品將不得利用上述更改版本的方式來更換授權條款。

六、結語

本文介紹 GFDL 及創用 CC 這兩個文件的授權條款,與筆者並非程式開發者的背景有關。筆者開始研究自由軟體授權條款時,才發現原來自己平時慣用的許多程式都是自由軟體。在學習如何操 作的過程中,不論是查詢其內建的說明文件檔,或是到官方網站閱讀或下載說明文件時,都只注意到其明白表示其授權為 GPL,而沒有進一步說明其說明文件的授權。即使我們都猜想這些開發者肯定不在意其說明文件被他人取得、散佈,但是他們到底在不在意被改作、被商業利用? 這就不得而知。筆者認為這是一個值得提醒各位開發者注意的事情,因此試著拋磚引玉的寫這篇文章,內容也許不見得完備,思路也可能疏漏,卻期待可以讓人開始 注意到自由軟體說明文件的授權問題,也期待在鼓吹軟體自由的同時,文件授權也可以朝向更自由的方向邁進!


註一:請參考《 GNU Free Documentation License (英) 》、《 How to Use the Optional Features of the GFDL (英) (中) 》、《Other tips for using the GNU Free Documentation License (英) (中)

註二:不過目前尚未正式發佈在地化的「創用CC-姓名標示-相同方式分享 3.0 台灣」。

註三:相關資料:”Interoperability between Creative Commons licenses and GFDL”、”Licensing update/Questions and Answers”、”從 GFDL1.2 轉為 GFDL1.3 以及 CC-姓名標示-相同方式分享雙重授權”。

註四:CC-SA 是否能完全合乎 Copyleft 機制似仍有爭議,討論見:葛冬梅,泛談 copyleft 機制與創用 CC 的「相同方式分享」授權要素, 自由軟體鑄造場電子報,第 125 期 (2009-04-27)。惟本文見解認為,相同方式分享之要求僅限於完全相同之方式,不得減少或增加授權要素。舉例說明:原採 BY-SA 之著作經他人改作後採 BY-SA-NC 係對原授權加諸原無之 NC 授權要素,此時 BY-SA 與 BY -SA-NC 為不相容;同理,若二著作原係以不相容之條款授權,則該二著作不得結合為新的衍生作品。可參見:《各種創用 CC 授權條款相容性之探討》,教育部創用 CC 資訊網。其中第(四)段「衍生著作使用多種授權條款之相容性」中之兩個表格之說明,對於前述筆者所舉之例,採相同見解。

註五:在 GPL v.2 下,由於授權條款中並無明文規定權利人不得撤回授權,因此曾出現相關爭議。通說認為解釋上應該無法撤回,而後為避免爭議,在最新的 GPL3 中即加入「Irrevocable」(不可撤回性)以明示 GPL 的立場;GFDL 只有被授權人在違反某些規定時才有終止授權效果,而未明示原授權人是否有隨時撤回的權利,因此也可以如同解釋 GPL2 一般地,解釋為應不得撤回。而創用 CC 即無此爭議,於其授權條款(Legal Code)的第 7 條「終止」第 b 段中即有明示其授權為永久且有效。


用eclipse發佈android的apk

當我們把程式寫好之後,總是希望別人使用他
而在Android必須發佈程apk檔才能讓人安裝
eclipse提供了很方便的道具來幫我們做到這件事
在apk裡面有個主要設定檔AndroidManifest.xml,包括了設定軟體版本或是權限等等都是用他包辦

在elcipse裡面,從專案總管裡面可以直接看到AndroidManifest.xml,點兩下就可以看到設定畫面
而如果要將專案打包成軟體就使用裡面的Export an unsigned APK and sign it manually即可

或是在專案上按右鍵 Android Tools裡面也可以發佈

有分為簽署跟未簽署兩種
未簽署可以直接發佈,簽署的話須要用JDK的keytool工具產生金鑰keystore,之後再用jarsigner簽章後才能發佈

keytool語法

keytool -genkey -v -keystore android.store -alias android.keystore -keyalg RSA -validity 20000

其中-genkey是產生key,-v顯示詳細資訊 -keystore android.store是名稱,-alias android.keystore是別名、-keyalg RSA 是加密方式為RSA、-validity 20000是有效期限,在Android Market上要求是至少50年(18250天)
之後系統會要求輸入一些有的沒的

之後可以在打指令的目錄下找到剛剛的金鑰檔

除了上述方法產生key之外,Android Tools也可以幫忙產生key,端看個人喜好

2009年5月24日 星期日

Android 1.5 tool的一些用法

這兩天研究了一下Android的指令跟eclipse上的一些用法
趁現在腦袋還清醒整理一下

在1.5版開啟模擬器必須先創造avd(Android virtual device)
創造法請參考上一篇使用eclipse開發Andrio 1.5
到android-sdk-windows-1.5_r1\tools目錄底下實施

android create avd -n avdname -t 2

接下來的指令假設都已經在android-sdk-windows-1.5_r1\tools底下了

如果要直接開啟模擬器的話一樣是用emulator.exe,但是跟1.1版不同的是
要加上參數avd
開啟模擬器語法

emulator.exe -avd test

test是我前面創造的avd

如果要指定skin的話,預設有四種skin可用

emulator.exe -avd test -skin SKINNAME

四種skin

  1. emulator.exe -avd test -skin HVGA-L:480x320水平顯示

  2. emulator.exe -avd test -skin HVGA-P:320x480垂直顯示(預設值)

  3. emulator.exe -avd test -skin QVGA-L:320x240水平顯示

  4. emulator.exe -avd test -skin QVGA-P:240x320垂直顯示



而如果想在模擬器使用sdcard的話,必須仰賴tool底下的mksdcard.exe指令
語法

mksdcard.exe sizeM Name.img

舉個例子,實施

mksdcard.exe 64M sd.img

就會在同個目錄下產生名為sd.img的映像檔


接下來我想掛載映像檔的話,就實施

emulator.exe -avd test -sdcard sd.img


而如果想要上傳檔案到sd.img裡面裡面,必須仰賴tool裡面的adb.exe指令
假設我想上傳一張圖片1.jpg,並且我把它放到跟adb.exe同個目錄下
註:可以上傳一整個目錄,不只檔案

實施命令

adb.exe push 1.jpg /sdcard

sdcard是映像檔裡面的目錄,如果嘗試push到其他目錄的話會出現錯誤訊息

adb.exe push 1.jpg /
...
failed to copy 1.jpg to /: Read-only file system


來看結果吧



adb還有其他指令

adb shell\\進入Linux模式,可用來檢視sdcard映像檔的檔案
adb pull /sdcard/XXX\\下載檔案
adb install xxx.apk\\ 安裝人家寫好的android應用程式
adb install -r xxx.apk\\ 重新安裝
adb uninstall package\\刪除應用程式 必須是packagename ex :com.me.mail
adb uninstall -k package\\刪除應用程式 但是保留資料


而tool裡面還有一個DDMS.exe工具,可以觀看模擬器的狀態,
輸入

ddms\\這個指令只有在模擬器開啟時有效



再來簡單介紹一下emulator.exe其他好用的參數

emulator.exe -avd AVDNAME -no-boot-anim\\省掉開機動話,寫程式時非常好用
emulator.exe -avd AVDNAME -dpi-device 200\\設定解析度 在此為200
emulator.exe -avd AVDNAME -wipe-data\\ 將模擬器回復到出廠時的設定


而android模擬器還有一個很大的優點,就是可以用telnet遠端登入模擬一些情況
登入語法

telnet localhost port

模擬器的port預設是5554,沒什麼必要的話也不用去改他
進去之後可以先用help指令去看有哪些東西可用
假設我想傳簡訊給模擬器我可以下達如下的指令

sms send 9527 'hello'

第三個參數是source號碼,而第四個參數是簡訊內容,這個非常重要,因為可以模擬很多實際情況,比方說來電
結果如下



----------------
最後來看一下eclipse的一些功能,eclipse也有創造avd跟關閉開機動畫的選項
一樣進入Run configuration,方法請看上一篇使用eclipse開發Andrio 1.5

進到Target後,下面有三個比較重要的功能

  1. AVD Manager:創造avd,而且可以同時指定sdcard
    可以取代指令

    android create avd -n avdname -t 2


  2. Wipe User Data:還原選項,可以取代指令

    emulator.exe -avd AVDNAME -wipe-data


  3. Disable Boot Animation:關掉開頭動畫,可以取代指令

    emulator.exe -avd AVDNAME -no-boot-anim




而這邊來看一下AVD Manager的選單,他會列出現在有的avd跟創造avd的功能

下面有個Create AVD的panel,他有四個選項可選

  1. Name:avd的名子在此用Test3

  2. Target:avd sdk的版本,在此選1.5

  3. skin:選擇顯示模式

  4. SDCard:avd要用的sdcard,在此用64M
    他可以有兩種輸入

    1. size:創造一個新的SDCard,這裡要注意一定要加上單位 M

    2. path:一個以存在的SDCard的映像檔所在路徑,譬如說我前面創造的
      E:\Android\android-sdk-windows-1.5_r1\tools\sd.img




之後按下Create AVD按鈕即可創造一個avd

這邊要注意一下,如果用size創造sdcard的話,他會存在avd所在位置之下
並且被命名為sdcard.img
avd所在位置預設是C:\Documents and Settings\你目前的使用者\.android\avd\
進去之後會看到剛剛創造的Test3.avd,點進去就可以看到sdcard

2009年5月21日 星期四

使用eclipse開發Andrio 1.5

最近想要研究一下Google放出來的Android平台,他是個開放源碼的作業系統
個人很看好這塊市場,趁現在還燙著趕緊來研究一下

-------------------------
這邊限定1.5版,因為方法與1.1版有異,以後搞不好會再更改

在開始之前先簡單透視一下Android SDK的架構


這張圖是『旗標:Android程式設計與應用』上的一章示意圖
Android是用Linux 2.6X版的kernel為基礎發展出來的平台,也有人說他就是Google版的Linux
但他用的是ASL(apache software license)授權方式而非Linux常用的GPL授權
往上在架構了lib層跟他自己的run-time環境,最後在搭上一套Framework就成了Android平台

而Android SDK開發要有幾個要件

  1. Android Linux系統核心

  2. Android模擬器

  3. Eclipse

  4. Dalvik虛擬機器

  5. Android除錯工具



Android目前總共有幾個系統上的SDK Windows,Mac OS,跟Linux

在此先介紹Windows版的安裝法

首先呢請先去他的網站下載SDK
http://developer.android.com/sdk/1.5_r1/index.html

請選擇相對應的版本把他下載下來

直接在I agree to the terms of the Android SDK License Agreement.上打勾
然後按Download就可以下載了
之後把他解壓到適當的目錄下,在此假設我解壓到E:\Android之下
隨後會產生android-sdk-windows-1.5_r1這個子目錄


再來我們需要Eclipse,但是我們還會需要Eclipse的JDT跟WTP兩個開發工具
不過沒關係我們去下載Eclipse的的Classic這個版本他就會替我們包好了
http://www.eclipse.org/downloads/

目前的版本為3.4.2 詳細版本號可能會變,請下載最新那版,然後同樣解壓到E:\Android那個目錄下


如果之前沒有安裝過JAVA JDK的話請先去下載安裝
http://java.sun.com/javase/downloads/index.jsp
版本挑1.5以上的

最後請安裝用Eclipse請安裝Android ADT開發工具
首先請先去剛才解壓的eclipse目錄下點選eclipse.exe開啟他
一開始會要我們選workspace,請照自己喜歡的創造
再來要安裝Android ADT了,先點選Help->Software Updates...

跳出視窗後先後點選Available Software->Add Site
之後輸入http://dl-ssl.google.com/android/eclipse/
按下OK(因為我之前已經輸入過了 所以圖片出現了重覆的訊息)



然後他會出現Android的選項,全部勾一勾按install

之後只要等待安裝完成

接下來呢必須設定SDK路徑
從Eclipse上方的選單中 Windows->Preferences會跳出一個視窗
點選Android,在SDK Location的地方設定剛剛Android SDK的位置
之後按下Apply在按下OK及設定完成


然後呢 要開始新增第一個Android的部分了
這邊開始就跟『旗標:Android程式設計與應用』有些不同了,因為這本書上提到的是1.1的安裝法
如果照書上直接去啟動Android的模擬器(在E:\Android\android-sdk-windows-1.5_r1\tool下的emulator.exe)會出現錯誤訊息

emulator: ERROR: You did not provide the name of an Android Virtual Device
with the -avd <name> option. Read -help-avd for more information.

If you *really* want to *NOT* run an AVD, consider using -data <file>
to specify a data partition image file (I hope you know what you're doing).


在這邊首先要用命令提示字元(開始->執行 輸入cmd)去創建一個avd
進入命令提示字元之後移動到SDK tool的目錄下(E:\Android\android-sdk-windows-1.5_r1\tool)輸入

android create avd -n test -t 2

他會出現訊息

Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]

直接用他默認的選項,按下Enter,就會出現創建成功的訊息

Created AVD test based on Android 1.5


在這邊因為我已經創建過了,所以我用test2取代

再來就可以創造一個Android Project了
選擇File->new->Project ,跳出一個視窗後選擇Android->Android Project



再來會跳出輸入相關參數的視窗,裡面有幾個一定要選的



  1. Project name:隨便打,主要是在eclipse裡面的專案名稱

  2. Build Target:SDK版號 選1.5版

  3. Application name:隨便打

  4. Package name:隨便打,但是要是網址的形式,主要是創建package用

  5. Create Activity:隨便打,創建出來class的名子


下面是創建出來後的對照

先用一段測試的程式碼

public class Test extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv=new TextView(this);
tv.setText("Hello World!");
setContentView(tv);
}
}


然後要執行的話,從上面的Bar裡面選擇Run->Run Configutrations或是點選start那個綠色按鈕旁邊的小三角形選Run Configutrations

跳出選單後先點選右上的小圖示(New Launch configuration)創建一個新的config


接著輸入Config的名子,按下Brower選取剛剛我們創建出來的專案按下Apply


之後點選Target,之後選擇剛剛創建出來的avd,按下Apply之後就可以按下Run來執行了


模擬器出來之後,一開始是Android的畫面,用滑鼠按一下

接下來會進入開機的畫面

之後要執行程式,先點選被框起來那個小圖

再來跳出的選單中可以看到已經安裝我們剛剛創造的Project,點下去就可以執行了



------------------
這裡打個小廣告,Eclipse真的是很好用的開發工具,從Java、C\C++甚至PHP等等都可以用他來開發,pulg-in,一直在增加,想要開發Web Service還是J2ME、UML架構都可以包辦
這次Google選擇他當主力開發環境實在令人高興,Eclipse可以幫程式設計師提升寫程式的速度