지난  - Android 개발환경 설정 - 에서 이클립스와 ADT, SDK를 설치하였는데 꽤 번거로운 과정이다.

  이 번거로운 과정을 한방에 설치할 수 있는 모토로라에서 안드로이드용 개발툴인 MOTODEV Studio를 배포하고 있다. (사실 결국은 Eclipse+SDK+Plugins 이다 :)

  Eclipse를 기반으로 하고 있는 만큼 Windows, MacOSX, Linux를 모두 지원한다.

  JAVA JDK만 미리 설치해두면 된다.

  다운로드 : http://developer.motorola.com/docstools/motodevstudio/download/

 

또 한가지 문제점이 안드로이드 에뮬레이터의 속도가 너무너무너무너무 느리다는 것이다.

  현재 주로 사용하는 넷북은 물론, 애슬론 듀얼코어 2G에서도 속도가 너무 느려 테스트하는데 애로사항이 꽃피고 있다.

  에뮬레이터의 속도개선에 대해 검색하여도 뚜렷한 해결책이 보이지 않아 대안으로 android-x86을 사용하게 되었다.  사용해본 결과 “충분히 사용가능한” 속도를 낸다.
부팅시간도 오래 걸리지 않고 가장 좋은 점은 일시정지를 사용하여 추후에 부팅없이 실행할 수 있다는 점이다.

Android-x86 프로젝트에서는 Android를 x86 PC(주로 ASUS EEEPC 넷북)에 돌릴수 있게 포팅하고 있다.

현재 StableRelease는 Android 1.6(Donut)이며 2.1의 포팅을 개발중이다.

Development (2010/03)
What we are working on now
Move to Android 2.1 (eclair-x86 branch) (beyounn)
Second stable release of 1.6 (cwhuang, completed)
Adopt Google android-2.6.32 branch (cwhuang)
Port OpenGL hardware accelerator to eclair-x86 (Swan, ...)
Bluetooth support for Eclair (cwhuang)
3G support for Eclair (cwhuang)
 

설치방법:

1. 먼저, VirtualBox를 다운받아 설치한다.

다운로드 : http://www.virtualbox.org
2. Android-x86프로젝트의 ISO버전을 받아 VirtualBox에 설치한다.

다운로드: http://www.android-x86.org

VirtualBox 설정 내용 :
  일반 –> 고급 –> 전제화면/심리스 모드에서 보이기 : 체크해제

  시스템 –> 마더보드 –> 기본메모리 : 256MB 이상으로 설정한다.
                     프로세서 –> PAE/NX 사용하기 : 체크해제

  디스플레이 –> 비디오 메모리 : 8MB 이상으로 적절하게 설정

  저장소  -> SATA Controller에 Android를 설치할 디스크(200MB이상),
                     SD카드로 사용할 디스크 하나를 추가한다.
                -> IDE Controller에 CDROM을 추가하고 다운받은 ISO 지정

  오디오 컨트롤러는 Sound Blaster 16을 선택한다.


3. 홈페이지의 설명을 따라서 설치한다. 설치 후 재부팅하면 Grub 부트로더가 뜬다.

 

Debug Mode를 선택하면 콘솔 사용이 더 편해진다.

출처 : http://dmclab.hanyang.ac.kr

 

'안드로이드' 카테고리의 다른 글

안드로이드 전체 소스 코드 빌드 방법  (0) 2011.02.01
PC에 Android(x86) 설치하기  (0) 2011.02.01
MMS와 SMS Data 관리.  (0) 2011.01.31
provider  (0) 2011.01.31
안드로이드 메세지 확인 하기  (0) 2011.01.31
안드로이드용 프로그램을 개발해보려고 인터넷을 뒤지다 보니 필요한 정보들이 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하자...쩝

'리눅스' 카테고리의 다른 글

우분투에서 telnet 접속 하기  (0) 2011.02.22
ibus 한글 설치하기  (0) 2011.02.21
리눅스에서 IP확인하기  (0) 2011.02.07
Ubuntu Root 계정 PassWord 생성하기  (0) 2011.01.31
PS 명령어  (0) 2011.01.27

Q: root 아이디로 로그인이 안됩니다



원래 우분투 리눅스는 root (관리자 계정)로 로그인할 수 없습니다. 설치할 때 사용자 ID를 root 로 정하면 로그인이 아예 불가능하게 됩니다.


다음은 우분투에 root 계정과 암호를 만들어 주는 방법입니다.

프롬프트에서

sudo passwd root

