Android/정리2009. 5. 6. 16:50
Activity = molecule
Tack = cellection of activities
Process = standard linux process

<원문 번역>
Activity & Task
 하나의 activity는 다른 activity를 시작할 수 있고 다른 application의 activity도 시작할 수 있다. 예를 들어 임의위치의 street map을 display한다고 가정하자, 이런 작업을 하는 activity는 이미 제공된다. 따라서 당신의 activity에서 이 activity를 시작하기 위해 해야 할 일은 필요한 정보를 포함하는 intent object를 startActivity()에 파라메터로 전달하여 호출하는것 뿐이다. 이렇게 하면 street map viewer가 표시될것이다. 이 때 BACK버튼을 누르면 viewer를 시작한 당신의 activity가 다시 보여질 것이다.
 이는 사용자로 하여금 street map viewer가 당신의 application의 일부라고 느끼게 한다. 하지만 실제로는 그 activity는 다른 app의 다른 process상의 activity이다.
 안드로이드는 이처럼 사용자가 사용한 activity들을 task로 하여 그 정보를 유지한다. 관련된 activity는 group으로 stack에 저장된다.
 root activity는 task상의 첫번째 activity이고 top activity는 현재 화면에 보여지는 activity이다. activity가 다른 activity를 시작하면 그 새로운 activity가 stack에 push되고 그 activity가 top activity가 된다. 그리고 이전 activity는 stack에 남아 있는다. 이 상태에서 사용자가 BACK버튼을 누르면 이전 activity가 stack에서 POP되어 화면에 보여지게 되어 resume된다.
stack은 activity의 object(instance)를 가지고 있다. 따라서 같은 activity의 여러개의 instance가 가능하다. 같은 activity를 여러개 시작할수 있다는 의미이다.
 stack내의 activity는 stack이므로 재정렬되지 않는다. 순서는 그대로 유지되게 된다. 단지 PUSH, POP만 된다.
Task는 activity들의 stack이다. 따라서 task내의 activity에 어떤 값을 설정하는 방법은 없다. root activity만이 affinity(친밀도) set을 이용하여 read, set이 가능하다.
Task의 모든 activity들은 하나의 집합으로 background또는 foreground로 이동한다. 현재 Task가 4개의 activity를 가진다고 가정해보자. HOME 키를 누르면 application launcher로 이동한다. 이어서 새로운 application을 실행한다. 그러면 현재 task는 background로 가고 새로운 task의 root activity가 표시된다. 이어 사용자가 다시 HOME으로 갔다가 이전 application을 다시 선택한다면 그 task가 다시 앞으로 나온다. 이 때 BACK키를 누르면 root activity가 표시되지 않고 task상의 이전 activity가 표시된다.

      A1 -> A2 -> A3 -> A4 -> HOME -> B 1-> B2 -> HOME -> A4 -> BACK -> A3

task와 activity간의 결합과 동작에 대한 제어는 intent object의 flag 파라메터와 minifest의 <activity> element의 몇가지 속성으로 제어가 가능하다.

    flag -> FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, FLAG_ACTIVITY_SINGLE_TOP
    <activity>'s attributes -> taskAffinity, launchMode, allowTaskReparenting, clearTaskOnLaunch, allowRetainTaskState, finishOnTaskLaunch

Affinityes and new Tasks
 기본적으로 하나의 application의 activity들은 각기 하나의 affinity를 갖는다. 그러나 각각의 affinity들은 <activity> element의 taskAffinity속성으로 affinity set을 이룰수 있다. 서로 다른 application의 activity들이 동일한 affinity를 공유할 수 있으며 한 application의 activity들이 서로 다른 affinity를 가질수 있다. affinity는 intent object에 FLAG_ACTIVITY_NEW_TASK로 activity를 적재할 때와 activity가 allowTaskReparenting속성을 true로 set하였을 때 시작된다.

