안드로이드2016.06.08 11:57

손쉽게 drawable selector xml 파일을 만들어 주는 

안드로이드 스튜디오용 Drawable Selector plugin 입니다.


https://github.com/DrKein/DrawableSelector


Posted by Dr.Kein

댓글을 달아 주세요

  1. 잘보고갑니다~

    2018.08.04 12:58 신고 [ ADDR : EDIT/ DEL : REPLY ]

안드로이드2013.09.08 03:48

안드로이드 비크맵 캐시를 위해 많이 사용하는 LruCache.

http://developer.android.com/reference/android/support/v4/util/LruCache.html


그리고, LruCache 생성시 지정해주는 maxSize.


아는 사람은 알고, 모르는 사람은 개고생 하게 되는 maxSize의 비밀.


LruCache 를 생성할 때 지정해야 하는 maxSize 값의 이미는

얼핏 보기에 캐시될 아이템의 갯수로 느껴진다.


이는 경우에 따라 정답이기도, 아니기도 하다.


LruCache 의 sizeOf(K,V) 를 override 하지 않는다면, maxSize 는 아이템의 갯수이다.


하지만, sizeOf 를 override 하는 경우, 

sizeOf 의 return 방법에 따라, 

maxSize 는 아이템의 갯수가 될 수도 있고, 

메모리의 크기가 될 수도 있고, 또 다른 무언가가 될 수도 있다.



protected int sizeOf (K key, V value)

Returns the size of the entry for key and value in user-defined units. The default implementation returns 1 so that size is the number of entries and max size is the maximum number of entries.

An entry's size must not change while it is in the cache.

key 에 해당하는 엔트리의 사이즈를 사용자가 지정한 단위로 리턴한다. 기본으로는 엔트리의 사이즈를 1로 반환하며, 곧 캐시된 엔트리의 갯수 자체를 의미해서 max size 가 곧 최대 엔트리 갯수를 의미한다.

캐시되어 있는 동안 엔트리의 사이즈는 변하지 않는다. 



이걸 모르고

인터넷에 돌아다니는 샘플 코드를 가져다 썼는데 도무지 캐싱이 안되어서 고생 했다.


그 샘플 코드는 maxSize 가 100 이었으면서도

sizeOf 에서는 bitmap 의 byte 를 리턴하고 있었다.


당연히 아무리 작은 이미지 였음에도 100 byte를 초과하니 캐싱 자체가 될리 없었던것.




Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2012.12.17 11:53

Google Play 의 인앱 결제 시스템이 업그레이드 되었네요.


크게 반길 만한 기능은 상품정보를 곧바로 서버에서 얻어서 사용가능해진 점입니다.

상품이름, 상품설명, 가격(현지 통화에 맞춰서 자동으로)을 그때그때 얻어갈 수 있게 되었습니다.


구글마켓은 인앱 상품 가격을 수시로 변경할 수 있으니 

할인 이벤트 등에 이전보다 쉽게 대응할 수 있을것 같습니다. 


원문 : http://android-developers.blogspot.kr/2012/12/in-app-billing-version-3.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/hsDu+(Android+Developers+Blog)

Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2012.11.06 09:30

여러가지 기능이 묶여있는 앱을 우선 개발한 뒤

필요에 의해 기능별로 개별앱을 분리하는 과정이 있었다.

분리 시점에는 시간이 넉넉치 않아서 우선 리소스들을 모두 폴더째 복사해 낸 뒤

개별앱들을 만들어 내었는데,

기회가 생겨서 사용되지 않는 리소스를 정리하는 중...


13메가 정도였던 앱이 5메가 정도로 줄었다! 


용량을 절반 가까이 줄이는 성과가 있기는 하지만,

그 과정은 

리소스 하나하나 찾아가면서 사용되는 리소스인지, 아닌지 판단하고 삭제해야 하는 과정.



완전 단순 반복 노가다네.



이거 이클립스 플러그인으로 만들 수 있을것 같은 느낌..


그런데, 이런걸 필요로 하는 사람이 얼마나 있을까? 

Posted by Dr.Kein

댓글을 달아 주세요

  1. 비밀댓글입니다

    2013.08.20 16:53 [ ADDR : EDIT/ DEL : REPLY ]

안드로이드2012.08.12 13:04

에버노트는 OAuth 를 이용해서 사용자 인증을 처리 합니다.

