Android/App개발2011. 2. 22. 21:42


open_src/system/core/adb가 윈도우용으로 빌드될 때 아래의 소스들이 컴파일된다.
 usb_windows.c
 get_my_path_windows.c
 adb.c 
 console.c 
 transport.c 
 transport_local.c 
 transport_usb.c 
 commandline.c 
 adb_client.c 
 sockets.c 
 services.c 
 file_sync_client.c 
 shlist.c 
 utils.c 
 usb_vendors.c

아래 위치의 헤더파일들이 참조된다.
development/host/windows/usb/api/

프로그램의 시작지점은 아래와 같다.

int main(int argc, char **argv)
{
    adb_trace_init();
#if ADB_HOST
    adb_sysdeps_init();
    return adb_commandline(argc - 1, argv + 1);
#else
    if((argc > 1) && (!strcmp(argv[1],"recovery"))) {
        adb_device_banner = "recovery";
        recovery_mode = 1;
    }

    start_device_log();
    return adb_main(0);
#endif
}

commandline.c의 아래 함수에 커맨드라인 명령어의 처리 코드를 찾아볼 수 있다.

int adb_commandline(int argc, char **argv)
{
...
}

Posted by 삼스
Android/App개발2011. 2. 22. 21:15


adb윈도우용은 AdbWinApi.dll과 AdbWinUsbApi.dll과 함께 연동된다.
주요 API는 AdbWinApi.dll에 정의되어 있으며 AdbWinUsbApi.dll은 실제 Usb device와 연동부분을 책임진다.

오픈소스상의 아래 위치에 소스가 위치한다.

open_src/system/core/adb -> adb server, adb demon, adb client based on command-line의 소스가 OS별(linux, window, OSX)로 구현되어 있다.
open_src/developments/hosts/windows/usb -> 윈도우용 AdbWinApi.dll과 AdbWinUsbApi.dll의 소스와 드라이버등이 있다.

developments/hosts/windows/usb폴더구조는 다음과 같다.
 adb_winapi_test : test app
 api                   : AdbWinApi의 소스, adb.exe가 직접적으로 사용한다.
 legacy              : 드라이버
 winusb             : AdbWinUsbApi의 소스, Usb 연동부분에 대한 소스로 AdbWinApi가 로드하여 사용한다.

adb와 유사한 클라이언트 앱을 만들고자 한다면 AdbWinApi.dll이 노출하는 API들에 대한 스펙을 숙지하는것이 중요하다.
아래에 몇가지 API들을 소개한다.

adb_api.h
ADBWIN_API ADBAPIHANDLE __cdecl AdbEnumInterfaces(GUID class_id,
                                          bool exclude_not_present,
                                          bool exclude_removed,
                                          bool active_only);

ADBWIN_API bool __cdecl AdbNextInterface(ADBAPIHANDLE adb_handle,
                                 AdbInterfaceInfo* info,
                                 unsigned long* size);

ADBWIN_API bool __cdecl AdbResetInterfaceEnum(ADBAPIHANDLE adb_handle);

ADBWIN_API ADBAPIHANDLE __cdecl AdbCreateInterfaceByName(const wchar_t* interface_name);

ADBWIN_API ADBAPIHANDLE __cdecl AdbCreateInterface(GUID class_id,
                                           unsigned short vendor_id,
                                           unsigned short product_id,
                                           unsigned char interface_id);

ADBWIN_API bool __cdecl AdbGetInterfaceName(ADBAPIHANDLE adb_interface,
                                    void* buffer,
                                    unsigned long* buffer_char_size,
                                    bool ansi);

ADBWIN_API bool __cdecl AdbGetSerialNumber(ADBAPIHANDLE adb_interface,
                                   void* buffer,
                                   unsigned long* buffer_char_size,
                                   bool ansi);