FLAG_ACTIVITY_NEW_TASK 적용시
 앞서 기술한대로 기본적으로 activity는 startActivity()로 task안에 적재된다. caller와 동일한 stack에 push된다. 그러나 startActivity()가 FLAG_ACTIVITY_NEW_TASK 로 flag를 set하여 호출하면 시스템은 새로운 activity를 담기위한 task를 찾는다. 보통 새로운 task가 생성되지만 동일한 affinity를 갖는 task가 검색되면 그 태스크에 가서 달라붙는다.

allowTaskReparenting 적용시
 특정 activity가 allowTaskReparenting속성이 "true"이면, 시작된 task에서 동일한 affinity를 갖는 다른 task가 foreground로 올라올때 그 task로 activity가 이동될 수 있다. 예를 들면, 특정도시의 날씨를 보여주는 activity를 가지고 있는 travel application이 있다고 하자. travel application에 동일한 affinity를 갖는 다른 activity가 있고 reparenting이 가능하다. 이 상태에서 당신의 application의 activity가 travel application의 날씨 activity를 시작하면 날씨 activity는 당신의 task에 적재되게 된다. 그러나 이 때 travel application이 적재되게 되면 날씨 activity는 새로 시작된 travel application의 task에 재위치지정이 되고 화면에 표시되어진다.

travel application : Weather activity, ... -> allowTaskReparenting이 true이고 모두 동일 affinity를 갖는다.
your application : A, B, C, D activity

 launch travel application -> (1)start Weather activity -> HOME -> launch your application -> start A activity -> (2)start Weather activity -> HOME -> (3)travel application -> display Weather activity
  
(1) 시점에서 weather activity는 task1(travel app의 task)에 적재된다. (2)시점에서 weather activity는 task2(your app의 task)에 적재된다. (3)의 시점에서 travel app가 다시 시작될때 task2에 있던 weather activity가 task1으로 재지정되게 된다.
 
하나의 패키지(*.apk)에 여러 application이 정의되어 있다면 app단위로 각기 다른 affinity를 부여하는것이 좋다.

Launch Mode
 <activity> element에 lounchMode 속성을 조정하여 activity를 컨트롤할 수 있다. 

            standard, singleTop, singleTask, singleInstance

 위 4가지 모드는 4가지 관점에서 다르게 동작한다.
* 임의 Intent에 대해 어떤 task가 그 activity를 받을 것인가?
 standard, singleTop모드는 intent가 발생된 task에 push된다. flag를 FLAG_ACTIVITY_NEW_TASK로 설정해도 호출한 동일한 task내에 push된다. 위에 기술한 affinity & new task에 따라 다른 task가 선택될수 있다.
 singleTask및 singleInstance는 task를 정의하여 root activity로 적재되고 다른 task에 적재되지 않는다.
* 다중 instance activity가 가능한가?
standard, singleTop모드는 여러 task에 소속될수도 있고 한 task에 동일한 activity가 여러 instance가 적재될수도 있다. 
singleTask, singleInstance는 task내에서 오로지 한개의 instance만 적재된다. root activity만 가능하기 때문에 device내에서 한번에 하나의 Instance만 존재할 수 있다.
* Instance가 task내에서 다른 activity를 가질수 있는가?
 singleInstance는 task내에서 오직 하나의 instance만 가능하며, 만일 다른 activity를 시작하면 launchMode에 관계없이 새로운 task가 생성되어 적재된다.
 standard, singleTask, singleTop은 모두 multi instance가 가능하다. singleTask는 root activity로 생성되며 다른 activity를 task내에 적재가 가능하다. singleTop과 standard모드는 stack내에서 자유롭게 다른 activity를 생성가능하다.
* 특정 class의 새로운 instance가 새로운 intent를 다룰것인가?
 standard모드는 새로운 instance가 새로운 intent의 응답으로 생성된다. 각 instance는 오직 하나의 intent를 다룬다.
 singleTop : target-task의 stack에 top activity로 있다면 그 class의 instance가 intent를 재사용하여 처리한다. top activity가 아니면 재사용하지 않고 새로운 instance가 생성되어 intent를 처리하고 stack에 push된다.