최초 인증 정보가 없을 땐 Web 을 이용해서 사용자 로그인후 인증 정보를 돌려 받아서 사용을 하는데, 

앱을 종료 하거나 Activity 를 이동하거나 (session 인스턴스 관리방법에 따라 다름) 한 뒤에 

다시 에버노트를 접근 하려고 하면 또 Web 을 통해 인증을 해야 합니다.


보통은 한번 인증을 받으면 인증 받은 정보를 앱에 저장 해 두고 다시 사용하지요.

그런데, 에버노트 라이브러리 상에서는 이 방법이 보이지 않았습니다.


HelloEDAM 샘플 프로젝트를 참고하다 보면 중간 부분에 주석으로 된 코드가 있는데 

그 부분이 바로 재사용을 위한 방법입니다.



로컬에 저장된 인증 정보가 있다면, 해당 정보를 불러서 AuthenticationResult 인스턴스를 만들고

그 인스턴스를 이용해서 EvernoteSession 을 얻어서 사용하면 됩니다.


그런데 AuthenticationResult 를 만들 때 필요한 authToken, noteStoreUrl, webApiUrlPrefix, userId 를 얻을 방법이 없었던 겁니다.    (authToken 은 session 에서 getAuthToken() 으로 얻을 수 있긴 합니다)


현 시점에서는 에버노트 SDK 에 같이 포함된 소스 코드를 살짝 수정해서 사용하는 방법 밖에 없어 보입니다.

SDK 다운로드 : https://github.com/evernote/evernote-sdk-android 


연동하려는 프로젝트에 SDK 에 포함된 HelloEDAM 의 Libs 에 있는 라이브러리 5개 중

 - evernote-api-1.21.jar 와 evernote-client-android.jar 를 빼고 3개를 복사해서 연동 합니다.


SDK 에 포함된 소스를 프로젝트에 추가해 주세요.


그러면 개발하시는 프로젝트가 이런 모습이 될겁니다.





이제 소스에 포함된 EvernoteSession.java 클래스를 열어서 맨 아래 부분에 아래처럼 인증 결과를 리턴하는 메서드를 추가해 줍니다.

/**

* 인증 받은 정보를 리턴하는 메서드 추가.

* @return

*/

public AuthenticationResult getAuthenticationResult() {

        return authenticationResult;

}



이제 인증을 얻은 후 인증 정보를 preference 등에 기록해 두고 다음에 재사용 할 수 있게 됩니다.



한가지 마음에 걸리는 부분은 저장해둔 인증 정보를 사용해서 EvernoteSession 을 생성할 때

그 시점에 인증정보 유효성 확인이 안되고 최종적으로 노트를 생성하려고 하는 시점에 

인증정보 유효성 여부가 판단되는 점입니다.


에버노트 연동을 위한 클래스를 첨부합니다. 

참고하세요.



EvernoteAdapter.java



Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2011.03.30 10:58
원문 : http://code.google.com/intl/ko-KR/android/c2dm/

Android Cloud to Device Messaging Framework

Android Cloud to Device Messaging (C2DM) 은 개발자가 서버를 이용하여 안드로이드 디바이스들에게 메시지를 전달할 수 있도록 도와주는 서비스이다. 업데이트된 어플리케이션 설치나 사용자 데이터를 서버로부터 직접적으로 연결하여 가져갈 수 있도록 간단하고 가벼운 메카니즘을 제공한다. C2DM 서비스는 메시지 저장과 대상 단말에게 메시지 전달하는 모든 면을 처리한다.  

Note : C2DM은 궁극적으로 모든 개발자들이 사용 가능하다. 하지만 현재는 테스트 단계이며 모든 상황에서 가능하지 않다. 만약 당신의 안드로이드 어플리케이션에 C2DM을 사용하길 원한다면, 가입자 페이지에서 접근을 요청해라. 요청이 승인되면 Google이 당신에게 연락할 것이다.


  Contents


  Introduction
  Architectural Overview
    Lifecycle Flow
    What Does the User See?
  Writing Android Applications that use C2DM
    Creating the Manifest 
    Registering for C2DM
    Unregistering from C2DM
    Handling Registration Results
    Handling Received Data
    Developing and Testing Your Applications
  Role of the Third-Party Application Server
    How the Application Server Sends Messages
  Examples
  Limitations

  Introduction


