2011년 3월 27일 일요일

노래방 번호 검색 App

https://market.android.com/details?id=com.jinsungyun.songapp&feature=search_result


 


설명

책 없이 노래방 번호를 검색합니다.(wifi or 3G)
태진노래방이 기준이고, 금영선택시 금영노래검색 가능합니다.
JPOP 검색은 한글 독음 과 일어 둘다 검색가능합니다
검색 시 wifi or 3G 를 사용합니다.
에러나 추가하고싶은 기능 있을시 메일 주시면, 업데이트 하겠습니다.
감사합니다.
애플리케이션 캡쳐화면

2011년 3월 23일 수요일

Android app Market 등록(2. Market 등록)

1. 안드로이드마켓 개발자 사이트 접속


2. Upload Application 버튼을 클릭한다.


3. 업로드할 앱의 정보를 입력한다.


  Draft applicaion .apk file : 업로드할 앱의 파일을 선택한다.
  ScreenShots : 앱의 화면이미지를 선택한다.
  High Resolution Application Icon : 앱의 아이콘을 선택한다.

  

    Language :  언어정보선택
    Title :  앱의 명칭입력
    Description : 설명입력
    
   
    
    Publishing options
       Copy Protection :  복사 보호 여부
       Content Rating  :  사용자 등급
       Locations : 지역선택
   
    Publish 버튼을 누루면 안드로이드마켓 등록 완료
(출처:androidside)

Android app Market 등록(1. cmd 에서 app 서명하기)

1.path확인
   - 인증에 사용되는 툴인 keytool.exe  와 jarsigner.exe 파일이 존재하는  JDK가 설치된 하위폴더 bin 이 path 설정이 되어 있는지 확인한다.  
   - path설정이 되어있지 않다면  path를 설정한다.

2. 이클립스 작업폴더 하위에 폴더생성
   workspace/keytools 폴더생성
   workspace/keytoos/keys 폴더생성

3. keytool.exe 사용  ( keytool : 열쇠와 증명서를 관리하기 위한 유틸리티 )
   - cmd 창에서 workspace/keytools폴더로 이동
   - 아래명령어 입력
   keytool -genkey -alias anddev.keystore -keyalg RSA -validity 20000 -keystore keys/anddev.keystore
   
   - 명령어 수행후 암호, 이름,성, 조직단위, 조직이름, 구군시, 시도, 국가코드를 입력
   - workspace/keytoos/keys 폴더에 anddev.keystore 파일생성

4. 애플리케이션 패키지 생성
   - 업로드하려는 애플리케이션 프로젝트 이름에서 마우스 오른쪽버튼을 클릭후  
   Android Tools->Export Unsigned Application Package를 선택한다.
  

       - 조금전에 생성한 workspace/keytools 폴더에 저장
       - workspace/keytools폴더에서 생성된 .apk파일 확인

 5. jarsigner.exe 사용 ( jarsigner :JAR 서명 및 검증 툴)
    - workspace/keytools폴더 cmd 창에서 아래명령어 입력    

  jarsigner -verbose -keystore keys/anddev.keystore -signedjar appname_signed.apk  appname.apk  anddev.keystore

     appname.apk  :  사용자가 만든 애플리케이션명

 *  최종적으로 appname_signed.apk파일이 생성되면 애플리케이션 업로드 가능한 인증완료
(출처 : androidside)

Android app Market 등록(1. Eclipse 에서 app 서명하기)

마켓에 업로드 할 어플리케이션의 메니페스트 파일을 연 후, Manifest 탭의 하단을 보면 아래와 같이 Export 메뉴가 보입니다.

두 가지 방법이 있는데, 하나는 APK파일 생성과 서명을 동시에 하는 것, 하나는 APK파일로만 생성하는 것입니다. 특별한 경우가 아니라면 동시에 해주는거 편하겠죠? Use the Export Wizard를 클릭합니다.

Export  Android Application 창이 뜹니다. 여기에서는 apk파일로 내보내기를 수행할 프로젝트를 선택해주면 됩니다.
Next를 눌러 다음 과정으로 넘어갑니다.