예) A - B - C - D에서 D를 시작하려고 할 때  D가 singleTop이면 A - B - C - D 로된다.
     A - B - C - D에서 D를 시작하려고 할 때  D가 standard이면 A - B - C - D - D 로된다.
     B가 singleTop이나 standare이면 A - B - C - D - B 가 가능하다.
    

Clearing the stack
  기본적으로 사용자가 task를 오랫동안 사용하지 않으면 system은 task의 root activity만을 제외하고 모든 activity들을 clear한다. <activity>element의 몇가지 속성은 이를 조정할 수 있게 해준다.

alwaysRetainState 속성
  task의 root activity에 이 속성을 set하면 이 task는 오랜시가이 지나도 생존하게 된다.
clearTaskOnLaunch 속성
  task의 root activity에 이 속성을 set하면 task를 나가고 돌아올때 clear된다.
finishOnTaskLaunch
  clearTaskOnLaunch와 유사하나 이 속성은 하나의 activity에만 유효하다. root activity를 포함하여 현재 세션인 경우에만 살아있고 task를 떠나면 clear된다.

  stack에서 activity를 제거하는 다른 방법이 있다.
  intent object의 flag를 FLAG_ACTIVITY_CLEAR_TOP로 하고 이 intent를 처리할 activity가 target task에 이미 instance를 가지고 있다면 상위 activity들이 모두 clear되고 그 activity가 top activity가 된다.   launchMode가 "standard"라면 stack에서 마찬가지로 삭제되고 새로운 activity가 그 intent를 처리할 것이다.
  FLAG_ACTIVITY_NEW_TASK와 FLAG_ACTIVITY_CLEAR_TOP이 함께 사용되면 존재하는 activity가 새 task에 생성되어 intent를 처리한다.

Starting task
  activity는 intent filter중에 action filter로 android.intent.action.MAIN를 그리고 category filter로  android.intent.category.LAUNCHER로 entry point가 설정된다. 이런 설정은 icon과 label정보를 가지로 화면에 표시하고 task에 적재하고 적재후 언제든지 다시 돌아올수 있도록 해준다.
  사용자는 언제든 task를 떠날수 있고 다시 돌아올수 있다. singleTask와 singleInstance로 설정된 activity는 반드시 MAIN과 LAUNCHER를 filter로 적용해야 한다. 그러지 않으면 activity를 수행후 다른 화면으로 갔다가 다시 돌아올 수 있는 방법이 없게 된다.

  FLAG_ACTIVITY_NEW_TASK 는 activity하나가 새로운 task에 시작되고 HOME key를 눌렀을 경우 다시 복귀하기 위해 다른 방법이 있다.
  외부 task에서 notification manager같은 entity에서 항상 activity들을 시작할 수 있다. 이런 방식으로 외부에서 activity를 invoke할 수 있다면 사용자가 다른 방법으로 그 task를 시작할 수 있음을 유의해야 한다. 이런 경우 그 activity로 복귀하기를 원하지 않는다면 finishOnTaskLaunch를 사용하면 된다.


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. 5. 5. 20:42

로이터 | 입력 2009.04.28 17:57 

  

It's never too early to twitter. Thanks to a new device, babies who aren't even born can let the world know they're alive and kicking. Called the Kickbee, the device is strapped over a pregnant woman's belly and within seconds of a baby's kick, a message, or "tweet" is posted on Twitter.

'소리를 내는 데(twitter)' 너무 이른 나이란 있을 수 없다. 새로 발명된 장치 덕에 태아도 자기가 살아서 발길질을 하고 있다는 것을 알릴 수 있게 됐다. 임신부가 '킥비(Kickbee)'라는 이름의 이 장치를 배에 차면 태아가 발길질을 한 뒤 몇 초도 지나지 않아 '트위터(Twitter)'라는 이름의 기계에 메시지가 뜬다.

It was created by New York University (N.Y.U.) student Corey Menscher.