다음은 C2DM 의 주요 특징 들이다.
  • Third-party 어플리케이션 서버가 경량의 데이터를 안드로이드 어플리케이션에게 전달할 수 있도록 한다. 메시지 서비스는 많은 양의 데이터를 전달하도록 설계되지 않았다. 대신 간단한 데이터를 안드로이드 어플리케이션에게 전달해서 서버에서 가져갈 데이터가 있다는 것을 알려주는 정도로 사용될 수 있다.
  • C2DM은 메시지의 전달이나 전달 순서를 보장하지 않는다. 그래서 개발자들은 이 기능을 실제 데이터를 전달하기 보다는 새로운 데이터가 있다는 것을 알리는 용도로 사용해야 한다. 
  • 안드로이드의 어플리케이션은 메시지를 수신하기 위해 동작하고 있을 필요가 없다. 어플리케이션이 적절한 브로드캐스트 리시버와 퍼미션을 가지고 있다면, 안드로이드 시스템은 메시지가 도착하면 Intent를 이용하여 해당 어플리케이션을 동작 시킬 것이다.
  • C2DM은 수신된 메시지 데이터를 처리할 사용자 인터페이스나 처리 방법을 제공하지 않는다. 단지 수신된 메시지를 어플리케이션에게 곧바로 전달 한다. 그래서 어플리케이션은 메시지를 받은 뒤 노티피케이션을 노출시키거나 사용자 인터페이스를 표시하거나 아니면 그냥 조용히 데이터를 처리하고 종료할 수 있다.
  • 안드로이드 2.2 이상의 디바이스에서 동작한다. 또한 마켓 어플리케이션이 설치되어 있어야 한다. 하지만 안드로이드 마켓을 통해 어플리케이션을 배포해야만 하는 것은 아니다.
  • C2DM은 기존의 구글 서비스 컨넥션을 사용한다. 따라서 단말기에 사용자의 로그인 가능한 구글 계정이 등록되어 있어야 한다.

  Architectural Overview


이 섹션에서는 C2DM 이 어떻게 동작하는지 살펴본다.

 아래 표는 C2DM과 연관된 주요 용어와 컨셉을 요약한다. 아래 카테고리로 구분된다.
  • Components - C2DM에서 동작하는 물리적 항목들
  • Credentials - 인증된 메시지가 올바른 단말로 전달되도록 보장하는 각 단계에 사용되는 ID와 토큰들. 

Components
Mobile Device C2DM을 사용하는 안드로이드 어플리케이션이 동작하는 단말기. 안드로이드 버젼 2.2 이상에 안드로이드 마켓 어플리케이션이 설치되고 적어도 하나의 구글 계정이 로그인 되어 있어야 한다. 
Third-Party Application Server 개발자가 어플리케이션에 C2DM을 구현하기 위해 설치해야하는 어플리케이션 서버. C2DM 서버를 통해서 사용자에게 메시지를 전달한다.  
C2DM Servers 3rd-party 어플리케이션 서버로 부터 메시지를 전달 받아, 안드로이드 단말기들에게 메시지를 전달하는 구글 서버. 
Credentials
Sender ID 어플리케이션 개발자의 이메일 주소. Sender ID는 디바이스로 메시지를 보내도록 허락된 안드로이드 어플리케이션을 구분하기 위해 등록절차에서 사용된 ID 이다. 보통 이 ID는 개인용 계정을 사용하는 것 보다는 특정한 역할을 위한 계정을 사용한다. 예를 들면 my-app@gmail.com 같은.
Application ID 메시지를 수신하기위해 등록하는 어플리케이션.  어플리케이션 구분은 manifest 의 패키지 이름으로 구분된다. 이것은 정확한 어플리케이션에 메시지가 전달 되는것을 보장한다.
Registration ID C2DM 서버가 메시지 수신이 허락된 안드로이드 어플리케이션에게  발급하는 ID. 일단 어플리케이션이 등록 ID를 받으면, 3rd-party 어플리케이션 서버에게 전송한다. 어플리케이션 서버는 각각의 디바이스를 구분하는데 ID를 사용한다. 하나의 Registration ID는 특정 디바이스에서 동작하는 특정 어플리케이션과 연결되어 있다.
Google User Account C2DM이 동작하기 위해선 적어도 하나의 로그인된 구글 계정이 필요하다. 
Sender Auth Token 3rd-party 어플리케이션 서버에 저장되는 ClientLogin 인증 토큰. 이것이 있어야 어플리케이션 서버가 구글 서버에 접근할 수 있다. 메시지 전송 요청의 POST 헤더에 포함된다. ClientLogin 인증 토큰에 대한 더 많은 논의는 ClientLogin for Installed Applications 를 참고.

 