어플리케이션 배포를 처음으로 하는 것이라면, 아직 keystore가 없을 겁니다. keystore가 있어야만 어플리케이션 서명도 할 수 있고, 구글맵 API Key도 받을 수 있습니다. (에뮬레이터에서 테스트할 때는 debug keystore로 API키를 받아서 구글맵을 사용할 수 있었지만, 실제 기기에 올릴 때는 debug keystore로 받은 API Key를 사용하면 로드가 제대로 되지 않습니다.)

Location 옆의 Browse...를 눌러 새로 만들 keystore가 저장될 위치를 선택합니다.

keystore의 경로 및 이름을 지정합니다.

keystore의 위치 및 이름을 지정했으면, keystore의 비밀번호를 입력한 후, Next 버튼을 눌러줍니다.


Alias(이름) 및 비밀번호와 기본적인 정보들을 적어주면 되고, Validity(서명이 유효한 기간)은 50년으로 해줍니다. (안드로이드 마켓에 어플리케이션을 올리려면 적어도 안드로이드 마켓이 생긴 일자로부터 50년까지는 유효한 인증서로 서명이 되어야 합니다) 입력이 완료되었으면 Next버튼을 눌러 다음 과정으로 넘어갑니다.

이제 거의 다 끝났습니다 :) keystore 생성은 끝났고, 서명할(생성할) apk파일을 선택해주면 됩니다.

어디에 apk파일을 생성할 지 모두 선택이 완료되었으면, Finish버튼을 눌러 apk파일을 생성합니다.

기존의 keystore를 이용하여 서명하는 경우
기존에 생성한 keystore를 이용하여 서명하는 과정도 그리 어렵지 않습니다.

어플리케이션 서명에 사용할 ketstore를 지정한 후, 비밀번호를 입력하고 Next 버튼을 누릅니다.

alias를 확인한 후, 비밀번호를 한번 더 입력하고 Next 버튼을 눌러줍니다.

생성할 APK파일의 정보와 서명이 유효한 날짜까 표시됩니다. 잘못된 것이 없는지 확인한 후에 Finish 버튼을 누르시면 어플리케이션 서명이 완료됩니다
(출처 : androidside)

2011년 3월 13일 일요일

AndroidManifest.xml

1. AndroidManifest.xml
프로젝트폴더\ 밑에 생성되는 AndroidManifest.xml는 간단히 말해 xml 문서 형식의 어플리케이션 명세서이다.
즉, 어플리케이션이 어떤 컴포넌트(Activity, Service, Content provider 등)을 포함하는지, 그 컴포넌트들이 어떤 구성을 통해 어플리케이션을 이루는지 (ex. 어떤 activity가 디바이스의 메인메뉴에 위치할지, 다른말로 어플리케이션 Launcher가 될지 여부 등), 또는 각종 제약 등이 메니페스트에 기록된다.
안드로이드 프로젝트를 생성하면 기본 메니페스트 파일이 생성되며, 아주 간단한 어플리케이션의 경우 수정할 필요가 없을 수도 있지만, 일반적인 어플리케이션의 경우 조금~많이 수정/내용 추가를 요 할 수도 있다. 참고로 안드로이드 SDK 내부에 포함된 API Demo suite 예제의 경우 1000라인이 넘는 큰 메니페스트 파일이 재공된다.
이번 장에서는 메니페스트의 전반적인 구성을 오버뷰를 하고, 세세한 element와 attribute의 설명은 이 후 필요에 따라 그때 그때 다루려고 한다.

2.AndroidManifest.xml의 root element

AndroidManifest.xml의 root element는 manifest이다.
manifest 엘레멘트에서 가장 중요한것은 package attribute이다.
package attribute의 값으로는 어플리케이션의 base를 지정하는 Java package 이름이 온다.
manifest의 element로 한번 지정되면 이후 메니페스트 파일 내에서에서 사용되는 동 package내부의 클레스는 .ClassName의 형식으로 줄여 쓸 수 있다.