뉴욕 대학교 재학생 코리 멘셔 씨가 이 장치를 개발했다.

SOUNDBITE Corey Menscher, Inventor of Kickbee, saying (English):"It's an elastic band that the mother wears and it contains a couple of vibration sensors. The vibration sensors detect a kick and they send it to a microcontroller, which does some further processing to filter out kicks from movement and then it sends it to a java application that I wrote over wireless network, which then updates twitter."

[코리 맨셔/ '킥비' 발명가]

"임신부는 진동 센서 몇 개가 장착된 탄력밴드를 착용한다. 태아가 발길질을 하면 진동 센서가 이를 감지해 마이크로컨트롤러로 보낸다. 이곳에서 태아의 움직임 가운데 발길질하는 동작만 잡아내는 과정을 거친다. 그 다음 그 신호는 무선네트워크를 통해 글자로 변환하게끔 개발된 자바 응용 프로그램으로 보내진 뒤 '트위터'에 나타난다."

The tweet says "I kicked Mommy Really Hard!" and indicates the exact time that the sensor detected a kick. Menscher who is completing his masters degree came up with the idea after his wife got pregnant.

트위터에는 "내가 엄마 배를 세게 찼다!"는 글이 뜨고 센서가 발길질을 감지한 시간이 정확하게 표시된다. 박사 과정을 밟고 있는 멘셔 씨는 아내가 임신을 한 뒤 이 아이디어를 생각해 냈다고 말했다.

Not wanting to miss out on the joy of feeling his baby's kicks while he attended classes, he found a way to stay connected through technology. He said Twitter's interface made it easy to do.

수업 중 그의 아기가 아내의 배를 찰 경우 그것을 만져보는 기쁨을 놓치기 싫어 그는 기술을 통해 뱃속 아기와 연결될 수 있는 방법을 찾아냈다. 그는 '트위터' 인터페이스 덕분에 이런 일이 쉽게 가능해졌다고 말했다.

SOUNDBITE Corey Menscher, Inventor of Kickbee, saying (English):"The application I wrote actually talks to Twitter through Twitter's A.P.I. or Application Programming Interface. It's an easy way for developers to send updates to Twitter through any application they write. All the Kickbee does is detect kicks and then send a kick event to my application."

[코리 맨셔/ '킥비' 발명가]

"내가 만든 응용 프로그램은 '트위터'의 응용 프로그래밍 인터페이스를 통해 '트위터'에게 메시지를 전달한다. 이 방법을 이용하면 개발자들은 어떤 응용 프로그램을 이용하느냐에 상관없이 트위터에 정보를 업데이트 할 수 있다. 킥비가 하는 일이라고는 태아의 발길질을 포착해 내가 개발한 응용프로그램에 보내 주는 것이다."

Menscher says that as families are increasingly forced to live apart technology has a greater role to play in keeping families connected. Karina Huber. Reuters, New York.

멘셔 씨는 떨어져 사는 가족들이 늘어나면서 가족 구성원들을 하나로 묶어주는 데 기술이 더 큰 역할을 하게 됐다고 말한다.

번역: 이화영 동아닷컴 기자 likeindians@donga.com 

 

 

아이뉴스24

'구글 왕국'이 현실로 다가온다

기사입력 2009-05-02 10:15


'구글 왕국'이 조금씩 가시화되고 있다. 검색 업체로 첫 발을 내디뎠던 구글이 인터넷 황제로 변신한 데 이어 이젠 세상의 지배자를 향해 전진하고 있다.

이 같은 거대한 야심의 중심에 서 있는 것은 구글이 지난 해 선보인 '안드로이드'라는 모바일 운영체제(OS)다.

모바일 OS로 소개되긴 했지만 구글 안드로이드는 단순한 휴대폰 플랫폼이 아니다. 구글의 궁극적인 목적은 인간이 사용하는 모든 기기에 '안드로이드'를 탑재하겠다는 것.