Lifecycle Flow

Cloud-to-device 메시징을 사용하기 위한 우선 작업: 

  • C2DM 활성화. 모바일 디바이스에서 동작하는 안드로이드 어플리케이션이 메시지를 받기위해 등록함. 
  • 메시지 보내기. 3rd-party 어플리케이션 서버가 디바이스에게 메시지를 보냄.
  • 메시지 수신. C2DM 서버로부터 안드로이드 어플리케이션이 메세지를 수신함.
위 프로세스들이 아래에 설명되어 있다.

 

C2DM 활성화
아래는 메시지를 수신하기 위해 모바일 디바이스의 안드로이드 어플리케이션이 등록시점에 일어나는 이벤트 순서이다:
  1. 어플리케이션이 메시지 서비스를 사용하기 위해 우선 C2DM 서버에 등록 Intent 를 전송한다. 
    이 등록 Intent (com.google.android.c2dm.intent.REGISTER) 는 sender ID (보통, 어플리케이션 개발자가 메시지 전송을 위해서 등록한 이메일 계정) 와 어플리케이션 ID를 포함한다.
  2. 등록이 성공하면, C2DM 서버는 REGISTRATION 인텐트를 이용해서 어플리케이션에게 등록 ID를 전달 한다. 
    어플리케이션은 이 ID를 이후에 사용하기 위해 저장해 두어야 한다. 구글이 주기적으로 등록 ID를 갱신할 수 있다는 점에 주의하라. 따라서 어플리케이션 디자인시 REGISTRATION 인텐트가 여러번 호출될 수 있다는 점을 반영해라. 어플리케이션이 그에 맞춰 응답할 필요가 있다.
  3. 등록절차를 완료하기 위해서, 어플리케이션은 등록 ID를 어플리케이션 서버에 등록한다. 어플리케이션 서버는 이 등록 ID를 데이타베이스에 저장한다. 
이 등록 ID는 어플리케이션이 명백히 등록해제를 하거나, 구글이 등록 ID를 갱신할 때 까지 유지되어야 한다. 


Sending a Message
어플리케이션 서버가 메시지를 보내기 위해서 다음 절차가 수행되어야 한다 :
  • 어플리케이션이 특정 디바이스에 전달되는 메시지를 수신할 수 있도록 등록 ID를 가져야 한다. 
  • 3rd-party 어플리케이션 서버가 등록 ID를 저장하고 있어야 한다. 
어플리케이션 서버가 메시지를 전송하기 위해서 한가지 더 필요한 것이 있다 : ClientLogin authorization token
어플리케이션을 위해서 개발자가 미리 어플리케이션 서버의 설정을 해야 한다. (Role of the 3rd-party Application Server  참고) 

ClientLogin 토큰은 특정 안드로이드 어플리케이션에게 메시지를 전송하는 어플리케이션 서버를 인증한다. 하나의 어플리케이션 서버는 하나의 ClientLogin 토큰을 가진다. 이 ClientLogin 토큰은 특정 앱의 여러개 등록 ID에 대응한다. 각각의 등록 ID는 메시징 서비스를 사용하도록 등록된 각각의 디바이스를 대표한다.  

어플리케이션 서버가 메시지를 전송할 때에는 다음과 같은 순서를 따른다 :
  1. 어플리케이션 서버가 메시지를 C2DM 서버에게 전달한다.
  2. 만약 디바이스가 활성화되어 있지 않다면 구글 서버는 메시지를 큐에 저장한다.
  3. 디바이스가 온라인이 되면 구글서버가 메시지를 디바이스에게 전달한다.
  4. 디바이스 시스템은 적절한 퍼미션을 포함한 인텐트 브로드 캐스트를 통해 메시지를 브로드캐스팅 해서, 메시지를 수신하도록 설정된 어플리케이션이 메시지를 수신하도록 한다. 이 인텐트는 어플리케이션을 실행시킨다. 어플리케이션은 메시지를 수신하기 위해 상단에 실행되고 있을 필요는 없다.
  5. 어플리케이션이 메시지를 처리한다. 만약 어플리케이션이 중요한 프로세스를 처리하는 중이라면, wake lock 를 발생시킨뒤 서비스 형태로 다른 작업을 처리할 수 있다.
