1. 부분빌드를 실행하기 위해서 필요
userId@build1:~/svn/export_20110705/trunk/Android$ source build/envsetup.sh
including device/htc/passion/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh

2. 사용자필요에 맞게 설정해 주면 됩니다. ( 예 : choosecombo 1 2 8 3 )
userId@build1:~/svn/export_20110705/trunk/Android$ choosecombo
Build for the simulator or the device?
     1. Device
     2. Simulator

Which would you like? [1] 1


Build type choices are:
     1. release
     2. debug

Which would you like? [1] 2


Product choices are:
     1. core
     2. full
     3. full_crespo
     4. full_passion
     5. generic
     6. generic_x86
     7. msm7627_ffa
     8. msm7627_surf
     9. msm7630_fusion
     10. msm7630_surf
     11. msm8660_csfb
     12. msm8660_surf
     13. sample_addon
     14. sdk
     15. sim
You can also type the name of a product if you know it.
Which product would you like? [msm7627_surf] 8


Variant choices are:
     1. user
     2. userdebug
     3. eng
Which would you like? [eng] 3

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.4
TARGET_PRODUCT=msm7627_surf
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=debug
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GINGERBREAD
============================================

3. mmm 빌드할려는 package의 주소
userId@build1:~/svn/export_20110705/trunk/Android$ mmm /package/apps/AAAA   엔터

4. 빌드가 되면 아래와 같이 부분빌드된 apk의 주소가 나옵니다.
out/debug/target/product/msm7627_surf/system/app/AAAA.apk)

5. adb를 이용하여 이전의 소스를 삭제하고 push를 이용하여 넣습니다.
adb push out/debug/target/product/msm7627_surf/system/app/AAAA.apk

6. adb reboot 꼭 해야함.

끝~


Posted by 컴투

안드로이드에서 사용할 수 있는 permission 종류

<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>
<uses-permission android:name="android.permission.BIND_APPWIDGET"/>
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/>
<uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
<uses-permission android:name="android.permission.BIND_WALLPAPER"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BRICK"/>
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/>
<uses-permission android:name="android.permission.BROADCAST_SMS"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.DIAGNOSTIC"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.DUMP"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.FACTORY_TEST"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.FORCE_BACK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.GLOBAL_SEARCH"/>
<uses-permission android:name="android.permission.HARDWARE_TEST"/>
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_APP_TOKENS"/>
<uses-permission android:name="android.permission.MASTER_CLEAR"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.READ_INPUT_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/>
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
<uses-permission android:name="android.permission.SET_DEBUG_APP"/>
<uses-permission android:name="android.permission.SET_ORIENTATION"/>
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
<uses-permission android:name="android.permission.SET_PROCESS_LIMIT"/>
<uses-permission android:name="android.permission.SET_TIME"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_GSERVICES"/>
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.WRITE_OWNER_DATA"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>

Posted by 컴투
커티(Qwerty) 자판이 달려있는 폰 개발을 하는 과정에서

Home key, EndCall Key, Back key, Sym key를 제한하게 되었다

1. key 이벤트를 사용하는 경우에는 아래의 메소드를 Override해서 사용해서 제한하면 되는데,
 Back key를 제한하기 위해서 사용하는 방법으로 onBackPressed()를 사용하거나 혹은
dispatchKeyEvent에서 사용을 제한하면 된다.

1).
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
    Log.d("ramses8", "dispatchKeyEvent");
    return super.dispatchKeyEvent(event);
}

2).
@Override
public void onBackPressed()
{

  super
.onBackPressed();

  Log.d(
"ramses8", "onBackPressed");
}
3).
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    Log.d("ramses8", "onKeyDown");
   
return super.onKeyDown(keyCode, event);
}

2. Home Key, Back Key의 경우에는

\frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java

클래스 내에 아래의 Method부분에서 수정을 해주면 된다.

public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down,
            int repeatCount, int flags)

public int interceptKeyTq(RawInputEvent event, boolean screenIsOn)