안드로이드를 인류 삶을 지배하는 플랫폼으로 만들어 '구글 왕국'을 세우겠다는 거대한 야망을 드러내고 있는 것이다.

이런 야심이 실현될 경우 하루 종일 구글과 함께 생활하게 될 지도 모른다.

이를 테면 회사에서 구글 PC로 작업을 하고, 구글 사무용 전화기으로 거래처와 통화를 하고, 업무를 마친 후 회식자리에서 구글 전자 메뉴판으로 음식을 주문해 식사를 한 뒤 2차로 '구글 노래방'에서 친목을 다질 지도 모를 일이다. 그러다 병원에 가면 구글 의료기기를 통해 진료를 받는다.

구글이 지배하는 거대한 세상이 다가오고 있는 것이다.

◆구글 폰 이어 구글 PC 나온다

2008년 10월 출시된 첫 안드로이드 휴대폰 'T모바일 G1'이미국에서만 100만대 판매를 돌파하며 큰 인기를 얻으면서 '구글폰'에 대한 관심이 세계적으로 높아지고 있다.

한국의 삼성전자를 비롯한 다수의 글로벌 휴대폰 업체들이 올해 안에 안드로이드 기반 스마트폰을 출시할 예정이다. 시장조사기관 인스탯은 안드로이드 기반 휴대폰이 연 300%의 성장률을 기록하게 될 것이라고 전망했다.

안드로이드를 앞세워 모바일 시장을 노크했던 구글은 예상보다 훨씬 빠른 속도로 자신들의 영역을 구축하는 데 성공했다.

하지만 구글의 야심이 모바일 영역에서 머물지는 않을 전망이다. 이젠 PC 영역으로 안드로이드 바람을 확산시키려 하고 있다.

올해 안드로이드OS를 탑재한 '구글 넷북'이 나올 것이라는 소문이 조금씩 현실화되고 있는 것. 최근 아수스와 휴렛패커드가 구글 넷북을 출시를 고려하고 있다고 밝힌데 이어, 중국의 스카이톤이라는 업체가 올 3분기에 안드로이드를 탑재한 넷북 '알파680'을 출시할 것이라고 발표했다. 또 우리나라의 삼보컴퓨터도 구글 넷북을 개발하고 있다.

구글은 지난 해 하반기 PC용 웹 브라우저 '크롬'도 공식 출시했다. 또 웹에 접속해야만 사용할 수 있었던 이메일 서비스 ‘지메일’과 문서작업 솔루션 ‘구글독스’의 오프라인 버전도 내놨다. 인터넷에서만 사용했던 지메일을 마이크로소프트(MS) 아웃룩처럼, 구글독스를 MS오피스처럼 오프라인 상태에서도 사용할 수 있게 만든 것이다.

이렇게 되면 마이크로소프트(MS) 윈도-인터넷익스플로러-MS 아웃룩-MS오피스로 구성된 MS기반 PC처럼, 안드로이드-크롬-지메일-구글독스로 구성된 구글 기반 PC 탄생이 예고된다.

구글은 일단 넷북으로 PC 시장에 진출하지만 향후 데스크톱용 OS로도 손색이 없는 안드로이드를 개발할 계획이다. 게다가 안드로이드는 MS의 윈도와 달리 무료이기 때문에 가격 경쟁력 면에서 우세하다. PC 시장을 장악하고 있는 MS에 구글이라는 강력한 도전자가 등장한 것이다.

◆집안 구석구석 구글의 흔적

하지만 구글이 궁극적으로 노리는 것은 일상 생활 속의 모든 기기에 안드로이드를 심는 것이다. 휴대폰과 PC 뿐 아니라 집전화와 TV 셋톱박스, 디지털 액자에도 안드로이드가 탑재하겠다는 것이 구글의 야심이다.

미국의 주요 통신사인 T모바일은 앞으로 안드로이드를 탑재한 인터넷 집전화를 공급할 예정이다. 최근 국내외 통신사들이 의욕적으로 출시하고 있는 인터넷 집전화는 음성통화 및 화상통화 외에 이메일·음악·동영상·뉴스 등 온라인 콘텐츠를 전송해주며 간이 컴퓨터 역할을 하고 있다.