라고 합니다. 주의! 위에서 "passwd"라는 문자열은 진짜 암호가 아니라 문자 그대로 입력해야 합니다.

만약 패스워드가 foo 라고 해서

sudo foo root

이렇게 하면 안됩니다. 정확히 sudo passwd root 이렇게 적어 주어야 합니다.

그러면 현재 암호를 먼저 묻습니다. 현재 로그인한 ID의 암호를 한번 입력해 주면 이제

Enter new UNIX password:

라고 나오며 root 의 암호를 2번 묻습니다. 새 암호를 만들어 적어 주면 됩니다.

그러면 이제 root 로 로그인할 수 있습니다. root 계정이 생기는 것입니다.

Ctrl+D키를 눌러, 로그아웃한 후 root 로 로그인해 봅니다.


그런데 root 의 패스워드가 짧고 간단하다면 해커들의 표적이 됩니다. 되도록 길고 복잡해야 합니다.




예전 버전과 달리, 우분투 9.04에서는 좀더 설정을 해주어야만 root로 로그인이 됩니다.

상단 메뉴에서

System / Administration / Login Window / Security 탭을 찾아간 후

"Allow local system administrator login"에 체크한 후,

로그아웃하고 root로 로그인하면 됩니다

'리눅스' 카테고리의 다른 글

우분투에서 telnet 접속 하기  (0) 2011.02.22
ibus 한글 설치하기  (0) 2011.02.21
리눅스에서 IP확인하기  (0) 2011.02.07
우분투에 안드로이드 개발환경 설정하기  (0) 2011.02.01
PS 명령어  (0) 2011.01.27
MMS와 SMS는  TelephonyProvider에서 DB로 관리를 합니다.

에서 Android\packages\providers\TelephonyProvider\src\com\android\
providers\telephony의 Manifest파일을 보시면 Provider 형식으로 sms, mms 들을 관리하는 것을 확인 하실 수 있습니다.

만약 MMS와 SMS의 Data를 불러오는 과정에서 DB로부터 Data를 못가지고 올경우
확인해볼 필요가 있습니다.

<provider>

문법:
<provider android:authorities="list"
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string" >
    . . .
</provider>
상위 엘리먼트:
<application>
하위 엘리먼트:
<meta-data> <grant-uri-permission> <path-permission />
설명:
컨텐트 프로바이더 - ContentProvider의 서브클래스 ? 를 선언한다. 그것은 애플리케이션에 의해 관리되는 데이터에 대한 구조적인 접근을 제공한다. 애플리케이션의 일부가 되는 모든 컨텐트 프로바이더는 매니페스트 파일에 있는 <provider> 엘리먼트에 의해 표시되어야 한다. 선언되지 않는 어떤 것도 시스템에서 볼 수 없으며, 그러므로 실행하지 않을 것이다(여러분 애플리케이션의 일부로써 개발하는 컨텐트 프로바이더만을 선언할 필요가 있으며, 여러분의 애플리케이션이 사용하는 다른 애플리케이션에 의해 개발되는 것들에 대해서는 선언할 필요가 없다)

안드로이드 시스템은 content: URI의 권위authority 영역으로 컨텐트 프로바이더를 구분한다. 예를 들어 다음에 나오는 URI가 ContentResolver.query()에 전달된다고 가정하자.

content://com.example.project.healthcareprovider/nurses/rn

content: 스키마scheme는 그 데이터가 컨텐트 프로바이더에 속하는 것으로 간주하며, 권위authority(com.example.project.healthcareprovider)는 특정 프로바이더를 구분한다. 그러므로 권위authority는 고유해야 한다. 일반적으로 이 예제에서처럼, 권위authority는 ContentProvider 서브클래스에 대한 전체 이름이다. URI의 경로path 영역은 특정 데이터 서브셋subset을 구분하기 위해 컨텐트 프로바이더에 의해 사용될 수도 있다. 하지만 그 경로path는 매니페스트 안에 선언되지는 않는다.

컨텐트 프로바이더 사용과 개발에 관한 정보에 대해서는 7장. “컨텐트 프로바이더”를 보라.

애트리뷰트:
android:authorities
컨텐트 프로바이더의 영역 아래에 있는 데이터를 구분하는 하나 또는 그 이상의 URI 권위authority 목록. 복수의 권위authority는 세미콜론으로 그 이름들을 구분함으로써 나열된다. 충돌을 회피하기 위해, 권위authority 이름은 Java 스타일 네이밍naming 규약을 사용해야 한다(com.example.provider.cartoonprovider와 같이). 일반적으로 그것은 ContentProvider 서브클래스의 이름이다.