3. manifest element 내부에 사용할 수 있는 element
manifest element 내부에는 다음과 같은 child element들을 nest 시킬 수 있다. 각 element의 세세한 내용는 나중에 별도의 글에서 자세히 다룰 예정.지금으로서는 '이런 element가 있구나~' 정도만으로 넘어가자.
  • uses-permission: 어플리케이션이 정상적으로 작동하기 위해서 필요한 권한을 지정하는 element
  • permission: 어플리케이션이 제공하는 data나 logic을 사용하기 위해 다른 어플리케이션이 필요로 하는 권한
  • instrumentation: 중요한 시스템 이벤트 시 호출되는 코드를 지정 (ex. logging이나 monitoring을 위해 특정 activity를 실행시킬 때 등)
  • uses-library: 어플리케이션이 안드로이드의 어떤 라이브러리와 연결되는지 나타내는 element. (ex. mapping service 등)
  • uses-SDK (optional): 어플리케이션이 필요로 하는 최소 SDK version을 지정
  • application: 어플리케이션의 내부 구조를 명시
4. Application element의 내부
manifest에서 가장 중요한 것은 application element이다.
빈 안드로이드 프로젝트를 생성하면 일반적으로 다음과 같은 manifest가 생성된다.
일반적으로 빈 안드로이드 프로젝트를 생성하면 application element 밑에 하나의 activity element가 nest 되어있다.
android:name attribute는 activity가 구현되어 있는 class 이름, 또 android:lable은 activity의 표시 이름을 나타낸다.

intent-filter child element 는 어떤 조건하에 해당 activity가 디스플레이 되는지 나타낸다.
Stock element가 지정된 activity를 사용자가 실행 가능하도록 setup한다. (무슨 의미인지 확실하지 않음)
  • receiver element - 어플리케이션이 여러 시스템이나 다른 어플리케이션에서 보내오는 intent를 어떻게 처리할지 나타낸다. (ex. 어플리케이션 사용 중 SMS 도착 intent를 전달 받았을 때의 반응 등)  - chapter 23에서 자세히 다룸.
  • provider element - 어플리케이션이 내부/외부의 activity에게 전달할 데이터를 관리하는 content provider에 대해 정의한다.
  • services element - 어플리케이션이 제공하는 service에 대해 정의한다. - chapter 30, 31에서 자세히 다룸.
5. 호환 가능한 최소한의 SDK version
manifest element의 child element로 uses-sdk를 사용할 수 있다.
uses-sdk는 하나의 attribute, 'minSdkAttribute'를 가질 수 있으며, 이는 어플리케이션이 필요로 하는 minimum SDK version을 명시한다.
uses-sdk element가 생략되면 minSdkAttribute는 1 값을 기본으로 가진다.

1은 SDK version 1.0을 뜻하며, 2010년 1월 현재 최신 SDK인 2.1은 7의 값을 가진다.

2011년 3월 11일 금요일

안드로이드 Activity 생명주기 (Activity Life Cycle )

1. Activity의 4가지 주요 상태 (4 essential states of Activity)

Active/Running 상태
Activity A가 화면의 가장 앞(foreground)에 있어 사용자가 직접 볼 수 있고, 포커스를 가지고 있는 상태.
다시 말하자면 입/출력이 가능한 상태.

Pause 상태
Active상태의 activity A가 화면의 foreground를 새로 점유한 activity N에게 포커스를 잃었지만 아직은 A의 일부가 보이는 상태 (foreground를 획득한 activity N이 화면 전체를 사용하지 않거나, 반투명하게 구현 되어 있을 때). 

Stop 상태
Active/Pause상태의 activity A가 full-screen크기의 activity N에게 화면 foreground를 선점 당한 상태.

Killed (Dead) 상태
Activity A가 생성되지도 않았거나 생성 후 소멸된 상태.


2. Activity의 상태 변이와 callback 메소드

Activity의 상태변이도

위에서 설명한 4가지 Activity상태간 변이 시에 코드의 흐름을 나타낸 그림이다. (클릭하면 크게 보임)


참고. onRestoreInstanceState(Bundle)onSaveInstanceState(Bundle)메소드들은 life cycle 에 직접적으로 관여하는 메소드는 아니며 상황에 따라 호출이 생략될 수 있다. 다음 단락: Activity의 강제 종료와 복구에서 자세히 설명.