3. 커티자판이 있는 폰의 Sym key 키를 제한하는 경우에는
frameworks\base\core\java\android\view\inputmethod\InputMethodManager.java

아래의 showInputMethodPicker(); 부분이 실행되지 않도록 막아준다.

그리고 dispatchKeyEvent(KeyEvent event)를 @Override해서 내용에 실행하고자 하는 이벤트를 넣어준다.

나의 경우에는 현재 실행되고 있는 Activity가 내가 keyEvent 제한을 줄려고 하는 Activity와 동일한지 비교하여
사용을 제한하였다...Activity비교 코드는 생략....

/**
     * @hide
     */
    public void dispatchKeyEvent(Context context, int seq, KeyEvent key,
            IInputMethodCallback callback) {
        synchronized (mH) {
            if (DEBUG) Log.d(TAG, "dispatchKeyEvent");
   
            if (mCurMethod == null) {
                try {
                    callback.finishedEvent(seq, false);
                } catch (RemoteException e) {
                }
                return;
            }
   
            if (key.getAction() == KeyEvent.ACTION_DOWN
                    && key.getKeyCode() == KeyEvent.KEYCODE_SYM) {
                showInputMethodPicker();
                try {
                    callback.finishedEvent(seq, true);
                } catch (RemoteException e) {
                }
                return;
            }
            try {
                if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod);
                mCurMethod.dispatchKeyEvent(seq, key, callback);
            } catch (RemoteException e) {
                Log.w(TAG, "IME died: " + mCurId + " dropping: " + key, e);
                try {
                    callback.finishedEvent(seq, false);
                } catch (RemoteException ex) {
                }
            }
        }
Posted by 컴투
Unlocking Android에 나와 있는 코드를 이용하여 아래와 같이 만들어 사용하였다..
코드가 길지 않기 때문에 주석은 생략...

----- 변수 선언 ------
    private final String mPath = "/mnt/sdcard";    //SD카드 기본경로
    private final String mNewFolder = "test_folder";    //폴더이름
    private File mFile = null;
    private String mFilePath = null;
    private byte[] mTestFile = "1234".getBytes();
    private static String mFileName = System.currentTimeMillis() + ".txt";
----- 변수 선언 ------

1. 파일 생성
private boolean createFileFolder()
    {
        File fileDir = new File( mPath );
        try
        {
            if( fileDir.exists() && fileDir.canWrite() )
            {
                mFilePath = fileDir.getAbsolutePath() + "/" + mNewFolder;
                Log.e( "getAbsolutePath()", "getAbsolutePath() = "  + fileDir.getAbsolutePath() );
                File newFolder = new File( mFilePath );
                newFolder.mkdir();
                if( newFolder.exists() && newFolder.canWrite() )
                {
                    mFile = new File( newFolder.getAbsolutePath() + "/" + mFileName );
                    if( true == mFile.exists() )
                    {
                        mFile.delete();
                        if( DEBUG )
                            Log.d( LOG, "FILE EXIST" );
                    }
                    mFile.createNewFile();
                }
                else
                {
                    return false;
                }
            }
        }
        catch( Exception e )
        {
            return false;
        }
        return true;
    }
    
// 파일 쓰기
    private boolean writeFile()
    {
        byte[] fileContent = "1234".getBytes();
        FileOutputStream fos = null;
       
        try
        {
            fos = new FileOutputStream( mFile );
            fos.write( fileContent );
            fos.close();
            fos = null;
            mIsWrite = true;
            mSdWrite.setText( R.string.sd_write_ok );
            if( DEBUG )
                Log.d( LOG, "MEDIA_WROTE" );
        }
        catch( Exception e )
        {
            if( fos != null )
            {
                try
                {
                    fos.close();
                }
                catch( IOException e1 )
                {
                    e1.printStackTrace();
                }
                fos = null;
            }
            mIsWrite = false;
            mSdWrite.setText( R.string.sd_write_fail );
            e.printStackTrace();
            return false;
        }
        return true;
    }
    