디폴트는 없다. 적어도 하나의 권위authority가 지정되어야 한다.

android:enabled
컨텐트 프로바이더가 시스템에 의해 인스턴스화될 수 있는 지 여부 ? 만약 될 수 있다면 “참true” 아니라면 “거짓false” 이다. 디폴트 값은 “참true”이다.

<application> 엘리먼트는 컨텐트 프로바이더를 포함하여, 모든 애플리케이션 컴포넌트에 적용되는 그것 자신의 enabled 애트리뷰트를 가진다. 컨텐트 프로바이더가 활성화될 수 있게 하기 위해서는 <application>과 <provider> 애트리뷰트 둘 다 “참true”(디폴트로 그것들 모두가 그렇듯이)이 되어야 한다. 만약 둘 중 어느 하나가 “거짓false”이라면, 프로바이더는 비활성화된다; 그것은 인스턴스화 될 수 없다.

android:exported
컨텐트 프로바이더가 다른 애플리케이션의 컴포넌트에 의해 사용될 수 있는 지 여부 ? 만약 사용될 수 있다면 “참true” 아니라면 “거짓false”이다. 만약 “거짓false”이라면, 프로바이더는 동일 애플리케이션의 컴포넌트 또는 동일 유저user ID를 가진 애플리케이션에게만 유용하다. 디폴트 값은 “참true”이다.

여러분은 컨텐트 프로바이더를 제공할 수 있지만 여전히 퍼미션 애트리뷰트를 가지고 그것에 대한 접근을 제한할 수 있다.

android:grantUriPermissions
보통 컨텐트 프로바이더의 데이터에 접근할 수 있는 퍼미션을 가지지 않은 것이 일시적으로 readPermission, writePermission, 그리고, permission 애트리뷰트에 의해 강제된 제약을 극복하고 그 데이터 접근을 할 수 있는 퍼미션을 부여받을 수 있는 지 여부 ? 만약 퍼미션이 부여될 수 있다면 “참true” 아니라면 “거짓false”이다. “참true”이라면 컨텐트 프로바이더의 모든 데이터에 대해 퍼미션이 부여될 수 있다. “거짓false”이라면 퍼미션은 <grant-uri-permission> 서브엘리먼트 안에서 나열된 데이터 서브셋subset에 한해서만 부여될 수 있다.

퍼미션을 부여하는 것은 퍼미션에 의해 보호된 데이터에 대해 애플리케이션 컴포넌트에게 한 번의 접근을 제공하는 방법이다. 예를 들어 이메일 메시지가 첨부파일을 포함할 때, 메일 애플리케이션은 그것을 열기 위한 적절한 뷰어가 해당 컨텐트 프로바이더의 모든 데이터를 볼 수 있는 일반적인 퍼미션을 가지고 있지 않을 지라도 그 뷰어를 호출할 지 모른다.

그런 경우에, 그 컴포넌트를 활성화하는 인텐트 오브젝트 내의 FLAG_GRANT_READ_URI_PERMISSION과 FLAG_GRANT_WRITE_URI_PERMISSION 플래그에 의해 퍼미션이 부여된다. 예를 들어 메일 애플리케이션은 Context.startActivity에 전달되는 인텐트 내에 FLAG_GRANT_READ_URI_PERMISSION를 넣을 수 있다. 그 퍼미션은 인텐트에 있는 URI에 국한된다.

만약 여러분이 이 애트리뷰트를 “참true”로 설정하거나 또는 <grant-uri-permission> 서브엘리먼트를 정의함으로써 이 기능을 활성화한다면, 여러분은 부여한 URI가 프로바이더로부터 지워지게 될 때, Context.revokeUriPermission()을 호출해야 한다.

또한 <grant-uri-permission> 엘리먼트를 보라.

android:icon
컨텐트 프로바이더를 나타내는 아이콘. 이 애트리뷰트는 이미지 정의를 포함하는 드로어블drawable 리소스에 대한 레퍼런스로써 설정되어야 한다. 만약 그것이 설정되지 않으면, 전체 애플리케이션을 위해 지정된 아이콘이 대신 사용된다(<application> 엘리먼트의 icon 애트리뷰트를 보라).
android:initOrder
동일 프로세스가 보유하고 있는 다른 컨텐트 프로바이더에 상대적으로, 컨텐트 프로바이더가 인스턴스화되어야 하는 순서. 컨텐트 프로바이더들 사이에 의존성이 있을 때, 그것들 각각에 대해 이 애트리뷰트를 설정하는 것은 그 의존성이 요구되는 순서대로 그것들을 생성하는 것을 보장한다. 그 값은 간단한 정수integer 값이며, 더 높은 숫자들이 먼저 초기화된다.
android:label
컨텐트 프로바이더에 대한 사용자가 읽을 수 있는 라벨. 만약 이 애트리뷰트가 설정되지 않으면, 전체 애플리케이션에 대한 라벨 설정이 대신 사용된다 (<application> 엘리먼트의 label 애트리뷰트를 보라).