위의 그림에서 파란색 실선은 정상적인 Actvity의 흐름이며 붉은색 점선은 비정상적인 Activity의 흐름이다.
위 그림을 이용하면 수 많은 Activity의 상태변이 case들에서 어떤 callback들이 어떤 차례로 호출되는지 쉽게 볼 수 있다.

예를 들어, Activity가 처음 실행돼서 사용자에게 사용되다 정상 종료 된다면 다음과 같은 callback이 차례로 호출된다.



또, Running상태의 Activity A가 다른 Activity B에게 완전히 가렸다 A가 다시 foreground로 와서 사용자에게 사용되는 경우는 다음과 같은 callback이 차례로 호출된다.



마지막 예로, 화면의 일부가 가린 pause 상태의 Activity A가 system 자원(메모리)의 부족으로 system에 의해 강제로 종료 당했다가 system 자원의 여유가 생겨 다시 복구 될 때는 다음과 같은 callback이 차례로 호출된다.




Life Cycle 관련 Callback 메소드 분석

Activity의 상태변이 시 호출되는 callback들을 각각 자세히 설명하면 다음과 같다. (클릭하면 크게 보임)


한가지 중요한 것은 위의 callback을 오버라이딩 할 때는 다음과 같이 super클래스의 원래 callback을 먼저 호출하여야 한다.
protected void onPause() {
super.onPause();
...
}





3. Activity의 강제 종료와 복구

System에 의한 Activity의 강제 종료

스마트폰 플랫폼은 PC와 달리 제한된 리소스(대표적으로RAM)을 가지고 있기 때문에 여러 가지 작업을 동시에 진행할 때 리소스 부족현상에 직면할 수 있다.

이는 심각한 문제를 유발 할 수도 있는데, 한가지 예를 들어 보자. 예를 들어 사용자가 이용하고 있는 게임 어플리케이션의 Activity A가 foreground서 사용자와 interact하고 있다고 치자. 이때 전화가 걸려오면 시스템은 incoming call Activity B를 foreground에 띄워 사용자에게 전화가 왔음을 알려야 한다. 하지만 만약에 A가 시스템의 리소스를 거의 전부 점유하고 있는 상황이라면 B Activity를 띄우는 것이 불가능 할 수 있다.

스마트폰에서 게임을 하는 것 보다 전화를 받는 Task가 훨씬 중요한 것이 일반적임으로, 이 경우 디바이스의 효율적인 운영이 이뤄진다고 볼 수 없고 이는 곧 user의 불편함으로 이어진다.

그래서 안드로이드에서는 여러 개의 Activity를 운영 중 시스템 리소스가 부족하면 특정 상태에 있는 Activity를 강제로 종료 할 수 있게 디자인 되어있다. Activity의 상태에 따른 강제 종료 우선 순위는 다음과 같다.
Running 상태: 절대 강제 종료 되지 않음
Pause 상태: 강제 종료 2순위
Stop 상태: 강제 종료 1 순위

전 단락의 life cycle 관련 callback 테이블을 보면 강제 종료 칼럼에 yes라고 표기된 onPause(), onStop(), onDestroy()가 있는데 이들 callback이 호출 된 뒤에는 Activity가 언제든지 강제 종료 될 수 있다는 뜻이다.

한가지 중요한 것은 onPause() callback이 실행 중에는 Activity는 아직 Running 상태이고 onPause()가 리턴 하자마자 Activity는 Pause상태가 되기 때문에 onPause() callback은 항상 return이 보장되는 반면 나머지 2 개의 callback, onStop(), onDestroy()이 실행 될 때는 Activity는 각각 Pause상태, Stop상태이기 때문에 return이 보장되지 않는다.

이런 이유(onPause() 이후에는 Activity가 강제 종료 당할 수 있음)로 onPause() callback에서 사용자가 진행하던 작업을 저장 하는 등의 강제 종료에 대비한 작업을 해주어야 한다.



강제 종료된 Activity의 복구