T모바일이 공급하게 될 안드로이드 기반 인터넷 집전화도 이와 유사한 제품이다. 이미 비슷한 기능의 안드로이드 기반 사무실용 인터넷 전화기도 있다.

또 구글은 TV 셋톱박스에도 눈독을 들이고 있다. 안드로이드가 탑재될 TV 셋톱박스는 TV와 웹이 혼합된 서비스를 구현하며, 소셜 네트워킹 서비스(SNS) 기능도 제공하게 된다. TV를 보면서 SNS에 접속해 있는 친구들과 메시지를 주고받을 수 있으며, 영화 등의 온라인 콘텐츠들을 다운받을 수 있다. 또 티켓 예매 등의 전자상거래도 할 수 있다.

이미 MS와 애플도 각각 '미디어룸', '애플TV'라는 이름으로 인터넷TV 사업을 하고 있지만, 이들은 자사의 솔루션으로만 구성된 폐쇄적인 서비스를 제공하고 있다. 하지만 구글의 안드로이드는 어느 하드웨어에도 적용될 수 있는 플랫폼이라는 게 경쟁력이 될 것으로 보인다.

또 구글은 안드로이드가 탑재된 디지털 액자를 선보일 계획이다. 이 액자는 디지털 사진 뷰어 기능 외에도 인터넷 기능 일부를 담는다. 이런식으로 집안 구석구석이 구글의 텃밭이 된다.

◆회식 후 2차는 ‘구글노래방’에서

심지어 노래방에도 구글이 침투한다. 구글은 조만간 안드로이드가 탑재된 노래방 기기도 선보일 예정이다.

안드로이드가 탑재된 노래방 기기는 단순 반주 기기에서 벗어나 네트워크와 연결되고 지능화된 만능 엔터테인먼트 기기로 업그레이드된다. 예를 들면 노래방 기기에 저장돼 있지 않은 곡도 바로 웹에 접속해 다운받거나 스트리밍으로 재생하는 게 가능해진다. 안드로이드를 만나 디지털화된 ‘구글 노래방’이 탄생할 수 있게 된다.


노래방 기기 뿐 아니라 DVD플레이어, 게임기 등에도 안드로이드를 탑재해 지능화된 인터넷 기반 엔터테인먼트기기로 재 탄생시키는 게 충분히 가능하다. 즉 디지털 콘텐츠나 정보를 전달하는 모든 기기에 안드로이드가 스며들 수 있다. 그럼 구글 노래방 뿐 아니라 구글 비디오방, 구글 비디오 게임방도 나올 수 있다는 얘기다.

이처럼 안드로이드를 채택하는 기기가 무한 늘어날 수 있는 가장 큰 이유 중 하나는 안드로이드가 오픈소스 기반의 무료 플랫폼이기 때문이다. 애초에 구글은 안드로이드를 다양한 하드웨어에 쉽게 탑재할 수 있도록 설계한 것이다.

사람들에게 친숙한 수많은 하드웨어에 스며들어가 ‘구글 왕국’을 짓겠다는 구글의 꿈이 실현되는 것은 사실 아직 먼 얘기고 꼭 이뤄진다고 장담할 수도 없다.

이미 웹과 하드웨어 시장을 선점하고 있는 MS와 애플 등의 경쟁자들이 구글의 습격을 앉아서 당하고만 있지는 않을 것이다. 또 아직은 소비자들이 위에 언급한 모든 하드웨어들로 웹 서비스를 누리고자 하는 수요도 크게 가지고 있지는 않은 상황이다.

하지만 구글은 경쟁사를 견제하고, 소비자의 수요를 창출할 방법을 꾸준히 연구하며 구글 왕국 건설을 향해 끊임없이 달려가고 있다.

강현주 기자 jjoo@inews24.com

'구글 넷북' 3개월 내로 나온다

'집 전화'가 부활한다