어플리케이션은 더이상 메시지를 수신하고 싶지 않을때 C2DM 등록을 해제 할 수 있다.


Receiving a Message
안드로이드 단말에서 동작하는 어플리케이션이 메시지를 받으면 아래 순서로 동작한다 :
  1. 시스템이 메시지를 수신하면 페이로드에 담겨 있는 키/밸류 쌍을 추출한다. 
  2. 시스템은 com.google.android.c2dm.intent.RECEIVE 인텐트를 포함하는 안드로이드 어플리케이션에게 키/밸류 쌍을 extra로 전달한다.
  3. 안드로이드 어플리케이션은 RECEIVE 인텐트로부터 키값을 이용하여 데이터를 추출하고 처리한다.

What Does the User See?
사용자가 C2DM을 사용하는 어플리케이션을 설치하려 하면, 안드로이드 마켓은 어플리케이션이 C2DM을 포함하고 있다는 퍼미션 정보를 노출한다. 사용자는 어플리케이션을 설치하려면 이 기능을 승인해야 한다. 어플리케이션을 구현하는 방법에 따라, 사용자에게 메시지 수신을 해제할 수 있는 기능을 옵션으로 제공할 수 있다. 어플리케이션을 삭제하면 메시지 수신을 해제하는 것과 동일한 효과를 갖는다.


  Writing Android Applications that Use C2DM


C2DM을 사용하는 어플리케이션을 개발하려면, Role of the 3rd-party Application Server 에 기술된 기능을 수행하는 어플리케이션 서버가 필요하다. 이 섹션에서는 C2DM을 사용하는 어플리케이션을 개발하는 단계를 설명한다.

C2DM 프레임워크와 관련해서 제공되는 사용자 인터페이스가 없다는 것을 기억해라. 어플리케이션에서 메시지를 처리하는 방법은 모두 개발자에게 달려있다.

클라이언트 어플리케이션을 개발하는 두가지 기본 단계 :
  • C2DM 을 사용하기 위한 퍼미션을 매니페스트에 생성한다.
  • 자바코드를 개발한다. C2DM을 사용하기 위해 다음 두가지가 반드시 포함되어야 한다.
    • 등록 서비스를 시작하거나 멈출 수 있는 코드.
    • com.google.android.c2dm.intent.C2D_MESSAGE 와 
      com.google.android.c2dm.intent.REGISTRATION 의 리시버.

Creating the Manifest
모든 안드로이드 어플리케이션은 AndroidManifest.xml을 갖고있다. 메니페스트 파일은 어플리케이션의 필수 정보들을 안드로이드 시스템에 제공한다. C2DM 기능을 사용하려면, 아래 항목이 메니페스트에 포함되어야 한다 : 
  • 어플리케이션 등록 및 메시지 수신을 위한 퍼미션 com.google.android.c2dm.permission.RECEIVE .
  • android.permission.INTERNET 써드파티 서버에게 수신자 키를 보내기 위한 퍼미션.
  • applicationPackage + ".permission.C2D_MESSAGE 다른 어플리케이션이 메시지를 등록하거나 수신하는 것을 방지하기 위한 퍼미션.
  • 메시지 수신을 위한 com.google.android.c2dm.intent.RECEIVE 퍼미션과,  applicationPackage 이름으로 카테고리가 설정된 com.google.android.c2dm.intent.REGISTRATION 퍼미션
    수신자도 com.google.android.c2dm.SEND 퍼미션이 필요하다. C2DM 프레임워크가 메시지를 전송할 수 있다. 메시지 등록과 수신모두 Intents 에 구현되어 있다. 
  • 메 C2DM기능이 어플리케이션 기능에 필수적인 기능이라면 메니페스트에 android:minSdkVersion="8" 를 반드시 설정하라. 이것은 어플리케이션이 제대로 동작하지 않는 환경에 설치되는 것을 막아준다. 







Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2011.02.23 15:41
1. 샘플 프로젝트를 먼저 다운 받아서 실행해볼 것
2. 문서에는 AndroidManifest.xml 에 적어줘야 할 permission 누락되어 있음.
3. SKT 사용자만 인앱 결제를 할 수 있음. 
4. SKT 폰에서만 MDN 테스트를 할 수 있음. 
5. 개발자가 알 필요 없는 인앱 모듈 자체 테스트
  - 인앱 아이템을 하나 등록하면 찾아 들어가서 '정상' 으로 눌러줘야 함.