강제 종료된 Activity는 가동하는데 충분한 resource가 확보되면 (예를 들면 Activity A를 강제 종료 시켰던 Activity B의 종료 등) 자동으로 복구되지만, 한가지 작업이 이루어 지지 않는다면 사용자에게 심각한 불편을 초래할 수 있다. 다음과 같은 시나리오를 가정해 보자.


위와 같은 불편을 막기 위해, 안드로이드의 Activity 클래스는 onSaveInstanceState(Bundle) 메소드와 onRestoreInstanceState(Bundle) callback 메소드를 제공한다.

우선 위의 Activity 상태변이도에서 본것과 같이,
onSaveInstanceState(Bundle)은 onPause()전에 호출되며 파라미터로 전달 받는 Bundle 인스턴스에 현재 activity의 상태를 저장하게 된다. 저장된 Bundle인스턴스는 시스템이 Activity를 자동으로 복원할 때 호출되는 onCreate(Bundle) -> onStart() -> onRestroreInstanceState(Bundle) -> onResume() callback 중 onCreate(…)onRestoreInstanceState(…) callback에 모두 파라미터로 전달 됨으로 양쪽 어디서건 사용해서 강제종료 되기 전의 상태로 Activity를 복구 시키면 된다.

한가지 참고할 사상은 onSaveInstanceState(Bundle)과 onRestroreInstanceState(Bundle)은 life cycle과 직접적으로 관련이 있는 callback이 아님으로 Activity의 상태 변화 시 항상 호출된다는 보장이 없다. 논리적으로 꼭 필요한 상황에서만 호출됨으로 Activity상태가 바뀔 때 예외 없이 호출 되어야 하는 루틴은 life cycle 관련 callback (onResume(), onPause() 등)에서 구현 하여야 한다.

예를 들면, 사용자가 Activity 를 디바이스의 BACK key 로 직접 종료하거나 Activity.finish() 메소드를 사용해 정상 종료되는 경우에는 Activity의 현 상태를 복구할 필요가 없기 때문에 onSaveInstanceState(Bundle) callback의 호출은 생략된다.
User가 계산기 어플리케이션의 Activity A를 통해 시간이 오래 걸리는 작업(예, 숫자 100개 더하기 중 50개를 더한 상황) 중에 전화가 걸려왔는데 시스템의 리소스 부족으로 incoming call Activity B를 띄울 수 없는 상황이 발생 했다고 쳐보자. 시스템은 A를 강제 종료 시켜 부족한 리소스를 확보하고 B를 사용자에게 보여줘 사용자가 전화를 받을 수 있게 한다. 전화 통화를 완료한 후 시스템은 강제종료 된 A를 자동으로 복구 했지만 사용자가 이미 수행하고 있던 작업(100개중 50를 더한 중간 결과)의 상태는 초기화 되어 버리고 사용자는 다시 처음부터 작업을 수행해야 한다.
강제종료 -> onCreate(…) -> onStart() -> onRestoreInstanceState(...) -> onResume()
onSaveInstanceState(...) -> onPause() -> onStop() -> onRestart() -> onStart() ->onResume()
onCreate(Bundle) -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()

안드로이드 Setting 응용의 항목 관련

안드로이드로 플랫폼에서 추가한 하드웨어 등의 설정을 Settings 어플에 추가하기 위해서는 어떻게 해야 할까?

당연한 말이지만 이를 위해서는 java 코드를 주로 수정해야 한다. Settings 관련 코드는 다음에 위치한다.

packages/apps/Setting/

화면 처리와 관련된 내용을 수정한다고 가정하고 Display Setting을 보면 되는데 일단 가속도계의 입력에 따른 회전을 관리하는 Orientation을 찾아 보자.  이미 안드로이드 어플리케이션을 만들어 본 경우라면 당연한 이해하겠지만 기본적으로 3개의 파일이 관련되어 있다.

packages/apps/Setting/res/values/strings.xml
packages/apps/Setting/res/xml/sound_and_display_settings.xml
src/com/android/settings/SoundAndDisplaySettings.java

순서대로 보면 다음과 같다.