라벨은 사용자 인터페이스의 다른 문자열처럼 로컬라이즈 될 수 있도록 문자열 리소스에 대한 레퍼런스로 설정되어야 한다. 하지만 편의상 여러분이 애플리케이션을 개발하는 동안, 그것은 또한 원시 문자열로써 설정될 수 있다.

android:multiprocess
컨텐트 프로바이더의 인스턴스가 모든 클라이언트 프로세스에서 생성될 수 있는 지 여부 ? 만약 인스턴스가 여러 프로세스에서 실행될 수 있다면 “참true”, 아니라면 “거짓false”이다. 디폴트 값은 “거짓false”이다.

보통 컨텐트 프로바이더는 그것을 정의했던 애플리케이션 프로세스 안에서 인스턴스화 된다. 하지만 이 플래그가 “참true”으로 설정되면, 시스템은 그것과 상호작용하길 원하는 클라이언트가 있는 모든 프로세스 내에서 인스턴스를 생성할 수 있다. 따라서 프로세스 간 통신 오버헤드를 방지한다.

android:name
컨텐트 프로바이더, 즉 ContentProvider의 서브클래스를 구현하는 클래스의 이름. 이것은 전체 클래스 이름이어야 한다(“com.example.project.TransportationProvider” 같이). 하지만 단축형으로 이름의 첫 번째 문자가 마침표라면 그것은 <manifest> 엘리먼트에 지정된 패키지 이름뒤에 덧붙여진다.

디폴트는 없다. 이름은 반드시 지정되어야 한다.

android:permission
클라이언트가 컨텐트 프로바이더의 데이터를 읽거나 쓰기 위해 가져야 하는 퍼미션의 이름. 이 애트리뷰트는 읽기와 쓰기 모두에 대해, 하나의 퍼미션을 설정하는 편리한 방법이다. 하지만 readPermission과 writePermission 애트리뷰트가 이것보다 우선권을 갖는다. 만약 readPermission 애트리뷰트 또한 설정된다면, 그것은 컨텐트 프로바이더에 쿼리하는 것에 대한 접근을 통제한다. 그리고 만약 writePermission 애트리뷰트가 설정된다면, 그것은 프로바이더의 데이터를 수정하는 것에 대한 접근을 통제한다.

퍼미션에 관한 더 많은 정보에 대해서는, 앞에 나왔던 퍼미션 섹션과 8장. “보안과 퍼미션”을 보라.

android:process
컨텐트 프로바이더가 실행되어야 하는 프로세스 이름. 보통 애플리케이션의 모든 컴포넌트는 애플리케이션을 위해 만들어진 디폴트 프로세스에서 실행된다. 그 프로세스는 애플리케이션 패키지과 같은 이름을 가진다. <application> 엘리먼트의 프로세스 애트리뷰트는 모든 컴포넌트들을 위한 다른 디폴트를 설정할 수 있다. 그러나 각각의 컴포넌트는 그것 자신의 process 애트리뷰트를 사용해서 디폴트를 오버라이드 할 수 있으며, 이것은 여러분으로 하여금 애플리케이션을 여러 프로세스에 걸쳐 분포시키게 하는 것을 가능하게 한다.

만약 이 애트리뷰트에 할당된 이름이 콜론(“:”)으로 시작된다면, 애플리케이션에 사적인private 신규 프로세스가 필요할 때 생성되며, 액티비티는 그 프로세스에서 실행된다. 만약 프로세스 이름이 소문자로 시작하면, 액티비티는 그 이름을 가지는 글로벌 프로세스 안에서 실행될 것이며 이는 그렇게 하도록 하는 퍼미션을 가지는 경우에 가능하다. 이것은 다른 애플리케이션에 있는 컴포넌트들이 프로세스를 공유하는 것을 가능하게 하며, 리소스 사용을 감소시킨다.