6. 인앱을 등록하면 모두 한번씩은 테스트 폰을 통해서 결제 테스트를 해야만 함.
7. 테스트 하려면 MDN 등록을 하라는데, mdn 이 뭔지 몰라서 해메었음. 그냥 전화번호 였음. 처음에 입력한 폰이 kt 폰 번호여서 안되었던..


결론
구글 마켓에도 인앱 결제기능이 추가되었음.
Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2010.11.16 11:07
폰 초기화 후, 펌웨어 업그레이드만 한 상태.
일단, 개발자 입장에서 만족!

1. 얼마전 포스팅 한 이미지 리소스가 많아지면 Out of memory 발생하는 현상 없어짐.
2. 전체적인 반응 속도 역시 향상 됨.
3. 한글 폰트에 bold 가 먹힘!! (현재 2.2인 넥서스원, 디자이에에선 안되는 것 같은데..)
4. 레이아웃 깨짐현상 없어짐. (옆자리 개발자 제보)

지난번과 동일한 코드 동작 후 메모리 덤프 비교.



참고로 지난번 메모리 덤프.

(지난번 글 -> http://drkein.tistory.com/171 )


p.s...
1. 사람들이 펌업 하는데 시일이 얼마나 걸릴까.. 그때까진 막판왕, 갤스2.1에 맞춰서 개발해야 한다는 소린데..;;;
Posted by Dr.Kein

댓글을 달아 주세요

안드로이드2010.11.08 09:55
안드로이드2010.11.04 12:02
개발중인 앱이 이미지 소스를 많이 사용한다.

넥서스원, 디자이어 에서는 문제 없이 동작 하지만, 
갤럭시S 에서는 곧잘 죽어 버리는데,  원인은 이미지를 로딩하는 BitmapFactory 에서 Out of memory 발생.

여러장의 이미지를 (약 100장 쯤) 애니메이션 시키기 위해 xml 로 로딩하는 데 이때 메모리를 많이 먹게 된다.
애니메이션 자체는 일단 로딩 후, 동작 까지는 문제 없지만, 다른 뷰로 들어갈 때 에러가 발생 하는 것.
아래 로그 하단에 보면, 다른 액티비티로 이동하면서 버튼 이미지를 불러올 때 에러가 나는것 같다.

E/AndroidRuntime(12414): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
E/AndroidRuntime(12414): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(12414): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:547)
E/AndroidRuntime(12414): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:423)
E/AndroidRuntime(12414): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
E/AndroidRuntime(12414): at android.content.res.Resources.loadDrawable(Resources.java:1705)
E/AndroidRuntime(12414): at android.content.res.Resources.getDrawable(Resources.java:580)
E/AndroidRuntime(12414): at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:160)
E/AndroidRuntime(12414): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:788)
E/AndroidRuntime(12414): at android.graphics.drawable.Drawable.createFromXml(Drawable.java:729)
E/AndroidRuntime(12414): at android.content.res.Resources.loadDrawable(Resources.java:1690)
E/AndroidRuntime(12414): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
E/AndroidRuntime(12414): at android.view.View.<init>(View.java:1860)
E/AndroidRuntime(12414): at android.widget.TextView.<init>(TextView.java:327)
E/AndroidRuntime(12414): at android.widget.Button.<init>(Button.java:68)
                                                 < 갤럭시 S 에서 에러 발생 시점의 로그 >


하여간, 
뻑뻑 죽는 갤스와, 잘 도는 넥서스원의 메모리 덤프를 떠봤다..

이건, 애니메이션을 로딩한 뒤의 넥서스원 메모리 덤프. 


이건, 애니메이션 로딩한 뒤의 갤럭시S 메모리 덤프..


이 뭥미??   
갤스는 45메가? 넥원은 6메가...

이 두 기기의 차이점이라면, 
갤스는  2.1-update
넥원은  2.2.1

또.. 제조사가 다르다는 점..??? 
응??


Posted by Dr.Kein

댓글을 달아 주세요