Sound & Display Setting 화면에서 Orientation에 대한 것은 on/off 만을 설정하도록 checkbox 형태로 구현되어 있다. 실제 화면을 보면 "Orientation" 이란 타이틀 문자열과, 타이틀 문자열 아래에서 현재 상태에 따라 나타나는 "Switch orientation automatically when rotating phone"에 대한 문자열이 필요하다.

    <!-- Sound & display settings screen, accelerometer-based rotation check box label -->
    <string name="accelerometer_title">Orientation</string>
    <!-- Sound & display settings screen, accelerometer-based rotation summary text when check box is selected -->
    <string name="accelerometer_summary_on">Switch orientation automatically when rotating phone</string>
    <!-- Sound & display settings screen, accelerometer-based rotation summary text when check box is clear -->
    <string name="accelerometer_summary_off">Switch orientation automatically when rotating phone</string>

실제 코드를 보면 accelerometer_title과 accelerometer_summary_on, accelerometer_summary_off 를 정의하고 있다. 여기서 뒤에 2개는 같은 내용으로 되어 있는데 상태에 따라 다른 내용을 보여주고 싶으면 다르게 정의하면 된다.

일단 문자열을 정의하면 checkbox 형태를 사용하므로 이에 대한 내용을 sound_and_display_settings.xml에 정의한다.

    <PreferenceCategory
            android:title="@string/display_settings">

        <CheckBoxPreference
            android:key="accelerometer"
            android:title="@string/accelerometer_title"
            android:summaryOn="@string/accelerometer_summary_on"
            android:summaryOff="@string/accelerometer_summary_off"/>


        <ListPreference
            android:key="animations"
            android:title="@string/animations_title"
            android:persistent="false"
            android:entries="@array/animations_entries"
            android:entryValues="@array/animations_values" />

CheckBox를 위한 key 이름을 정의하고 와 title, summayOn, summeryOff에 사용할 문자열을 strings.xml에 정의한 내용으로 정의(연결)해 둔다.

실제 코드 구현은 SoundAndDisplaySettings.java에 구현되어 있다.

먼저 사용할 KEY 문자열을 정의한다. sound_and_display_settings.xml에 정의한 key 문자열과 같은 값으로 한다. 여기에서 final은 JAVA에서 주로 사용하는 것으로 문자열이 수정하지 않는 고정된 값임을 나타낸다.

    private static final String KEY_ACCELEROMETER = "accelerometer";

실제 화면 구성에서 사용할 CheckBoxPreference 클래스의 accelerometer 인스턴스를 선언한다.

    private CheckBoxPreference mVibrate;
    private CheckBoxPreference mDtmfTone;
    private CheckBoxPreference mSoundEffects;
    private CheckBoxPreference mHapticFeedback;
    private ListPreference mAnimations;
    private CheckBoxPreference mAccelerometer;

Settings 어플 화면에서 관련 설정을 보여주고, 동작하도록 하기 위해서는 OnCreate(), updateState(), OnPreferenceTreeClick() 메소드를 수정하면 된다.

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


        mAnimations = (ListPreference) findPreference(KEY_ANIMATIONS);
        mAnimations.setOnPreferenceChangeListener(this);
        mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
        mAccelerometer.setPersistent(false);

        ......

    }

당연한 얘기지만 key 값을 통해서 xml 파일로부터 필요한 리소스 정보를 참조할 수 있다.

   private void updateState(boolean force) {
          ......

        mAnimations.setValueIndex(idx);
        updateAnimationsSummary(mAnimations.getValue());
        mAccelerometer.setChecked(Settings.System.getInt(
                getContentResolver(),
                Settings.System.ACCELEROMETER_ROTATION, 0) != 0);

         ......
   } 

위의 내용을 보면 화면에 해당 값을 보여줘야 할 경우에 Settings.System.ACCELEROMETER_ROTATION 의 값을 얻어서 현재 mAccelerometer의 값을 어떤 상태로 설정할지를 결정한다.