// 파일 읽기
    private boolean readFile()
    {
        FileInputStream fis = null;
       
        try
        {
            fis = new FileInputStream( mFile );
            fis.read( mTestFile );
            fis.close();
            fis = null;
            mIsRead = true;
            mSdRead.setText( R.string.sd_read_ok );
            if( DEBUG )
                Log.d( LOG, "MEDIA_READ" );
           
            mFile.delete();
           
            if( DEBUG )
                Log.d( LOG, "MEDIA_DELETED" );
        }
        catch( Exception e )
        {
            if( fis != null )
            {
                try
                {
                    fis.close();
                }
                catch( IOException e1 )
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                fis = null;
            }
            mIsRead = true;
            mSdRead.setText( R.string.sd_read_fail );
           
            return false;
        }
        return true;
    }
Posted by 컴투

sdcard 파일 입출력

참조(공식 안드로이드 개발 사이트): http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

1. sdcard 에 접근하기 위해 manifest 파일에 permission 을 추가해 준다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. sdcard 가 마운트 되었는지 또는 쓰기 가능한지 등의 상태를 확인한다.
String state = Environment.getExternalStorageState()
 - state 가 Environment.MEDIA_MOUNTED 이면 마운트되어 있고 쓰기 가능하다.
 - state 가 MEDIA_MOUNTED_READ_ONLY 이면 마운트되어 있고 읽기만 가능하다.
 - 그외 는 sdcard 에 접근 할 수 없는 경우다.

3. . sdcard 의 File 객체를 받는다.
API level 7 까지는 Environment.getExternalStorageDirectory() 를 사용한다.
API level 8 부터는 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 를 사용할 수 있다.
예) File path = Environment.getExternalStorageDirectory();

4. File 객체를 만든다.
위에서 받은 File 객체를 path 로 넣어준다.
예) File file = new File(path, "filename");

5. 파일을 조작한다.
 - 바이너리 파일 입출력은 FileInputStream/FileOutputStream 클래스를 이용한다.
 - 텍스트 파일 입출력은 BufferedReader/BufferedWriter 클래스를 이용한다.

#) getExternalStorageDirectory 함수를 사용하지 않고 "/sdcard/filename" 등의 경로를 File 생성자에 직접 넣어주면 IllegalArgumentException (예 'File /sdcard/filename contains a path separator') 이 발생한다
Posted by 컴투
작업중에 Home Key와 종료 Key를 제한해야하는 일이 있어서
찾고 있는데 잘 보이지가 않는다. 예전에 L사에 파견갔을데 홈키사용을 제한시켰는데 어디였었는지 잊어버렸다 ㅠㅠ
어째든 다시 찾아보니

frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java

키와 관련된 내용이 들어있다 계속 찾아봐야지...

bionic

 

- BSD libc 개선 (bionic libc)

bootable

 

bootloader & disk installer

build

 

1. Android Build script & linker directive

    (core/prelink-linux-arm.map)

   - .so file 어떻게 구성하는지

   - android application 동작할 사용되는 각종 library(.so)들이 로딩되는