ADBWIN_API bool __cdecl AdbGetUsbDeviceDescriptor(ADBAPIHANDLE adb_interface,
                                          USB_DEVICE_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetUsbConfigurationDescriptor(
                    ADBAPIHANDLE adb_interface,
                    USB_CONFIGURATION_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetUsbInterfaceDescriptor(ADBAPIHANDLE adb_interface,
                                             USB_INTERFACE_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetEndpointInformation(ADBAPIHANDLE adb_interface,
                                          unsigned char endpoint_index,
                                          AdbEndpointInformation* info);

ADBWIN_API bool __cdecl AdbGetDefaultBulkReadEndpointInformation(
                    ADBAPIHANDLE adb_interface,
                    AdbEndpointInformation* info);

ADBWIN_API bool __cdecl AdbGetDefaultBulkWriteEndpointInformation(
                    ADBAPIHANDLE adb_interface,
                    AdbEndpointInformation* info);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenEndpoint(ADBAPIHANDLE adb_interface,
                                        unsigned char endpoint_index,
                                        AdbOpenAccessType access_type,
                                        AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenDefaultBulkReadEndpoint(
                            ADBAPIHANDLE adb_interface,
                            AdbOpenAccessType access_type,
                            AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenDefaultBulkWriteEndpoint(
                            ADBAPIHANDLE adb_interface,
                            AdbOpenAccessType access_type,
                            AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbGetEndpointInterface(ADBAPIHANDLE adb_endpoint);

ADBWIN_API bool __cdecl AdbQueryInformationEndpoint(ADBAPIHANDLE adb_endpoint,
                                            AdbEndpointInformation* info);

ADBWIN_API ADBAPIHANDLE __cdecl AdbReadEndpointAsync(ADBAPIHANDLE adb_endpoint,
                                             void* buffer,
                                             unsigned long bytes_to_read,
                                             unsigned long* bytes_read,
                                             unsigned long time_out,
                                             HANDLE event_handle);

ADBWIN_API ADBAPIHANDLE __cdecl AdbWriteEndpointAsync(ADBAPIHANDLE adb_endpoint,
                                              void* buffer,
                                              unsigned long bytes_to_write,
                                              unsigned long* bytes_written,
                                              unsigned long time_out,
                                              HANDLE event_handle);

ADBWIN_API bool __cdecl AdbReadEndpointSync(ADBAPIHANDLE adb_endpoint,
                                    void* buffer,
                                    unsigned long bytes_to_read,
                                    unsigned long* bytes_read,
                                    unsigned long time_out);

ADBWIN_API bool __cdecl AdbWriteEndpointSync(ADBAPIHANDLE adb_endpoint,
                                     void* buffer,
                                     unsigned long bytes_to_write,
                                     unsigned long* bytes_written,
                                     unsigned long time_out);

ADBWIN_API bool __cdecl AdbGetOvelappedIoResult(ADBAPIHANDLE adb_io_completion,
                                        LPOVERLAPPED overlapped,
                                        unsigned long* bytes_transferred,
                                        bool wait);

ADBWIN_API bool __cdecl AdbHasOvelappedIoComplated(ADBAPIHANDLE adb_io_completion);


ADBWIN_API bool __cdecl AdbCloseHandle(ADBAPIHANDLE adb_handle);

Posted by 삼스
Android/App개발2011. 2. 11. 17:39

원문 : http://www.wakaleo.com/blog/302-android-development-with-maven

당신이 자바개발자고 모바일디바이스용 앱을 작성하고자 한다면 안드로이드는 의심할 여지 없는 최적의 플랫폼이다. 당신이 알고있는 자바기술과 툴등 이미 익숙한 환경에서 접근이 가능하다. 이런 이유로 iPhone이나 iPad용 앱개발보다 접근이 쉽다. 또한 훌룡한 많은 툴들과 기술들을 사용할 수 있다(유닛테스트, 자동빌드, 연속빌드등등)

이 문서는 안드로이드 앱개발에 관한것이 아니다. 자동화된 빌드인프라에 안드로이드프로세스를 통합하는것에 대한 내용을 기술한다. 두개의 시리즈로 나뉘며 첫번째는 안드로이드 빌드프로세스를 메이븐을 통해 자동화하는 법에 대한 내용이고 두번째는 자동화된 테스트와 연속빌드에 대한 내용이다.

안드로이드 개발자는 이클립스를 많이 사용한다. 안드로이드는 훌룡한 이클립스플러그인을 제공하는데 안드로이드개발관련 많은 항목들을 아주 쉽게 사용할 수 있게 해준다. 실시간 안드로이드의 에러체킹과 빌드와 에뮬레이터와 연결하여 테스트하는것까지 가능하다.

그러나 멋진 이클립스플러그인도 빌드프로세스를 자동화하지는 못하고 있고 많은 메이븐의 기능들이 빠져있다(의존성을 선언만으로 관리하는것과 배포프로세스를 클린하는것). 다행히 메이븐플러그인이 존재한다. 다만 이 두가지를 잘 사용하려면 조심해서 써야 한다. 이 문서에서 안드로이드에서 메이븐을 다루는 기본적인 사항에 대한것과 몇가지 팁 그리고 방법에 대해 안내할것이다.

시작하기
먼저 안드로이드 SDK와 이클립스플러그인이 설치되었음을 가정한다. 설치가 안되었다면 먼저 설치후 진행하기 바란다. 정상적으로 환경이 갖추어졌다면 File->New->Android Project를 선택하면 아래 화면이 나타날것이다.

Android and Maven
이클립스는 좋지만 중요한 자바개발프로젝트는 하나의 자동화된 빌드스크립트가 필요하다. 안드로이드가 메이븐과 함께 작업되게 하려면 몇가지 단계의 작업을 해야 한다. 먼저 ANDROID_HOME환경변수를 안드로이드SDK가 설치된 경로로 설정한다.
export ANDROID_HOME=/opt/android-sdk-linux
메이븐 안드로이드 플러그인은 이 환경변수가 필요하다.
또한 settings.xml파일에 안드로이드 플로그인 그룹을 반드시 추가해야 한다. 그러면 커맨드라인에서 안드로이드플러그인을 쉽게 사용할 수 있다.
<pluginGroups>
  <pluginGroup>com.jayway.maven.plugins.android.generation2</pluginGroup> 
</pluginGroups>
안드로이드 AVD Manager에서 emulator를 생성하라. 여기서 입력한 AVD name은 프로젝트설정파일(pom.xml)에서 참조된다.
이제 당신의 프로젝트에서 pom.xml파일을 편집할 차례이다. 간편한 방법은 프로젝트 디렉토리에서 바로 pom.xml파일을 생성하는 것이다. pom.xml파일의 예제를 아래 나타내었다.
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wakaleo.training.android.qotd</groupId>
  <artifactId>QuoteOfTheDay</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>apk</packaging>
  <name>QuoteOfTheDay</name>
  <dependencies>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android-test</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
      <version>1.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.8.5</version>
      <scope>test</scope>
    </dependency>

  </dependencies>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <testSourceDirectory>test</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>maven-android-plugin</artifactId>
        <version>2.6.0</version>
        <configuration>
          <sdk>
            <platform>8</platform>
          </sdk>
          <emulator>
            <avd>em22</avd>
          </emulator>
          <deleteConflictingFiles>true</deleteConflictingFiles>
          <undeployBeforeDeploy>true</undeployBeforeDeploy>
        </configuration>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
      </plugin>
    </plugins>
  </build>
</project>

위 pom.xml에서 중요한 항목이 두가지가 있다. 먼저 packaging타입이 apk인것이다. 이것은 안드로이드애플리케이션임을 나타낸다. dependencies에서 android와 android-test library는 provided로 설정되어 있다. 이 라이브러리는 디바이스에 존재하기 때문에 package에 포함되지 않도록 하게된다. 그리고 default source directory와 test directory를 를 변경하여 안드로이드 이클립스프로젝트 설정과 함께 사용가능해졌다.

이 pom파일은 메이블을 통해 커맨드라인명령으로 안드로이드의 공통된 작업을 할 수 있게 해준다. 예를 들어 애플리케이션을 빌드하는것이 단순해진다. 그냥 mvn clean install을 실행하면 된다. emulator에 deploy하고자 한다면 에뮬레이터를 먼저 띄워야 한다. 커맨드라인에서 띄우려면 mvn android:emulator-start를 실행하면 된다. 에뮬레이터는 1~2분 정도후에 뜨게 된다.
$ mvn android:emulator-start
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building QuoteOfTheDay 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-android-plugin:2.6.0:emulator-start (default-cli) @ qotd ---
[INFO] Android emulator command: /opt/android/android-sdk-mac_x86/tools/emulator -avd em22 
unknown
[INFO] Starting android emulator with script: /var/folders/y+/y+a+wZ-jG6WKHEm9KwnSvE+++TI/-
Tmp-//maven-android-plugin-emulator-start.sh
[INFO] Waiting for emulator start:5000
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.836s
[INFO] Finished at: Thu Oct 28 14:34:40 NZDT 2010
[INFO] Final Memory: 8M/81M
[INFO] ------------------------------------------------------------------------

그리고 에뮬레이터에 애플리케이션을 deploy하고 싶다면 mvn android:deploy를 실행하면 된다.
$ mvn android:deploy
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building QuoteOfTheDay 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-android-plugin:2.6.0:deploy (default-cli) @ qotd ---
[INFO] /opt/android/android-sdk-mac_x86/tools/adb [install, -r, /Users/johnsmart/Projects
/Training/android/android-quote-of-the-day/quoteoftheday/target/qotd-0.0.1-SNAPSHOT.apk]
[INFO] 1068 KB/s (13169 bytes in 0.012s)
        pkg: /data/local/tmp/qotd-0.0.1-SNAPSHOT.apk
Success
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.537s
[INFO] Finished at: Thu Oct 28 14:35:25 NZDT 2010
[INFO] Final Memory: 8M/81M
[INFO] ------------------------------------------------------------------------

이클립스로 돌아가서
이제 메이븐으로 당신을 안드로이드 앱을 빌드하고 배치할수 있게 되었다. 당신은 이제 이클립스를 이 파티에 초대할 필요가 있다. 프로젝트에 메이븐 기능을 활성화하는 일반적인 방법은 'Maven -> Enable Dependency Management'메뉴를 통해 가능하다. 불행히도 이작업이 불가능할것이다. 이작업을 하려면 m2eclipse Android Integration plugin 를 설치해야 한다. 이 플러그인은 m2eclipse와 Android Eclipse plugin를 연결해주는 역할을 한다. 이 플러그인을 설치하면 'Enable Dependency Management'메뉴가 나타날것이다.
메이븐이 활성화된 안드로이드 프로젝트를 'Run As-> Android Application'메뉴를 통해 실행이 가능해야 한다. 이는 에뮬레이터를 실행하고 애플리케이션을 배치할것이다. 또는 활성화된 애뮬레이터에 바로 배치할것이다.

이제 빌드하고, 배치하고 실행하는 것을 메이븐을 통한것과 이클립스를 통해 모두 가능해졌다. 이제 자동화된 빌드를 위한 문이 열렸다. 그리고 로컬 CI server를 셋업할수 있게 되었다.

다음 시리즈에서는 자동화된 유닌과 테스트를 통합하는것과 허드슨을 사용하여 당신의 안드로이드 프로젝트에 Continuous Integration을 셋업하는 방법에 대해 안내할것이다. 

Trouble shooting...
메이븐을 사용하는 가장 큰 이유는 참조라이브러리들의 관리가 쉽다는 것인데 위 절차대로 수행 후 센트럴레포지트리가 아닌 로컬레포지트리의 라이브러리를 가져오지 못하는 경우가 있을 수 있다.
콘솔에서는 참조를 잘하는데 이클립스에서는 잘 안된다면 바로 메이븐의 설정파일을 이클립스에서 참조하지 않고 있어서 발생하는것으로 생각하면 된다. 이것때문에 하루정도 삽질을 ...

eclipse 환경설정에서 Maven -> Installations에서 Add선택 후 설치한 메이븐 폴더를 지정해주면 된다.


Posted by 삼스
Android/정리2009. 5. 11. 14:19
출처: http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=4


안드로이드 전체 소스 코드 빌드 방법

 
먼저 안드로이드 소스를 빌드하기 위해선 리눅스 ubuntu 환경을 만드는 것이 바람직할 듯 합니다.
구글도 ubuntu 를 추천하고 있기 때문이고, 다른 package 사용하면 리눅스 초보자의 경우 작업이
힘들 수 있을 것으로 보입니다. 가급적 우분투를 사용하시기 바랍니다.
 
그럼 이제부터, 제가 build한 절차를 os 설치에서 부터 순차적으로 설명드리도록 하겠습니다.
최종적으로 모두 build하기 까지 꽤 많은 시간이 소비되니 충분한 시간을 가지고 빌드하시기 바랍니다.
 
1. 리눅스 Ubuntu 패키지 설치.
 
   전 참고로 ubuntu-8.04.1 desktop-i386을 사용하였음을 알려드립니다.
 
   - 먼저 아래의 url에서 우분투 iso 이미지를 얻으셔서 리눅스 설치 CD를 만듭니다.

      ftp://ftp.daum.net/ubuntu-releases/8.04.1/ubuntu-8.04.1-desktop-i386.iso
 
   - 그 이후 적당한 컴퓨터에 리눅스를 설치합니다.
 
2. 리눅스가 모두 설치되면 루트 passwd를 일단 설정합니다
 
    $ sudo passwd root
 
3. 만약 설치된 리눅스 Desktop에서 직접 작업을 원하시지 않는다면 ssh를 설치합니다
    저의 경우엔 ssh client를 사용하여 windows에서 접속하여 안드로이드 소스를 빌드하였습니다.
    ssh 설치 방법은 다음과 같습니다.
 
    $ sudo apt-get install ssh
 
4. 안드로이 설치 환경 준비
 
    - 기본적으로 다음과 같은 package를 인스톨하여야 합니다.
 
       $ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
       $ sudo apt-get install valgrind
 
    - 안드로이드는 Phython 2.4 이상이 요구됩니다.
       우분투 8.04.1에는 이미 Phython 2.5가 포함되어 있기 때문에 이 부분은 skip하셔도 됩니다.
 
    - JDK 5.0, Update 12 또는 그 이상이 요구됩니다.
       이를 위해선 다음과 같이 설치하시면 됩니다.
 
       $ sudo apt-get install sun-java6-jdk
 
    - Git 1.5.4 또는 그 이상 버전, 그리고 Repo가 요구됩니다.
 
       $ cd ~
       $ mkdir bin
 
       vi 로 ~/.bashrc 에 다음과 같이 환경변수를 추가합니다.
 
       $ vi ~/.bashrc
 
       export LANG=c
       export PATH=/home/<your_home>/bin:$PATH:.
       export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07
       export ANDROID_JAVA_HOME=$JAVA_HOME
 
       환경설정을 반영하기 위해 다시 로그인 하시던가 아니면 터미날을 종료했다 다시 실행하세요.
       csh의 경우엔 source ~/.cshrc를 하면 되는데..bash를 잘 모르겠네여.
 
       다음으로 git와 repo를 설치입니다.
 
       $ sudo apt-get install git-core gnupg      
 
       $ curl http://android.git.kernel.org/repo >~/bin/repo
       $ chmod a+x ~/bin/repo
 
       $ mkdir mydroid
       $ cd mydroid
 
       $ repo init -u git://android.git.kernel.org/platform/manifest.git
  
       여기까지 실행하시면, repo initialized in /home/<your_home>/mydroid 란 메시지가 나옵니다.
       이렇게 되면 환경설정은 이제 마무리 되었다고 보셔도 됩니다.
 
5. 안드로이드 소스 얻기
 
       아래과 같이 수행하면 안드로이드 전체 소스를 다운로드 하게 됩니다.
 
       $ repo sync

 
6. 안드로이드 빌드 하기
 
      $ make
 
      이 과정을 수행하는 동안 zlib.h error가 발생할 수 있습니다.
      이 경우에는 아래와 같이 zlibb1g-dev를 설치하시고 계속 make를 수행하면 됩니다.
 
      $ sudo apt-get install zlib1g-dev
      $ make
 
      이 과정을 수행하는 동안 -lncurses error가 발생할 수 있습니다.
      이 경우에는 아래와 같이 libncurses5-dev를 설치하시고 계속 make를 수행하면 됩니다.
 
       $ sudo apt-get install libncurses5-dev
       $ make
 
7. 결과 확인하기
 
       out 디렉토리에 build된 안드로이드 full package가 위치하게 됩니다.
 
       $ cd out
 
8. Kernel 별도로 빌드하기
 
     - msm
 
        $ cd ~/mydroid/kernel
        $ make msm_defconfig ARCH=arm
        $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
 
     - goldfish (android 1.5에 merge되었으므로 이 커맨드는 동작하지 않음)
 
        $ cd ~/mydroid/kernel
        $ make goldfish_defconfig ARCH=arm
        $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
 


Posted by 삼스
Android/정리2009. 5. 6. 15:59
Android Application을 개발하기 위해서는 다음 4가지 컴포넌트에 대해 알아야 한다.
 1. Activity
 2. Service
 3. Provider
 4. Receiver
 5. Manifest
이 외에 activity들의 스택인 task에 대해 알아야 한다.

1. Activity
 하나의 가상의 사용자 인터페이스에 대한 표현이다.
 - 화면에 나타나지 않을수 있고
 - 화면에 떠있을 수 있고
 - 어떤 값을 리턴할수 있고
 - 어떤 화면의 일부로 임베디드될수 있다.

 package com.android.myactivity;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

2. Service
 - 백그라운드로 수행되는 보이지 않는 클래스들이다.
 - Application process의 일부 또는 그 자체의 process로 동작할 수 있다.
 - 자신의 process또는 다른 process의 service에 bind할수 있다.
 - IDL로 정의된 remote-able interface로 한번 bind된 service와 통신이 가능하다.
 package com.android.myservice;
import android.app.Service;
public class MyService extends Service
{   
    public void onCreate() {
        Thread st = new Thread() {
            void run() { /* ... */ }
        };
        st.start();
    }
    public void onDestroy() {
        /*
        / ... *//
    }
}

3. Broadcast Receiver
 - Broadcast receiver는 broadcast announcement를 받아서 응답하는 일만 하는 다른 일은 아무것도 하지 않는 컴포넌트이다.
 - system에서 기본적으로 제공하는 많은 broadcast메세지들이 있다(예, 타임존의 변경, 배터리의 부족, 사진이 캡쳐되었는지, 사용자가 언어를 바꾸었는지등 ...)
 - Application에서 broadcast를 정의하여 발생시킬수도 있다(예, 어떤 데이터가 모두 다운되었는지 다른 app에 알리고자 할때)
 - 하나의 Application은 여러개의 broadcast receiver를 가질수 있다. receiver는 BroadcastReceiver base class를 파생시켜 작성한다.
 - Broadcast receiver는 UI를 가지고 있지 않으며 수신한 정보에 대한 응답으로 특정 activity를 시작한다거나 NotificationManager로 사용자에게 통지를 준다.
 - Notification은 다양한 방법으로 사용자에게 통지를 한다 - flashing the backlight, device떨림, 소리재생 등등...
 - 일반적으로 상태바에 아이콘으로 표시되며 사용자가 열어볼수 있게 한다.
 package org.kandroid.helloandroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context arg0, Intent arg1) {
    }
}

4. Content provider
 - Application간에 특정 데이터를 공유할 수 있도록 해줌.
 - 획일화된 API를 제공
 - Content는 URI와 MIME type으로 표현됨.
 package org.kandroid.helloandroid;
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
public class MyProvider extends ContentProvider {
    @Override public int delete(Uri arg0, String arg1, String[] arg2)
                            { return 0; }
    @Override public String getType(Uri arg0) {return null;}
    @Override public Uri insert(Uri arg0, ContentValues arg1)
                            { return null;}
    @Override public boolean onCreate() {return false;}
    @Override public Cursor query(Uri arg0, String[] arg1, String arg2,
                            String[] arg3, String arg4) {return null;}
                                        3
    @Override public int update(Uri arg0, ContentValues arg1, String arg2,
                            String[] arg3) {return 0;}
}


5. Component의 활성화
  - Content provider : ContentResolver에 의해 타켓팅될 때 활성화된다.
  - 나머지 3가지 component(Activity, Service, Receiver)는 intent로 불리는 비동기적인 메세지에 의해 활성화된다.
  - Activity, Service를 위한 Intent는 Action과 URI정보가 필요하다.
  - Broadcast receiver를 위한 intent는 action정보가 필요하다.

각 component type별로 활성화하는 방법이 있다.
  - Activity : Content.startActivity() 또는 Activity.startActivityForResult()에 intent object를 넘겨서 activity를 활성화한다.
  - Service : Context.startService()에 intent object를 넘겨서 service를 활성화한다. Android는 Service의 onStart()메소드를 호출하고 intent object를 넘긴다.
  - Broadcast Receiver : Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()에 intent object를 넘겨서 broadcast를 활성화한다.

6. Component의 비활성화
 - Content provider : ContentResolver의 request에 대하여 responding중에만 활성화된다.
 - Broadcast receiver : Broadcast message에 대한 responding중에만 활성화 된다.
 - 따라서 provider와 receiver는 명시적으로 component를 비활성화 할 필요가 없다.
 - Activity, Service : idle time에도 무언가 process가 이루어지는 컴포넌트이다.
 - Activity : finish()메소드로 비활성화한다. 특정 activity에서 다른 activity를 죽이려면 finishActivity()를 호출한다.
 - Service : stopService() 또는 Context.stopService()로 비활성화한다.

7. Manifest file
 - Android가 application component를 시작하기 전에 그 component가 존재하는지에 대해 먼저 알아야 한다. 그러므로 application component들에 대한 정보를 manifest 파일에 선언하고 Android package(.Apk) file에 applicaiton code, files, resources와 함께 묶음으로 담겨 있다.
 - XML file형식
 - 모든 application에 AndroidManifest.xml로 이름이 고정되어 있슴
 - component에 대한 기술 외에 library, permission등에 대한 정보도 선언됨.
 <manifest>
    <instrumentation>
    <uses-sdk>
    <uses-permission>
      uses permission
    <permission>
    <permission-group>
    <permission-tree>
    <application>
       pp
          <uses-library>
          <activity>
          <activity-alias>
          <provider>
           p
                      <grant-uri-permission>
          <receiver>
          <service>
               <intent-filter>
                      <action>
                      <category>
                      <data>
               <meta-data>




Posted by 삼스
Android/정리2009. 5. 6. 14:01
빌드하기

1. 리눅스 Ubuntu 패키지 설치.
전 참고로 ubuntu-8.04.1 desktop-i386을 사용하였음을 알려드립니다.
- 먼저 아래의 url에서 우분투 iso 이미지를 얻으셔서 리눅스 설치 CD를 만듭니다.
ftp://ftp.daum.net/ubuntu-releases/8.04.1/ubuntu-8.04.1-desktop-i386.iso
- 그 이후 적당한 컴퓨터에 리눅스를 설치합니다.
2. 리눅스가 모두 설치되면 루트 passwd를 일단 설정합니다
$ sudo passwd root
3. 만약 설치된 리눅스 Desktop에서 직접 작업을 원하시지 않는다면 ssh를 설치합니다
저의 경우엔 ssh client를 사용하여 windows에서 접속하여 안드로이드 소스를 빌드하였습니다.
ssh 설치 방법은 다음과 같습니다.
$ sudo apt-get install ssh

4. 안드로이드 설치 환경 준비
- 기본적으로 다음과 같은 package를 인스톨하여야 합니다.
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev
build-essential zip curl
$ sudo apt-get install valgrind
- 안드로이드는 Phython 2.4 이상이 요구됩니다.
우분투 8.04.1에는 이미 Phython 2.5가 포함되어 있기 때문에 이 부분은 skip하셔도 됩니다.
- JDK 5.0, Update 12 또는 그 이상이 요구됩니다.
이를 위해선 다음과 같이 설치하시면 됩니다.
$ sudo apt-get install sun-java6-jdk
- Git 1.5.4 또는 그 이상 버전, 그리고 Repo가 요구됩니다.
$ cd ~
$ mkdir bin
vi 로 ~/.bashrc 에 다음과 같이 환경변수를 추가합니다.
$ vi ~/.bashrc
export LANG=c
export PATH=/home/<your_home>/bin:$PATH:.
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07
export ANDROID_JAVA_HOME=$JAVA_HOME
환경설정을 반영하기 위해 다시 로그인 하시던가 아니면 터미날을 종료했다 다시 실행하세요.
csh의 경우엔 source ~/.cshrc를 하면 되는데..bash를 잘 모르겠네여.
다음으로 git와 repo를 설치입니다.
$ sudo apt-get install git-core gnupg
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git
여기까지 실행하시면, repo initialized in /home/<your_home>/mydroid 란 메시지가 나옵니다.
이렇게 되면 환경설정은 이제 마무리 되었다고 보셔도 됩니다
5. 안드로이드 소스 얻기
아래과 같이 수행하면 안드로이드 전체 소스를 다운로드 하게 됩니다.
$ repo sync
6. 안드로이드 빌드 하기
$ make
이 과정을 수행하는 동안 zlib.h error가 발생할 수 있습니다.
이 경우에는 아래와 같이 zlibb1g-dev를 설치하시고 계속 make를 수행하면 됩니다.
$ sudo apt-get install zlib1g-dev
$ make
이 과정을 수행하는 동안 -lncurses error가 발생할 수 있습니다.
이 경우에는 아래와 같이 libncurses5-dev를 설치하시고 계속 make를 수행하면 됩니다.
$ sudo apt-get install libncurses5-dev
$ make
7. 결과 확인하기
out 디렉토리에 build된 안드로이드 full package가 위치하게 됩니다.
$ cd out
8. Kernel 별도로 빌드하기
- msm
$ cd ~/mydroid/kernel
$ make msm_defconfig ARCH=arm
$ make ARCH=arm
CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- goldfish(1.5에서 merge됨, 따라서 msm_defconfig로 변경)
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm
CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-


테스트하기
1. 먼저 mydroid 의 out directory에서 아래의 세가지 image를
android sdk가 설치된 desktop에 download를 합니다.
~mydroid/out/target/product/generic/ramdisk.img
~mydroid/out/target/product/generic/system.img
~mydroid/out/target/product/generic/userdata.img
2. android sdk 1.0 이 설치된 desktop의 아래의 directory에서 ramdisk.img, system.img, use
rdata.img를 임시로 다른 곳으로 저장합니다.
android-sdk-windows-1.0_r1/tools/lib/images
3. 위에서 다운로운한 세가지 img 파일을 위의 디렉토리에 위치지운 후,
android-sdk-windows-1.0_r1/tools/emulator.exe를 실행합니다.
4. 만약 emualor가 정상적으로 실행되고, 내부 app. 들이 정상적으로 작동한다면,
안드로이드 source는 정상적으로 build되었다고 볼 수 있습니다.

Posted by 삼스
Android/정리2009. 5. 6. 13:58


1. Bootloader : 기본적인 hw initialize
2. Load linux
3. Start kernel - /init/main.c
4. Android initialization process - /etc/init.rc
   -> Start android services: Colsole, adbd, service manager, debuggerd, mountd, rild, zygote, mediaserver, installd, flash_recovery

아래는 init.rc의 process를 도식화한것이다.

init : init.rc를 해석하여 수행하고 초기화한다.
       /dev노드 아래에 %hardware%.rc를 참조하여 디바이스노드를 생성해낸다.
console : shell을 시작한다.
service manager : binder IPC service manager를 시작한다.
mountd : 모든 filesystem을 마운트한다.
debuggerd : debug system을 시작한다.
rild : Radio Interface Layer daemon을 시작한다.
zygote : Android Java VM runtime을 시작하고 system server를 시작한다. 가장 중요한 프로세스이다.
media server : Audio/Surface flinger, MediaPlayerService, Camera service를 시작한다.
Installd : install package daemon을 시작한다.
      
  • 모든 안드로이드 어플리케이션은 zygote process에 의해 fork된다.
  • system_servier는 fork된 zygote에 의해 최초로 적재되는 특별한 프로세스이며 Core service들을 시작한다.
    • ActivityManager, WindowsManager, PackageManager, ...
  • 다른 안드로이드프로세스는 ActivityManagerService에 의해 생성된다.

더 자세한 정보를 원한다면 /frameworks/base/services/java/com/android/server/am/ActivityManagerService.java 와 /frameworks/base/core/java/android/os/Process.java

ActivityManagerService.systemReady에서 persistent application을 부팅시 시작하도록 되어 있다. 따라서 AndroidManifest.xml에서 아래와 같이 정의된 Application은 부팅시 실행된다.

 <application android:name="PhoneApp"
    android:persistent="true"
    android:label="@string/dialerIconLabel"
    android:icon="@drawable/ic_launcher_phone">

intent.CATEGORY_HOME으로 설정된 component가 적재된다.
intent.ACTION_BOOT_COMPLETED로 설정된 component가 부팅 완료후 적재된다.
receiver component중 android.enabled와 android.exported가 false이면 ACTION_BOOT_COMPLETED가 set되어 있더라도 적재되지 않는다.
<receiver android:name=".service.BootReceiver" android:enabled="false"
<receiver android:name=".DownloadReceiver" android:exported="false"> 




Posted by 삼스
Android/정리2009. 5. 6. 11:40
1. 안드로이드란?
 안드로이드는 모바일디바이스들을 위한 SW Stack으로써, OS, Middleware, Key application을 포함하고 있다.

 안드로이드SDK는 Java language를 사용하여 안드로이드플랫폼상의 application 개발에 필요한 API들과 도구들을 제공한다.

2. Features
 애플리케이션 프레임워크 : 컴포넌트의 재사용과 대체(replacement)를 가능하게 함.
 달빅(Dalvik) 가상머신 : 모바일 디바이스에 최적화됨.
 통합(Integrated) 브라우저 : 오픈 소스 Webkit 엔진 기반임.
 최적화된 그래픽 : 구글이 만든 2D 그래픽 라이브러리를 사용함.
 OpenGL ES 1.0 스펙에 기반한 3D 그래픽을 사용함 (하드웨어 가속은 선택사항임)
 SQLite : 정형화된 데이터 저장공간을 위한 것임.
 미디어 지원 : 일반적인 오디오, 비디오, 그리고 정지(still) 이미지 포맷들을 지원
                    (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
 GSM과 CDMA 텔레포니(Telephony) (하드웨어 의존적)
 블루투스, EDGE, 3G, WiFi (하드웨어 의존적)
 카메라, GPS, 나침반, 그리고 가속도계 (하드웨어 의존적)
 풍부한 개발 환경 : 디바이스 에뮬레이터, 디버깅 도구, 메모리 및 성능 프로파일링 그리고 Eclipse
 IDE를 위한 플러그인을 포함함 

3. Architecture

3.1 Applications
 안드로이드가 기본적으로 제공하는 Java Applications

3.2 Application Framework
 자바기반의 프레임웍으로 대부분 native C/C++코드로 작성되어 JNI로 자바와 인터페이싱되어 있다.
 코어시스템서비스와 하드웨어 서비스로 구성되어 있다.
 Core System Services
  - Activity Manager
  - Package Manager
  - Resource Manager
  - Content Provierss
  - Window Manager
  - View System
 Hardware services
  - low-level access to hw device
  - Location Manager
  - Telephony Manager
  - Blutooth service
  - Wifi service
  - USB service
  - Sensor service

3.3 Libraries
 안드로이드가 내장하고 있는 기본적인 라이브러리는 Bionic Libc, Function Library, Navive Service, Hardware Abstraction Library로 구성된다.
 - Bionic Libc : 임베디드에 최적화된 구글에서 직접 구현한 libc이다. 이를 직접 구현한 이유는 GPL를 피하여 일부 라이선스 프리를 보장하기 위한것과, 개별프로세스마다 포함되어야 하고 빨라야 하기 때문이다. 따라서 가볍고 빠른 libc를 목표로 작성된 Libc이다.
 - Function Library : Webkit, OpenCORE, SQLite들이 있다.
 - Native server : Surface flinger, Audio flinger가 있다. 이는 시스템 전반에 걸친 화면과 소리를 담당하는 서버라고 보면된다.
 - Hardware Abstraction Layer : OS로 사용하고 있는 리눅스운영체제가 다수의 드라이버개발모델을 가지고 있어 이를 통합하고자 하는 의도가 보이는 대목이다. 이를 이용하여 안드로이드플랫폼을 하드웨어인터페이스로부터 분리할수 있다. GPL을 피할수 있으며 안드로이드가 별도의 하드웨어 요구사항을 정의하고 있다.
 - 안드로이드 런타임 라이브러리 : Dalvik가상머신과 Core라이브러리들로 구성된다.

3.4 안드로이드 런타임 라이브러리
 - Dalvik 가상머신 : 안드로이들에서는 자바 가상머신을 사용하지 않는다. 이유는 여러가지가 있는데 속도와 안드로이드 프레임웤구조때문이다. 달빅가상머신은 프로세스별로 생성되어 어플리케이션간의 청정영역(clean-room)을 제공한다.
    - Register 기반의 가상머신 (no JIT, interpreter-only)
    - Optimized for low memory requirements
    - Designed to allow multiple VM instances to run at one
    - Relying on underlying OS for process isolation,
       memory management and threading support
    - Executes Dalvik Executables (DEX) files which are zipped into
an Android Package (APK)
 - Core라이브러리 : 강력하지만 단순하고 익숙한 개발 플랫폼을 제공하는 자바언어를 위한 Core API들을 포함하고 있다. Application개발시 필요한 거의 모든 자바Core API들이 있다고 보면된다. Data structure, Utility, File access, Network access, graphic, ...
    - Bundled in android.jar
    - Android platform library: android.*.
       XML Parser implementations included (DOM, SAX, XMLPullParser)
    - Apache Harmony (Standrard Java Library implementation)
    - Several popular Open Source projects available out-of-the-box.
        Apache Commons (HttpClients 2/4, Codec), BouncyCastle JCE providers, SQLite, JUnit 3.8.x
    - GData APIs partly included as wireless version(com.google.wireless.gdata)

4. 리눅스 커널
 - 리눅스커널을 기반으로 하고 있으나 리눅스는 아니다.
    X-Windows내장하지 않음, Glibc지원하지 않음, 표준리눅스유틸리티 전체를 포함하지 않는다.
 - 리눅스커널 버전 2.6.23, 2.6.24, 2.6.25, 2.6.27를 사용해왔으며 안드로이드지원을 위해 패치를 포함한다.
 - 리눅스를 사용하는 이유
    - 메모리 및 프로세스관리
    - Permission기반의 보안모델
    - 검증된 드라이버모델
    - 공유라이브러리 지원
    - 오픈소스기반 등의 장점을 이용함.
 - 확장된 리눅스커널영역
    - Alarm, Ashmem, Binder, Power Management, Low memory killer, Kernel debugger, logger
 - http://git.android.com에서 배포
Posted by 삼스
흥미있는 뉴스2009. 2. 9. 15:44
http://www.etnews.co.kr/news/detail.html?&mc=m_014_00004&id=200902060083

구글이 주도해 만든 운용체계(OS) ‘안드로이드’가 서서히 ‘괴물’로 진화할 조짐을 보이고 있다. 

지난해 T모바일을 통해 휴대폰 OS로 첫 탑재된 이래 각종 인터넷 기기와 미디어 플레이어에서 한 자리씩 꿰차고 있는 것. 안드로이드 OS는 당장 시장 판도를 바꾸지는 못하겠지만, 각종 제품에 적용되는 범위가 넓어 IT 전반에 미칠 잠재력 영향력은 상당한 것으로 평가되고 있다.

◇다양화하는 안드로이드 제품군=안드로이드 기반 스마트폰을 처음 내놓은 업체는 대만의 HTC다. 우여곡절 끝에 첫 제품이 나온 후 삼성전자와 LG전자도 안드로이드폰을 내놓겠다고 밝혔다. 주목되는 점은 안드로이드에 관심을 가진 업체는 휴대폰 업체만이 아니라는 점이다. 8일 비즈니스위크에 따르면 터치레볼루션은 안드로이드를 이용해 터치스크린 유선전화와 의료기기, 15인치 주방용 컴퓨터, 터치스크린 레스토랑 전자메뉴판 등을 개발 중이다. 또 이달 스페인 바로셀로나에서 열리는 ‘모바일 월드 콩그레스’에선 안드로이드 기반 미니노트북PC(넷북)가 다수 선보일 것으로 관측된다.

존 브루거만 윈드리버 최고마케팅담당자는 “특히 아시아 제조업체 중 적지 않은 수가 윈도를 쓰지 않는 안드로이드 기반의 제품을 설계 중”이라고 말했다.
포토기사
삼성 꽃 무늬 MP3 제품 출시
충격! 미국인도 놀란
2.7배 초고속 영어!
LGT, 고객 정보보호 위해 아이핀
동영상기사
CPU, 그래픽과 메인보드 집어삼
첫 구글폰 HTC G1 만져본 소감
부드럽고 빠른 HTC 터치 다이아
◇강력한 유연성이 무기=안드로이드의 유연성이 저변 확대에 기여하고 있다는 분석이다. 보통 휴대폰이나 PC OS는 수정하기 힘들다. 반면 안드로이드는 코드가 공개된 리눅스를 바탕으로 개발, 최소한의 수정만 거치면 서로 다른 칩에서도 구동이 된다. 전자 제조업체 입장에선 선택할 수 있는 칩의 범위가 넓어져 제품 개발이 쉬워진다.

또 안드로이드는 무료다. 라이선스 수수료를 받지 않기 때문에 MS 윈도를 탑재한 제품보다 제품 단가를 더 낮출 수 있다. 바로 유연성의 경제학이다. 실제로 텍사스인스트루먼츠는 비디오 플레이어, 디지털사진액자 등에 안드로이드를 탑재했다. 퀄컴도 비디오플레이어와 태블릿PC 등을 포함한 20여가지의 안드로이드 기반 제품을 올해와 내년에 선보일 계획이다. 

구글은 안드로이드를 모바일 플랫폼로 내놓은 후 확장 전략을 선보인 적은 없다. 그러나 애초 구글과 협력업체들은 스마트폰에서 서버에 이르는 유연한 플랫폼 개발을 목표로 두고 안드로이드 개발에 나섰던 것으로 알려지고 있다.

◇주변 분야에도 영향력 끼칠듯=안드로이드 확대 가능성 소식에 가장 찜찜해 할 업체는 MS다. 최근 점유율이 다소 하락하기는 했어도 PC 분야의 ‘윈도’ 시장 점유율은 80% 후반 대에 이른다. 그러나 넷북, 디지털액자 등 MS가 교두보를 확보하지 못한 분야에선 안드로이드가 의외의 성적을 거둘 수도 있다는 것이 비즈니스위크의 분석이다. 

마크 함블린 터치레볼루션 CEO는 “PC 시장은 갈수록 위축되겠지만, 언제 어디서나 사무와 인터넷 작업이 가능한 유비쿼터스 컴퓨팅 기기 시장은 큰 폭으로 증가할 것”이라면서 “새 분야에서 안드로이드의 영향력을 기대해 볼 수 있다”고 말했다. 이에 대해 MS 측은 “우리는 경쟁을 환영한다”며 “그러나 안드로이드는 윈도의 친숙성, 호환성, 편리성을 따라오지 못할 것”이라고 말했다. 

안드로이드의 범위 확장은 새로운 경쟁자도 출현시켰다. 인텔도 최근 모바일인터넷기기(MID) 사업을 확장하면서 리눅스 기반 OS ‘모블린(Moblin)’을 선보였다. 

류현정기자 dreamshot@etnews.co.kr
Posted by 삼스