실제 사용자가 항목을 클릭했을 때의 동작을 정의하는 것은 OnPreferenceTreeClick() 메소드에 정의한다.

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        if (preference == mSilent || preference == mVibrate) {
            setRingerMode(mSilent.isChecked(), mVibrate.isChecked());
            if (preference == mSilent) updateState(false);
        } else if (preference == mPlayMediaNotificationSounds) {
          ......
        } else if (preference == mAccelerometer) {
            Settings.System.putInt(getContentResolver(),
                    Settings.System.ACCELEROMETER_ROTATION,
                    mAccelerometer.isChecked() ? 1 : 0);

        }else if (preference == mNotificationPulse) {
         ......
    } 

여기는 반대로 현재의 상태를 확인하여 Settings.System.ACCELEROMETER_ROTATION 의 값을 변경하고 있다.

여기까지가 사용자의 입력을 받아서 화면상의 처리를 위한 코드이다.
실제 사용자의 입력은 어떻게 관리될까? 이를 위한 코드는 framework 코드를 참조해야 한다.

위에서 정의한 ACCELEROMETER_ROTATION은 다음 파일에서 정의한다.

frameworks/base/core/java/android/provider/Settings.java

        /**
         * Control whether the accelerometer will be used to change screen
         * orientation.  If 0, it will not be used unless explicitly requested
         * by the application; if 1, it will be used by default unless explicitly
         * disabled by the application.
         */
        public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";

정의된 값은 백업을 위해서 SETTINGS_TO_BACKUP 배열에 등록해 둔다. 실제 0과 1의 값이 어떤 의미인지를 설명하고 문자열로 정의해둔다.

실제 이렇게 정의된 값을 이용하는 것은 ACCELEROMETER_ROTATION은 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java에서 값을 로드해 두는데 사용한다.

설정 값에 따라 응용 방법은 다양하게 변경될 수 있다.

 다른 예로 ADB를 들 수 있다. ADB의 경우에는 ADB_ENABLED 설정을 위와 유사하게 구현할 수 있다. 실제 ADB_ENABLED가 활성화되어도 동작 시점은 USB 케이블이 연결되어 있는 경우에만 동작하여야 한다. 이를 위해서 위와는 다른 코드 구현이 필요하다.

frameworks/base/service/java/com/android/server/SystemServer.java

여기에서는 ADB를 위하여 AdbSettingsObserver 클래스를 정의해 두고 ADB_ENABLED가 설정되면 persist.service.adb.enable 이라는 SystemProperties를 설정하도록 하고 있다.

    private class AdbSettingsObserver extends ContentObserver {
        public AdbSettingsObserver() {
            super(null);
        }
        @Override
        public void onChange(boolean selfChange) {
            boolean enableAdb = (Settings.Secure.getInt(mContentResolver,
                Settings.Secure.ADB_ENABLED, 0) > 0);
            // setting this secure property will start or stop adbd
           SystemProperties.set("persist.service.adb.enable", enableAdb ? "1" : "0");        }
    }

AdbSettingsObserver 클래스의 인스턴스 run() 메소드에서 생성된다.

        // register observer to listen for settings changes
        mContentResolver.registerContentObserver(
               Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED),
               false, new AdbSettingsObserver());

 이 코드는 Setting 어플에서의 설정 변화를 감시하고 있다가, 설정이 바뀌면 바로 persist.service.adb.enable를 바꾸도록 하고 있다.

우분투 10.10(64bit)에서 안드로이드 소스(Gingerbread) 빌드하기

Gingerbread부터는 빌드환경이 64bit OS, JDK6로 변경 되었다.
(이전 버전에서는 32bit, JDK5)

Ubuntu 10.04.1부터는 기본 설정에서 apt-get으로 JDK 5와 JDK 6를 설치할 수가 없다.
이유는 apt-get repository가 없어서 이며, 아래 내용을 통해 repository에 목록 추가 및 업데이트를 하여 설치 할 수가 있다.


# 목록 추가
sudo add-apt-repository "deb http://kr.archive.ubuntu.com/ubuntu/ jaunty multiverse"
sudo add-apt-repository "deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse"

# 목록 업데이트 및 JDK 6 설치
sudo apt-get update
sudo apt-get install sun-java6-jdk