android:readPermission
클라이언트가 컨텐트 프로바이더에 쿼리하기 위해 가져야 하는 퍼미션. 또한 permission 과 writePermission 애트리뷰트를 보라.
android:syncable
컨텐트 프로바이더의 제어하에 있는 데이터가 서버 상의 데이터와 동기화되어야 하는 지 여부 ? 만약 동기화되어져야 한다면 “참true” 그리고 아니면 “거짓false”이다.
android:writePermission
클라이언트가 컨텐트 프로바이더에 의해 제어되는 데이터를 변경하기 위해 가져야 하는 퍼미션. 또한 permission과 readPermission 애트리뷰트를 보라.
도입:
API 레벨 1
더 보기:
Content Providers
↑ Go to top

안드로이드에서 message 를 확인 하기 위해서 ACTION_VIEW Intent를 사용합니다.
특정 메시지의 Inbox를 확인하기 위해서는 Message conversation URI에 ID를 넣어주면 됩니다.

 //sms Inbox
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("content://mms-sms/conversations/"+messageID));
startActivity(Intent);

만약 MMS에서 Image를 실행할수 있게 하고 Video를 수행할수 없게 하고 싶다면 
Manifest.xml파일에서 해당 activity의 intent-filter에 mimeType를 추가하면 됩니다.

<data android:mimeType="audio/*" />

emulator: ERROR: bad config: virtual device directory lacks config.ini - 안드로이드 가상머신관련 오류 해결

emulator: ERROR: bad config: virtual device directory lacks config.ini

emulator: could not find virtual device named 'test_avd_1_6


 
위와 같은 오류가 발생하는 이유는컴퓨터의 사용자 이름이 한글이기 때문에 경로 인식을 못해서 오류가 발생한다.

AVD가 저장된 경로를 보면 경로를 보면 한글로 된 사용자 이름을 확인 할 수 있다.

 

커맨드 창을 띄우면 역시나 사용자 이름이 한글입니다.

 

그럼 이제 해결책을 알아 봅시다.

먼저 환경변수를 설정합니다.

path라는 값을 찾아서 아래와 같이 입력합니다

 

 

 환경변수 설정을 완료했으면 다시 커맨드 창으로 이동하여 'android list avd' 라고 입력합니다. (커맨드 창이 실행되어 있던 중이라면 종료 후 새로 시작하세요.)

아래의 사진처럼 현재 PC에 설치된 가상 머신의 종류들이 나타납니다. 설치된 가상 머신들을 파악할 수 있습니다.

 


 사진을 보면 avd Path에 한글이 포함되어 있는 것을 확인 할 수 있습니다.

한글이 없는 경로로 avd파일을 옮기는 것으로 문제를 해결 할 수 있습니다.

 

 


패키지와 어플리케이션구성요소



패키지 

パッケージ名 説明 主要クラス
android 리소스 R
android.app 어플리케이션 모델 Activity
android.content 공개데이터 액세스 ContentProvider
android.content.pm 정보 액세스 ActivityInfo
android.content.res 리소스 액세스 Resources
android.database 데이타베이스 액세스 DatabaseUtils
android.database.sqlite SQLite를 통한 데이터베이스액세스 SQLiteDatabase
android.graphics 그래픽스 Bitmap
android.graphics.drawable 그림요소 Drawable
android.graphics.drawable.shapes 쉐이프 Shape
android.hardware 하드웨어 제어 Camera
android.location 위치정보 얻어오기 Location
android.media 미디어플레이어 MediaPlayer
android.net 통신 Uri
android.net.wifi Wi-Fi WifiManager
android.opengl OpenGL의 유틸리티 GLUtils
android.os OS시스템서비스 Binder
android.preference 프리퍼런스 Preference
android.provider 컨텐츠프로바이더 액세스 BaseColumns
android.sax SAX Element
android.telephony 통화 CellLocation
android.telephony.gsm GSM통화 GsmCellLocation
android.test 테스트 AndroidTestCase
android.text 텍스트 Html
android.text.method 텍스트 키 입력 KeyListener
android.text.style 텍스트 스타일 URLSpan
android.text.util 텍스트 유틸리티 Rfc822Token
android.util 유틸리티 Log
android.view UI ViewManager
android.view.animation UI Animation Animation
android.webkit WebKit WebView
android.widget 위젯 Button



어플리케이션 구성요소

어플리케이션

구성요소

설명
액티비티
(Activity)
UI제공 및 이벤트처리등의 유저와 어플리케이션 간의 소통을 중계하는 객체
하나의 화면에 대해 하나의 액티비티가 대응함
인텐트
(Intent)
액티비티와 서비스등을 부를때 사용하는 메세지 객체

서비스