'구글 노래방' 나온다

구글 안드로이드, 집 전화에도 탑재된다

구글의 웹 세상 장악 무기, '안드로이드'

Posted by 삼스
Android/App개발2009. 5. 1. 14:11
sdk1.5에서는 1.1과 달리 AVD라는 것을 지원한다.
1.1버전과 1.5버전을 모두 지원하고 google api도 분리하였다.
따라서 3가지 AVD가 존재하며 eclipse plugin을 사용하려면 AVD를 모두 생성해주어야 한다.


> android list avds
Available Android Virtual Devices:

> android list targets
Available Android targets:
id: 1
     Name: Android 1.1
     Type: Platform
     API level: 2
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2
     Name: Android 1.5
     Type: Platform
     API level: 3
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 3
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Description: Android + Google APIs
     Based on Android 1.5 (API level 3)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P

> android create avd --name sdk1.1 --target 1
> android create avd --name sdk1.5 --target 2
> android create avd --name sdk1.5map --target 3

> emulator @sdk1.5

Reference : http://www.taosoftware.co.jp/blog/2009/04/android_sdk15_emulator.html
Posted by 삼스
Linux2009. 4. 30. 17:36
http://cafe.naver.com/cmdir.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=400

find - 파일찾기


find 명령어는 파일 시스템에서 주어진 조건으로 파일을 찾는다.

사용법을 살펴보자.
find 대상디렉토리 검색 조건 처리 방법

대상 디렉토리 : 찾기를 시작할 디렉토리를 지정한다.
검색 조건 : 찾을 조건을 지정한다.
-name filename
파일 이름으로 찾는다.
-atime +n
access time 이 n일 이전인 파일을 찾는다.
-atime -n
access time이 n일 이내인 파일을 찾는다.
-mtime +n
n일 이전에 변경된 파일을 찾는다.
-mtime -n
n일 이내에 변경된 파일을 찾는다.
-perm nnn
파일 권한이 nnn인 파일을 찾는다.
-type x
파일 타입이 x인 파일들을 찾는다.
-size n
사이즈가 n이상인 파일들을 찾는다.
-links n
링크된 개수가 n인 파일들을 찾는다.
-user username
user이름으로 찾는다.
-group groupname
group 이름으로 찾는다.

처리방법 : 찾은 파일을 어떻게 할 것인지를 지정한다.
-print
찾은 파일의 절대 경로명을 화면에 출력한다.
-exec cmd {}\; 
찾은 파일들에 대해 cmd 명령어를 실행한다.


예를 들어보자.
$ find /user4 -name test* -print

/user4 아래에서 파일이름이 test로 시작하는 모든 파일을 찾아서 화면에
보여준다.

$ cd /
$ find . -name ping -print

root 디렉토리 밑에서 파일이름이 ping인 파일을 찾아 절대 경로명을 화면에
출력한다.

$ cd /
$ find /usr -name *.c -print

/usr 밑에 이름이 .c로 끝나는 모든 파일들을 찾아 경로명을 보여준다.

$ cd /
$ find $home -name who.txt -print

home 디렉토리 아래에 who.txt라는 파일을 찾아 경로명을 보여준다.

$ cd /
$ find . -type d -print

파일 타입이 d인 파일을 찾아 경로명을 화면에 출력한다.

$ cd /
$ find /dev -type c -print

/dev디렉토리 아래에서 파일 타입이 c인 파일을 찾아 경로명을 보여 준다.

$ cd /
$ find . -perm 700 -print

파일 권한이 700인 파일을 찾아준다.

$ cd /
$ find . \ ( -perm 400 -o -perm 200 ) -print