# 자바 목록 확인
sudo update-java-alternatives -l
[ 결과 ] (환경에 따라 다를 수 있음)
java-1.5.0-sun 5 /usr/lib/jvm/java-1.5.0-sun
java-6-sun 63 /usr/lib/jvm/java-6-sun

# 사용하고자 하는 자바 버전으로 변경
sudo update-java-alternatives -s java-6-sun

# 자바 버전 확인
java -version

나머지 패키지 설치 :
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

- Download the Android source(여기서는 Android 2.3인 Gingerbread 사용)

# bin 디렉터리 생성
cd ~
mkdir bin

# repo 설치
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo

# mydroid 디렉터리 생성
mkdir mydroid
cd mydroid

# repo 초기화(Gingerbread로 초기화)
~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread

# 소스 받기
~/bin/repo sync

- Buildmake

- 에뮬레이터(생성된 이미지를 사용한) 실행
# 환경변수 등록
vi ~/.bashrc
아래 경로 추가
export PATH=/home/<User ID>/mydroid/out/host/linux-x86/bin:$PATH:.
export ANDROID_PRODUCT_OUT=/home/<User ID>/mydroid/out/target/product/generic

"<User ID>"는 환경에 맞게 수정한다.

# 가상 SDCARD 생성
mksdcard 256M sdcard256M.img

생성된 SDCARD는 <User ID>디렉터리에 생성되며, mydroid 디렉터리에 이동시킨다.

# 에뮬레이터 실행
/home/<User ID>/mydroid/out/host/linux-x86/bin/emulator -sdcard /home/<User ID>/mydroid/sdcard256M.img

쇼옴드로이드/숌드로이드 설치

준비물

1. Mini Tool 홈 에디션 [PC설치]

 http://necoedit.tistory.com/attachment/cfile9.uf@181022524D23353D34C740.exe

2. 네오킴님 2.3 블랙에디션 [PC다운로드] => 지금 최신 버전은 2.9 버전 입니다. 자료실 및 댓글 참조.

 ftp://skyhwan.iptime.org/omdroid/neokim/neok_om2android_beta2_ver2_3_1gb.rar
(요건 2.3 구버전 입니다.)

3. 레스코 탐색기 <저작권 관계자료일지 몰라서 링크로 대체 합니다.> [옴니아2 설치]

http://blog.naver.com/jin5a/70076958827

 레스코 레지스트리 <저작권 관계자료일지 몰라서 링크로 대체 합니다.> [옴니아2 설치]
 
위 탐색기 링크에 포함되어 있습니다^^
 
기타 준비물
 
 USB 연결잭 SD카드
 
 
1번 준비물.. 다운 받아서 pc에 설치 
2번 준비물.. 압축 해제


쇼옴니아 커널다운받는곳- http://howto.homelinux.com/wordpress/?p=1300
 
zImage.r32.bin  이걸 다운 받아서 .. zImage 로 바꿈 (확장자 지움)
zImage 를 네오킴 2.3 버전 폴더에 덮어쓰기
o2beta 폴더에 덮어쓰기
-------------------------------------------------------------------------
 
 
설치 
 
1. 옴드로이드 동영상 설치법 - 오토포멧편 -  ->              http://cafe.naver.com/bjphone/1557387
 
2. 옴드로이드 동상 설치법 - SD카드포멧편->               http://cafe.naver.com/bjphone/1557389
zImage 이걸 액티브싱크 연결해서 \mystorage에 집어 넣고
연결 케이블을 해제, 핸드폰 탐색기로 .. 마이스토리지의 o2beta 들어가서 .. 하렛 실행
 
3. 옴드로이드 동영상 설치법 - O2beta편 -    ->               http://cafe.naver.com/bjphone/1557416
 
4. 옴드로이드 동영상 설치법 - 옴드로이드 구동편 -  ->    httpcafe.naver.com/bjphone/1557425
 
5. 옴드로이드 동영상 설치법 - 패치파일 적용편-   ->    http://cafe.naver.com/bjphone/1557431
6. 옴드로이드 동영상 설치법 - 옴드로이드 설정편- ->   http://cafe.naver.com/bjphone/1562127