(Service)

화면표시와는 독립적으로 백그라운드에서 처리되는 오브젝트

컨텐트 프로바이더

(Content Provider)

모바일디바이스의 데이터영역에 액세스하기 위한 오브젝트



아키텍쳐요소

종별 요소 설명
어플리케이션 프레임 워크 Activity Manager 어플리케이션의 라이프사이클 관리
Content Providers 어플리케이션간의 데이터공유 관리
View System UI 관리
Notification Manager 상태표시줄의 알람표시 관리
Package Manager 인스톨 관리
Resource Manager 비 코드자원 관리
XMPP Service 메세징서비스 관리
라이브러리 Surface Manager 복수 어플리케이션간의 2D/3D그래픽을 합성하기 위한 라이브러리
Media Framework 비디오형식을 재생하고 기록하기 위한 라이브러리
SQLite 릴레이셔널 데이터베이스 라이브러리
OpenGL ES 3D그래픽 엔진
Free Type 비트맵과 벡터폰트를 렌더링하는 라이브러리
WebKit 브라우저표시를 위한 HTML렌더링엔진
SGL 2D그래픽엔진
libc 표준 C언어라이브러리
Android런타임 Core Libraries Java언어에 따른 코어라이브러리기능
Dalvik가상머신 .dex포맷의 바이트코드를 실행하기 위한 가상머신



툴 일람

ツール 説明
Android Emulator Android어플리케이션을 실행할 수 있는 에뮬레이터
Android Development Tools
Plugin for the Eclipse IDE(ADT)
Eclipse에서 Android어플리케이션을 개발하기 위한 플러그인
Dalvik Debug Monitor Service(ddms) 에뮬레이터 프로세스 관리
디버그지원
Android Debug Bridge(adb) 어플리메이션 파일(*.apk)인스톨
커맨드라인을 통한 에뮬레이터에 액세스
Android Asset Packageing Tool(aapt) Android어플리케이션의 바이너리와 리소스를 포함하는 어플레케이션 파일(*.apk)작성
Android Interface Description Language(aidl) 프로세스간 인터페이스용 코드를 작성
sqlite3 SQLite데이타 액세스
Traceview 트레이스로그 분석
mksdcard 에뮬레이터가 이용하는 외부기억카드 이미지 작성
dx Java바이트코드(*.class)를 Android바이트코드(*.dex)로 변환
activityCreator Android어플리케이션 컴파일시에 이용하는 Ant빌드파일 작성

출처 : http://amethyst.springnote.com/pages/4099753
출처 : www.kandroid.org 들풀님.


RIL 이란 무엇인가?
 
개요.
 
안드로이드 RIL은 android.telephony 서비스들과 radio h/w간의 추상화된 계층을 제공한다.
RIL은 radio agnostic(존재하지만 정확하게 표현하기는 어려운 실체)이며, GSM 기반의 radio들에 대한 지원을 포함하고 있다. 
 
아래의 그림은 안드로이드 전화통화 시스템 구조를 설명한다.
 
   
 
위의 그림에서 Radio Daemon과 Vender RIL은 파트너의 특수성을 가진 사적소유영역에 속하며, 나머지 블록은 안드로이드 영역에 속한다고 할 수 있다. 
 
RIL은 두가지의 기본적인 컴포넌트로 구성된다.
 
RIL 데몬(Daemon) : 
 
RIL 데몬은 Vender RIL을 초기화하며, 안드로이드 telephony 서비스들로부터의 모든 통신을 프로세스하며, solicited 명령어를 통해 Vender RIL로 콜을 넘긴다.
 
Vender RIL :
 
ril.h의 radio 특수성을 포함하는 Vender RIL은 radio h/w와의 모든 통신을 처리하며, unsolicited 명령어들을 통해서 RIL 데몬(rild)에 콜을 넘긴다.
 
RIL 초기화
 
안드로이드는 구동시점에 아래에 언급된 순서대로, telephony 스택과 Vender RIL 을 초기화한다.
 
1. RIL 데몬은 Vender RIL에 제공해야할 초기화 argument와 그것을 사용하기 위한 
   Vender RIL 라이브러리를 결정하기 위한 rild.lib 경로와 rild.libargs 시스템 속성들을 읽어
   들인다.
 
2. RIL 데몬은 Vender RIL 라이브러리를 load(탑재)하며, RIL을 초기화하기 위해 RIL_Init을
   호출하며, RIL 함수에 대한 참조를 얻는다.
 