파일 권한이 400인 파일과 200인 파일을 찾아준다.
(주의 : "\"의 앞뒤에 space 가 반드시 있어야 한다.)

$ cd /
$ find . -size +1024 -print

파일의 블럭 크기가 1024 이상인 파일을 찾아준다.

$ cd /
$ find . -name core -size +2048 -print

파일 이름이 core이고 크기가 2048블럭 이상인 파일을 찾아준다.

$ cd /
$ find . -user unix01 -print

파일 소유자가 unix01인 파일을 찾아준다.

$ cd /
$ find . -group unix -print

사용자그룹이 unix인 파일을 찾아준다.

$ cd /
$ find . -atime +30 -print

30일 이전에 억세스되었던 파일을 찾는다.

$ cd /
$ find . -mtime -7 -print

7일 이내에 수정된 적이 있는 파일을 찾는다.

$ cd /
$ find . -name core -exec ls -l {} \;

이름이 core인 파일을 찾아서 ls -l 한다.

$ cd /
$ find . -name \*.c -atime +30 -exec ls -l {} \;

30일 이전에 억세스된 파일 중 *.c를 찾아 ls -l 한다.

$ cd /
$ find . -name core -exec rm -i {} \;

현재 디렉토리 밑에서 이름이 core인 파일을 찾아 지운다(지우기 전에 정말
지울 지를 물어본다.)

Posted by 삼스
Linux/버전관리2009. 4. 29. 22:11
참조: http://www.kernel.org/pub/software/scm/git/docs/git-config.html

사용자 삽입 이미지

--global 옵션을 사용하려고 시도하면 처음에 fatal: $HOME not set git 이런 에러를 만나게 됩니다. 그럼 환경 변수에 $HOME 변수를 추가해주고 다시 시도해보면 잘 동작할 겁니다.

기트 설정 파일의 위치는 세 종류가 있습니다. 특정 저장소와 관련된 설정, 컴터 사용자 관련 설정, 컴터 관련 설정이 있습니다.

아무런 옵션을 주지 않고 git config 라고 사용하면 그 하위 폴더에 .git/config에 설정 합니다. 명시적으로 -f ./git/config 또는 --file ./git/config 같은 식으로 설정할 수도 있습니다.

ex) git conifg user.name "whiteship"

컴터 사용자 관련 설정은 --global 옵션을 사용하면 되고, 시스템 관련 설정은 --system을 사용하면 됩니다.

설정한 정보는 --list 옵션으로 보는데, 살펴볼 설정 위치를 명시해주지 않으면 모든 위치의 설정 성보를 보여줍니다.

ex) git config --list

사용자 삽입 이미지
Posted by 삼스
Linux/버전관리2009. 4. 29. 22:10
참조: http://git-scm.com/documentation

로컬 명령어

git config      저장소 또는 글로벌 옵션 가져오거나 설정할 때 사용.
git init     비어있는 기트 저장소 만들거나 기존의 저장소 다시 초기화.
git add     파일 내용을 인덱스에 추가.
git status     작업 트리(working tree) 상태 보기.
git commit     저장소에 변경 사항 기록하기.
git log     커밋 히스토리 보기.
git show     특정 객체 정보 보기.
git tag     태그 만들고, 나열하고, 삭제하고, 검증할 때 사용.

원격 명령어

git clone      저장소를 새 디렉터리에 복사하기.
git remote     추적중인 저장소(tracked repository) 집합 관리하기.
git pull     다른 저장소 또는 로컬 브랜치에서 가져온(fetch) 다음 병합하기(merge).
git fetch     다른 저장소에서 가져오기.
git push     연관된 객체로 원격 저장소 업데이트.

브랜치 명령어

git checkout      브랜치 또는 패스(path)를 작업 트리로 체크아웃하기.
git branch     브랜치 목록 나열하기, 만들기, 삭제하기할 때 사용.
git merge     두 개 이상의 개발 히스토리를 하나로 합치기.
git rebase     브랜치 베이스를 변경할 때 사용(?).

기타 명령어

git diff      커밋, 작업 트리 등 변경 사항 보기.
git apply     기트 인덱스 파일과 작업 트리에 패치(patch) 적용하기.
git format-patch     이메일로 보낼 패치 준비하기.
git am     메일 박스에있는 패치 적용하기.
Posted by 삼스