번지를 미리 지정한 파일 

   - 이유: shared library static library처럼 쓰기 위한 것 로딩속도를 빠르게 하기 위함       

    참고) dll start address 없다

            static으로 하면 빠르다.

   kissuu) android 이유없이 죽을때가 있음.

      --> map file 상의 size를 넘어갔을경우     

                        

  2. generic board 대한 configuration

    (1) build/target/board/generic/AndroidBoard.mk

    - root filesystem 구성을 어떻게 해야하는가?? 대한 directive 파일

    - android 최종 결과물 구성서 자동으로 포함하고 싶은 binary들에 대한 install등을 결정

    - custom init.rc 혹은 init.%hardware%.rc 파일들의 install

 

    (2) build/target/board/generic/BoardConfig.mk

    - Android의 Makefile에 기본적으로 포함되는 최상위 Makefile

    - 주로 HAL enable/disable 관련이 깊음

    - Android.mk 파일에 영향을 주고 Android.mk 파일에서 define 제어할 있도록 설정하는 파일

   (ex> 

    ▪ BoardConfig.mk 의 BOARD_USES_GENERIC_AUDIO := true

    ▪ frameworks/base/libs/audioflinger/Android.mk 

            ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

              LOCAL_CFLAGS += -DGENERIC_AUDIO

            endif

    ▪ frameworks/base/libs/audioflinger/AudioHardwareInterface.cpp

            #ifdef GENERIC_AUDIO

                hw = new AudioHardwareGeneric();

            #else

cts

 

   - Compatability Test Suite 약자

  Android platform development kit JAVA 호환성 테스트

dalvik

 

   - dalvik vm source

development

 

- 개발시 필요한 utility & app

external

 

- Android 고유 library 아닌 linux혹은 기존에 작성된 라이브러리/binary들의 소스를 넣어놓은 디렉토리

- 여기서 작성된 library shared library(.so) binary들은 모두 system/lib, system/bin 각각 install

- framework test app/lib 여기에 작업

frameworks

 

 /policies

- PhoneWindowManager 소스가 들어있음

- Android 전체 시스템을 background에서 제어하는 최상위 application인 PhoneWindowManager

- PhoneWindowManager KeyGuard관련 화면 전체 제어(ex> rotation) event관리

(ex> home key관련)

    /base

- Android Framework source

/libs: Android base library(C++서부터)

   /audioflinger   : Android audio service & HAL source

   /surfaceflinger : Android video service & HAL

   /ui            

    Application Framework에서 JNI를 통해서 호출되는 Android framework client  part

    HAL(Input device 경우)  - EventHub.cpp

   /utils

    wrapping class, 압축관련 유틸리티등...

   /binder 

    Android Binder & Anonymous shared memory

/cmds

   binder관련인 service manager소스와 여러가지 command

/media

   media관련 client & service library

 

hardware

 

 HAL source & include

 일반적으로 android에서 사용하는 hardware관련 소스들을 포함

 반드시 디렉토리에만 위치하는 것은 아니다

 (vendor 디렉토리에 존재하는 경우도 많음)

 

   - libhardware

   board hardware dependcy 높은 하드웨어 모듈 들

   일반적으로 안드로이드 폰에 탑재가 되지 않고, cpu 혹은

   제조사의 모듈에 dependent 한 부분들

   안드로이드 소스를 이용해서 컴파일 하지 않는 경우가 많고

   모듈단위로 직접 컴파일 해서 안드로이드 root fs

   install하는 경우가 많다.

   

   - libhardware_legacy

   일반적으로 안드로이드 폰에 거의 반드시 있어야 하는

   hardware 모듈, 안드로이드 컴파일시 같이 컴파일 된다.

   - wifi/wifi.c

 

out

 

android compile 결과물 디렉토리

packages

 

  android 기본 application source

  주의해야할 점은 모든 app가 컴파일 되지는 않는다.

  모든 app 컴파일 되기 위해서는

  board관련 디렉토리의 Android 기본 board mk 파일을

  수정해야한다.

  ex> build/target/product/generic.mk

                           generic_with_google.mk

                          

 vi ntc100.mk

 =========================================================

 $(call inherit-product, build/target/product/generic.mk)

 PRODUCT_MANUFACTURER := aesop

 PRODUCT_NAME := ntc100

 PRODUCT_DEVICE := ntc100

 PRODUCT_BOARD := ntc100

 =========================================================

prebuilt

 

toolchain & 필요한 binary

system (read-only)

 

android 기본 binary 소스(ex> init)

 /core/init :  android init source

 /core/vold :  external storage 제어 모듈 

     Android 2.1까지

     vold.conf 파일 참조

 /vold      : vold2, android 2.2서부터 사용    

         vold.fstab

vendor

vendor specific code

  ex> HAL

  ex> product list관리

 

출처 : http://kissuu.egloos.com/3859448

Posted by 컴투

 eclipse.ini 파일에서 -XX:+AggressiveOpts 내용을 삭제.
Posted by 컴투
안드로이드용 프로그램을 개발해보려고 인터넷을 뒤지다 보니 필요한 정보들이 Android Developers 사이트에 잘 정리되어 있었다. 문제는 모두 영어여서 그 많은 내용을 다 읽기가 쉽지가 않다는 것이다.

백문이 불여일견이어서, 실제로 간단한 프로그램이라도 해보면서 공부를 해보는 것이 좋을 것 같아 개발환경을 설치할려고 하니, 그것도 쉬운 것은 아니었다.
그래서 실제 해본 내용을 정리해 보았다.

1. 우분투 설치: http://www.ubuntu.com/ 가서 Desktop을 다운 받아 설치한다.

2. Eclipse 설치: 우분투 설치 후 Ubuntu Software Center에서 Eclipse를 선택하여 설치한다.
    Eclipse는 Visual Studio와 같은 개발 IDE이다.

   Linux용으로 다운 받은 후 개인 home 폴더 밑에 바로 설치하면 됨
   ~/.bashrc 화일을 열어서 export PATH=${PATH}:~/android-sdk-linux_86/tools 라인을 맨마지막에 추가

4. ADT (Android Development Tools) 설치: Eclipse에 안드로이드 개발환경을 추가하기 위한 작업
    eclipse에서 Help 메뉴 밑의 install new software을 실행
    설치가 안되는 문제 발생시 여기 가면 해결책 있음 http://miraclekim.tistory.com/11
    
   * 다음과 같은 에러가 발생하면서 설치가 안될 때
     An error occurred while installing the items
     session context was:(profile=PlatformProfile,
     phase=org.eclipse.equinox.internal.provisional.p2.engine.phases.Install,
     operand=null --> [R]org.eclipse.ant.ui 3.4.1.v20090901_r351,
     action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.InstallBundleAction).
     The artifact file for osgi.bundle,org.eclipse.ant.ui,
     3.4.1.v20090901_r351 was not found.
     -> 해결책: Go to System -> Administration -> Synaptic Package Manager and search for "eclipse"
                     Then mark "eclipse" for install

5. SDK Components 추가: 설치한 Android SDK중에서 필요한 SDK와 Emulator만 Ubuntu에 추가하는 것
    터미널에서 android를 친 후 Available Packages에서 필요한 것 선택

6. AVD (Android Virtual Devices) 생성하기: 추가된 Emulator, 즉 가상의 안드로이드 폰을 생성하는것
    터미널에서 "android list targets"한 후 target id를 기억하고,
    "android create avd --target 2 --name my_avd1.5"와 같이 명령을 내림
    또는 터미널에서 android를 친 후 아래 그림과 같이 Virtual Devices에서 New..를 하여 생성할 후 있음

7. Eclipse에서 Project 생성 ...
    http://developer.android.com/resources/index.html 여기 있는 튜토리얼 보면서 따라하기.

-------

다 설치하고 보니 다음 사이트에 나름 정리가 잘 되있었다. 항상 Search하자...쩝

[출처]http://csworker.blogspot.com
Posted by 컴투

  1. Eclipse 설치

1.1. 설치 및 제거

    + sudo apt-get install eclipse

    + sudo apt-get remove eclipse

   또는

1.2. android SDK 컴포넌트 추가

          +Link : http://developer.android.com/sdk/adding-components.html

  + ~/.bashrc 화일을 열어서 자신이 SDK를 위치한 패스로 다음을 설정
       export PATH=${PATH}:~/android-sdk-linux_86/tools

  + eclipse의 Window > Perference > Android > SDK 가 설치된 폴더 path를 설정

  + eclipse의 Window > Android SDK and ADV Manager > Available Package > 설치

    1.3. Android Devleopment Tools 추가

   + Downloading the ADT Plugin

     : Eclipse 3.5

      a. Start Eclipse -> Help > Install New Software

            b. In the Available Software dialog, click ADD

             : https://dl-ssl.google.com/android/eclipse/

         + ADT 설치시 아래의 에러 발생 시에는 eclipse 설치가 잘못되었을듯? 다운로드로 설치 필요

            : http://www.eclipse.org/downloads/

Cannot complete the install because one or more required items could not be found.

Software being installed: Android Development Tools 0.9.6.v201002051504-24846    (com.android.ide.eclipse.adt.feature.group 0.9.6.v201002051504-24846)

Missing requirement: Android Development Tools 0.9.6.v201002051504-24846 (com.android.ide.eclipse.adt.feature.group 0.9.6.v201002051504-24846) requires 'org.eclipse.wst.xml.core 0.0.0' but it could not be fou

 

2. Android SRC download  [http://source.android.com/source/git-repo.html]

2.1. Required package 설치 (http://source.android.com/download/using-repo)

- Git 1.5.4 or newer and the GNU Privacy Guard.

- flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.

$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

*여기서 java관련  install은 시넵틱 패키지로 하는 것 강추!

$sudo apt-get install valgrind 

자바 1.5 설치하기
안드로이드는 아직 자바 1.6을 지원하지 않는다. 그래서 1.5 를 설치해야 하는데 문제는 우분투 9.10 에서는 자바 1.5 를 apt-get 으로 설치할수 없다는 것이다.
그래서 아래와 같은 방법이 필요하다.
 
시스템>관리>소프트웨어 소스를 선택하면 [소프트웨어 소스] 창이 뜬다.

여기서 기타 소프트웨어 탭에서 아래 와 같이 추가해 주자.\

deb http://kr.archive.ubuntu.com/ubuntu/ jaunty multiverse

deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

Reference : http://blog.naver.com/minsoub?Redirect=Log&logNo=60104054113


Ubuntu 8.10 이하의 버전이라면 JDK5가 default로 설치되어 있겠지만, 그 이상의 경우 JDK6가 설치되어 버린다. apt-get으로 java1.5를 인스톨 하기 위해서는 먼저, source.list를 수정할 필요가 있다.

 

/etc/apt/source.list 를 열어 파일의 마지막에 다음의 행을 추가한다.

deb http://ko.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://ko.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

 

apt-get으로 java1.5를 인스톨하고, 심볼릭 링크를 JDK5로 바꿔 놓는다.

$ sudo apt-get install sun-java5-jdk

$ sudo update-java-alternatives -s java-1.5.0-sun

$ java -version
java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02)
Java HotSpot(TM) Server VM (build 1.5.0_19-b02, mixed mode)

* link : http://blog.daum.net/r_p_feynman/16133211

2.2. Repo설치 (* 중요! root 권한으로 진행하자 - sudo passwd root )

2.2.1. Make sure you have a ~/bin directory in your home directory, and check to be sure that this bin directory is in your path:
  $ cd

            $ mkdir bin

  $ echo $PATH

  $ sudo apt-get install curl

2.2.2.  Download the repo script and make sure it is excutable:

        $ curl https://android.git.kernel.org/repo >~/bin/repo

  $ chmod a+x ~/bin/repo

  $ mkdir "사용할_android_디렉토리"  

  $ cd "사용할_android_디렉토리"

        $ repo init -u git://android.git.kernel.org/platform/manifest.git

        > 보통 여기서 에러가 나온다면 2.1.의 required package가 정확히 설치 되지 않았을 가능성이 높다.

        설치 후에는 해당 디렉토리에 저장소 정보가 포함된다.

      2.2.3. 소스가져오기

        $ repo sync

  • Ubuntu 10.4로 다운로드 받으면서 문제 발생 초기의 git-core등의 기본 설치 프로그램들이 설치되지 않아

    폴더를 찾지 못하는 에러가 발생 

    => $sudo apt-get upgrade

    => $sudo apt-get update

 

Posted by 컴투
안드로이드는 다양한 화면 크기를 가지고 있는 스마트폰을 제공하고 있습니다. 그래서 안드로이드 UI에 대해서 간단히 정리를 해 봅니다. 안드로이드폰을 회전 하였을 경우의 처리는 다음 기회에 올리 겠습니다.

Android UI

 용어 정의

density
  • 밀도 (density)
  • 물리적인 길이 안에 포함된 픽셀(px)의 수
  • dpi : density per inch
  • QVGA : 120 dpi, HTC Tatii
  • HVGA : 160 dpi, 안드로원, HTC G1
  • WVGA : 240 dpi, 넥서스원, 갤럭시A, 갤럭시S, 베가, 시리우스, 이자르
  • FWVGA : 240 dpi, 모토로이, 드로이드
  • Google Android에서의 dpi
  • ldpi : Low density, 120 dpi
  • mdpi : Midium density, 160 dpi
  • hdpi : High density, 240 dpi (이미지 작성시 기준)
dip
  • Density-independent pixel
  • 160 pixels을 기본 밀도(160 dip)로 하여 작성된 밀도에 독립적인 가상의 단위
  • pixels = dips * (density / 160)
  • dips = pixels * 160 / density
  • density로는 Android의 dpi를 사용할 것
Resolution
  • 해상도, 화면의 전체 픽셀 수
  • 예) 240 * 320

 화면 크기

  • Screen Size 구하기
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int pxWidth  = displayMetrics.widthPixels;
int pxHeight = displayMetrics.heightPixels;

//--- displayMetrics.density : density / 160, 0.75 (ldpi), 1.0 (mdpi), 1.5 (hdpi)
int dipWidth  = displayMetrics.widthPixels  / displayMetrics.density;
int dipHeight = displayMetrics.heightPixels / displayMetrics.density;
  • Activity에서 화면 크기 구하는 방법
    	StringBuffer buf = null;
    	WindowManager wm = null;
    	Display display = null;
    	DisplayMetrics metrics = null;
    	
    	wm = getWindowManager();
    	display = wm.getDefaultDisplay();
    	metrics = new DisplayMetrics();
    	display.getMetrics(metrics);
    	
    	buf = new StringBuffer();
    	buf.append("Window display id: " + display.getDisplayId() + "\n");
    	buf.append("Window orientation: " + display.getOrientation() + "\n");
    	buf.append("Window width: " + display.getWidth() + "\n");
    	buf.append("Window height: " + display.getHeight() + "\n");
    	buf.append("Window pixel format: " + display.getPixelFormat() + "\n");
    	buf.append("Window refresh rate: " + display.getRefreshRate() + "\n");
    	buf.append("Window width pixels: " + metrics.widthPixels + "\n");
    	buf.append("Window height pixels: " + metrics.heightPixels + "\n");
    	testMsg.setText(buf.toString());
  • 갤럭시S의 화면 크기
  • 세로 화면 크기
Window display id: 0
Window orientation: 0
Window width: 320
Window height: 533
Window pixel format: 5
Window refresh rate: 68.0
Window width pixels: 320
Window height pixels: 533
  • 가로 화면 크기
Window display id: 0
Window orientation: 1
Window width: 533
Window height: 320
Window pixel format: 5
Window refresh rate: 68.0
Window width pixels: 533
Window height pixels: 320

 Resource

  • /res/layout/
  • layout-small, layout-large
  • /res/drawable/
  • drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-nodpi
  • Dimensions
  • /res/values/dimensions.xml
<resources>
    <dimen name="size">10dip</dimen>
</resources>

int size = getResources().getDimensionPixelSize(R.dimen.length);

 화면 회전

  • 회전 상태 확인
  • Android 2.1
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

//--- orientation : 0. 세로, 1. 가로
int orientation = display.getOrientation();
  • Android 2.2
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

//--- Surface.ROTATION_0   : 세로
//--- Surface.ROTATION_90  : 가로
//--- Surface.ROTATION_180 : 세로
//--- Surface.ROTATION_270 : 가로
int rotation = display.getRotation();
  • 화면 회전 금지
  • AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다.
android:screenOrientation="portrait"       //--- 세로 고정
android:screenOrientation="landscape"      //--- 가로 고정
  • 참고 문헌

*** 참고 문헌 ***
출처 : http://www.jopenbusiness.com/tc/oss/entry/Android-UI
Posted by 컴투