3. RIL 데몬은 Vender RIL 함수들에 대한 하나의 참조를 제공하는 안드로이드 Telephony
   스택상의 RIL_register를 호출한다.
 
RIL 상호작용
 
RIL 제어 관련 통신에는 두가지 형식이 존재한다.
 
Solicited commands : Solicited 명령어들은 전화걸기(DIAL) 과 HANGUP(전화끊기)와
                                같은 RIL 라이브러리에 의해 만들어 진다.
Unsolicited responses : Unsolicited responses는 CALL_STATE_CHNGED(전화 상태
                                   변화)와 NEW_SMS(새 문자 메시지)와 같은 baseband로 부터
                                   만들어 진다.
 
Solicited
 
아래의 인용은 solicited 명령어들에 대한 인터페이스를 보여주고 있다.
 
void OnRequest (int request_id, void *data, size_t datalen, RIL_Token t);
void OnRequestComplete (RIL_Token t, RIL_Error e, void *response, size_t responselen);
 
그리고 아래와 같이 계열들로 묶여질 수 있는 60개 이상의 solicited 명령어들이 존재한다.

  • SIM PIN, IO, and IMSI/IMEI (11)
  • Call status and handling (dial, answer, mute…) (16)
  • Network status query (4)
  • Network setting (barring, forwarding, selection…) (12)
  • SMS (3)
  • PDP connection (4)
  • Power and reset (2)
  • Supplementary Services (5)
  • Vendor defined and support (4)
아래의 다이어그램은 안드로이드에서의 solicited call을 설명하고 있다.
 
  
 
Unsolicited
 
아래의 인용은 unsolicited 명령어들에 대한 인터페이스를 설명하고 있다.
 
void OnUnsolicitedResponse (int unsolResponse, void *data, size_t datalen);

그리고 아래와 같이 계열들로 묶여질 수 있는 10개 이상의 unsolicited 명령어들이 존재한다.

  • Network status changed (4)
  • New SMS notify (3)
  • New USSD notify (2)
  • Signal strength or time changed (2)
아래의 다이어그램은 안드로이드에서의 unsolicited call을 설명하고 있다.
 
  
 
RIL 구현하기
 
특정 radio RIL을 구현하기 위해서는, 라디오 요청을 처리하기 위해 안드로이드에서 요구되는 함수의 집합을 구현하는 공유 라이브러리를 만들어야 한다. 요구되는 함수들은 RIL header (/include/telephony/ril.h)에 정의된다.
 
안드로이드 radio 인터페이스는 radio-agnostic이며, Vender RIL은 radio를 통해 통신하기 위한 어떤 프로토콜도 사용할 수 있다. 안드로이드는 하나의 참조적 구현형태로써의 Vender RIL을 제공하고 있는데, 그것은 Hayes AT command 집합을 사용하고 있으며, 여러분들은 telephony 테스트를 위한 쉬운 시작과 상업적 Vender RIL 들을 위한 가이드로써 사용할 수 있다. 참조적으로 구현된 RIL 소스 코드는 /commands/reference-ril/ 에서 볼 수 있다.
 
libril-<companyname>-<RIL version>.so 규약을 사용해서 공유 라이브러리 형태로 여러분의 Vender RIL을 컴파일
해라. 여기에 예로써, libril-acme-124.so가 있다.
  • libril: 모든 vender RIL 구현은 'libril' 로 시작
  • <companyname>: 특정 회사의 약어
  • <RIL version>: RIL 버전 숫자
  • so: 파일 확장자
RIL_Init
 
여러분의 Vender RIL은 모든 radio 요청들을 처리할 함수들에 대한 제어를 제공하는 RIL_Init 함수를 정의해야 한다.
RIL_Init은 RIL을 초기화하기 위해, 부트시점에서 안드로이드 RIL Daemon에 의해 호출된다.
 
RIL_RadioFunctions *RIL_Init (RIL_Env* env, int argc, char **argv);
 
RIL_Init은 radio 함수들에 대한 제어를 포함하는 RIL_RadioFuncions 구조체를 반환해야 한다.
 
type structure {
       int RIL_version;
       RIL_RequestFunc onRequest;
       RIL_RadioStateRequest onStateRequest;      
       RIL_Supports supports;
       RIL_Cancel onCancel;
       RIL_GetVersion getVersion;

RIL_RadioFunctions;

RIL 함수들
 
ril.h는 아래의 테이블에 설명된 함수들 같은, RIL_UNSOL_STK_CALL_SETUP, RIL_SIM_READY, RIL_SIM_NOT_READY 과 같은 RIL 상태들과 변수들을 정의한다.
더 상세하게는 헤더파일(/device/incldue/telephony/ril.h)을 살펴보길.
 
RIL Solicited 명령어 요청들.
 
Vender RIL은 solicited 명령어들을 처리하기 위해 아래의 테이블에 설명된 함수들을 제공해야 한다.
RIL solicited 명령어 요청 타입들은 RIL_REQUEST_ 라는 접두사를 가지고 ril.h에 정의된다.
상세하게는 헤더 파일을 체크하길.
 
함수명 설명
void (*RIL_RequestFunc) (int request, void *data, size_t datalen, RIL_Token t); 이것은 solicited 명령어들에 대한 시작 포인트이며, RIL_REQUST_ 접두사를 가지고 ril.h에 정의된 다양한 RIL solicited 요청 타입들을 제어할 수 있어야 한다.
  • request 는 RIL_REQUEST_* 중 하나임.
  • data 는 RIL_REQUST_* 위해 정의된 data에 대한 포인터임.
  • t 는 RIL_onResponse 에 수반되는 호출에서 사용되어야 함.
  • datalen 은 caller 소유이며, callee에 의해 수정되거나 free 되어서는 안됨.
RIL_onRequestComplete()에 대한 호출을 통해 완료되어야 함.
RIL_onRequestComplete()는 임의의 쓰레드로부터 이 함수의 반환 이전 또는 이후에 호출될 수 있다. 이것은 항상 동일한 쓰레드로부터 호출될 것이며, 그러므로 여기에서 반환이라함은 radio가 다른 명령을 수행할 준비하 되어있음을 의미한다.(이전 명령이 완료여부와 상관없이)
RIL_RadioState (*RIL_RadioStateRequest)(); 이 함수는 현재의 radio 상태를 동기적으로 반환해야 한다.
int (*RIL_Supports)(int requestCode); 이 함수는 명시된 RIL_REQUEST 코드가 지원된다면 "1"을 아니라면 "0"을 반환한다.
void (*RIL_Cancel)(RIL_Token t); 이 함수는 멈춰져 있는 요청을 취소시키기 위해 사용된다. 
이 함수는 다른 쓰레드, 즉 RIL_RequestFunc 을 호출한 쓰레드가 아닌 쓰레드에 의해 호출된다. 
 
취소시, callee는 요청을 포기하기 위해 최선을 다해야하며, 잠시후 RIL_Errno CALCELLED 를 가지고 RIL_onRequestComplete를 호출한다.
 
다른 결과들을 가진 이 요청들에 대한 RIL_onRequestComplete에 대한 수반되는 호출들은 묵인되지만, 무시된다.(그것은 취소 요청을 무시하기 위해 유효한 것이다)
 
RIL_Cancel 호출들은 즉시 반환되어야 하며, 취소를 기다려서는 안된다.
const char * (*RIL_GetVersion) (void); 여러분의 Vender RIL에 대한 버젼 문자열을 반환한다.
 
Vender RIL은 안드로이드 RIL 데몬에 역으로 통신하기 위해 다음과 같은 callback 메쏘드를 사용한다.
 
함수명 설명
void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
  • t 는 이전 호출에서 RIL_Notification 루틴에 전달된 파라메터이다.
  • 만약 e != SUCCESS 라면, response 는 null 이 될것이며, 무시된다.
  • RIL_onRequestComplete 는 가능한 빨리 return 할 것이다.
void RIL_requestTimedCallback (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime); RIL_RequestFunc 이 호출된 동일한 쓰레드에서 사용자 정의의 callback 함수를 호출한다. 만약 relativeTime 이 명시되었다면, 그것은 callback이 발생해야하는 상대적인 시각을 명시한다. 만약 relativeTime 이 NULL 이거나 0 으로 채워진 구조체에 대한 포인터라면, callback은 최대한 빨리 발생한다.

 
RIL Unsolicited 명령어들
 
아래의 테이블에 열거된 함수들은 안드로이드 플랫폼에서 unsolicited 명령어들을 발생시키기 위해 Vendor RIL에 의해 사용되는 call-back 함수들이다. 자세하게는 ril.h 를 보길.
 
함수명 설명
void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, size_t datalen);
  • unsolResponse 는 RIL_UNSOL_RESPONSE_* 중 하나임.
  • data 는 RIL_UNSOL_RESPONSE_* 를 위해 정의된 data에 대한 포인터임.
  • data 는 caller 소유이며, callee 에 의해 수정되거나 free 되어서는 안됨.

 

+ Recent posts