Skip to content

Android:Troubleshooting

Android 컴파일시 나타나는 에러와 관련된 현상을 리포팅하고 해결방법을 정리한다.

Category

Android 폰에서 디버깅시에 ADB가 인식되지 않거나, 단말기 자체가 장치로 인식되지(연결되지) 않는 경우 대처 방법

USB를 연결했음에도 불구하고 충전은 되지만 '미디어 기기로 연결됨'알림(Notification)이 출력되지 않고 PC에도 '이동식 미디어 장치'에 잡히지 않을 경우가 있다. 이럴 경우 재부팅하면 다시 정상적으로 잡히지만, 종종 위와 같은 현상이 다시 발생되거나 아예 더 이상 장치가 인식되지 않을 경우가 있다. 이러한 경우 드라이버를 재설치하면 된다. 기본 ANDROID 드라이버 경로는 아래와 같다.

${ANDROID_HOME}/extras/google/usb_driver

디버깅이 안되는 경우라면 ADB를 재실행하면 될 수 있다.

# adb kill-server
# adb start-server

INSTALL_FAILED_INSUFFICIENT_STORAGE 에러발생시 대처방법

안드로이드에 포팅시 아래와 같은 콘솔(Logcat이 아니다)메시지와 함께 포팅에 실패한다면 안드로이드에 기존에 설치된 데이터를 제거한 후 포팅하면 된다.

Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
Please check logcat output for more details.
Launch canceled!
  1. 이 에러는 LogCat과 관련된 포팅에러이다. 에뮬레이터에서 해결방법은 -partition-size 256과 같이 파티션 크기를 늘려주면 된다.
  2. 디바이스(Device)에서 해결방법은 로그메시지를 지운 후 다바이스를 USB와 분리작업을 여러번 하면 된다.
  3. LogCat을 지워준다. 그 후, 디바이스를 분리한 후 다시 연결하고 LogCat을 지워준다. (한번에 정상적으로 지워지지 않을 경우가 있다.)
  4. 이렇게 해도 안될 경우 Android NexusS의 경우 Manifest파일에 android:installLocation="preferExternal"속성을 추가해주면 된다.

Unable to build: the file dx.jar was not loaded from the SDK folder

Android SDK Manager에서 이것저것 업그레이드 후에 eclipse에서 프로젝트 빌드시에 아래와 같은 메시지가 나오면서 패키지 빌드가 실패했다 (물론 그전엔 잘 되는 것이었다).

Unable to build: the file dx.jar was not loaded from the SDK folder!

dx.jar가 없다는 말인데... dx.jar를 찾아서 있어야할 곳(platform-tools\lib\)에 복사해주면 해결되는데, 현재 참조 링크의 두번째에 나오는 방법이 더 편하고 깔끔하다. eclipse 종료후에 Android SDK Manager에서 다음 항목을 uninstall한 후에 다시 install하면 해결된다.

Android SDK platform-tools

Java version 1.5 or 1.6

현재(2012-09-28) 안드로이드는 여러가지 정책상 1.5버전의 자바 컴파일러를 사용한다. 1.6 전의 자바는 인터페이스가 1.5와 흡사하지만 1.7에서 크게 변경되어, 1.7로 컴파일하면 아래와 같은 에러메시지가 나타난다.

Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

이클립스를 사용할 경우 해결방법은 아래와 같이 Java 버전을 변경하면 된다.

Project > Properties > Java Compiler
Compiler compliance level: 1.6 변경.
만약 클릭할 수 없는 상태일 경우 상단의 'Enable project specific settings'를 클릭하면 된다.

Call to OpenGL ES API with no current context (logged once per thread)

Android Phonegap call to OpenGL ES API with no current context (logged once per thread) Error When using Phonegap on Android I was getting this OpenGL error somewhat randomly. It seemed to be related to CSS animation. Turns out the problem was that hardware acceleration is turned off by default. (하드웨어 가속 지원이 설정되어 있지 않을 경우 아래와 같은 메시지가 출력된다.)

error E/libEGL(614): call to OpenGL ES API with no current context (logged once per thread)

AndroidManifest.xml에 아래와 같이 추가하면 된다.

<application android:hardwareAccelerated="true" ...>

WARNING

중요한점은, 위와같이 설정한 후 정상적으로 작동하지 않고 화면이 깨지는 현상이 발생될 수 있다. 이럴경우 아래와 같이 시도하면 된다.

<application android:hardwareAccelerated="false" ...>

Android Native NDK OpenGL ES: unimplemented API

참조: http://stackoverflow.com/questions/9468175/android-native-ndk-opengl-es-unimplemented-api OpenGL ES 관련 라이브러리를 사용할 경우 아래와 같은 에러메시지가 출력될 수 있다.

error  libEGL   called unimplemented OpenGL ES API

EGL context를 아래와 같이 초기화하면 된다.

EGLint aEGLAttributes[] =
{
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0
    ...
    EGL_NONE
};
...
eglChooseConfig(m_EGLDisplay, aEGLAttributes, aEGLConfigs, 1,
            &cEGLConfigs)
...

또는 NDK를 사용할 경우 #include <GLES2/gl2.h>헤더파일이 정상적으로 추가되었는지 확인한다.

Eclipse에서 LogCat 히스토리가 사라지는 문제에 대하여

아래와 같이 명령줄에 입력하면 버퍼용량에 걱정없이 로그를 열람할 수 있다.

# adb logcat -v time

Looper와 관련된 해결방법에 대한 설명

Android Kernel System 디버깅

printk라는 함수를 사용하여 kernel단에 디버깅을 한다. 이 로그를 보기 위해서는 다음과 같이 하면 된다.

  • Prompt창 띄운 후 adb shell -> dmesg를 하면 부팅 후 현재까지의 로그를 전부 보여줌.
  • adb shell -> dmesg -c 를 하면 현재까지 다 보여주고 로그 버퍼 삭제 -> dmesg
  • adb shell -> cat /proc/kmsg 실시간 로그 보여줌.

Path가 안되어 있을 경우, sdk/platform-tools에 보면 있다.

ADT 17 업데이트 후 JAR Libraries 사용시 실행 오류 해결 건

LogCat오류 메시지로 아래와 같은 정보가 출력될 경우가 있다.

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
Caused by: java.lang.ClassNotFoundException:
...

아래와 같은 해결방법이 있다.

  1. 해당프로젝트의 오른쪽 마우스 버튼으로 Properties > Java Build Path > Order and Export Tab 진입
  2. Order and Export 탭에 표시되는 모든 항목의 CheckBox를 체크 하고 OK로 창을 종료한다.
  3. Project Clean 후, 다시 빌드한다.

Dex Loader Unable to execute Multiple dex files define

java.lang.ClassNotFoundException 관련 에러를 고치기 위해 진행하다 나타날 수 있는 에러이다. Java build path > Order and Export > Support library에서 불필요하게 체크한 라이브러리가 있는지 찾아본다.

Unable to launch cygpath in android

아래와 같은 에러메시지가 발견될 경우가 있다.

[2013-03-17 16:14:15 - Unable to launch cygpath. Is Cygwin on the path?] java.io.IOException: Cannot run program "cygpath": CreateProcess error=2, The system cannot find the file specified

이 경우는 Cygwin설치 후, PATH에 $CYGWIN_HOME/bin/cygpath.exe파일을 찾지 못할 경우 발생되는 에러메시지 이다. PATH 환경변수를 정확히 설정하면 된다.

JAR 라이브러리 참조시 ClassNotFoundException 혹은 Class Definition을 찾을 수 없을 때

이클립스에서 ADT 플러그인을 통해 안드로이드 앱을 개발하는 과정에서 외부 라이브러리를 참조하고자 할 때 가장 흔히들 쓰는 방법이 프로젝트 우클릭 > Properties > Java Build Path > Libraries 탭 > Add External JARs > jar 파일 선택 일 것이다. 하지만 위의 포스팅에 의하면 안드로이드의 Dalvik JVM은 자바로 컴파일 된 클래스를 바로 참조하질 못한다고 한다. 이와 같은 이유로, 위의 방식으로 외부 라이브러리를 참조할 경우 안드로이드에서는 No Class Definition Found 혹은 ClassNotFoundException이 발생하게 된다. 이를 해결하기 위해서는 Dalvik에서 참조 가능한 형태의 JAR 파일로 변환을 시켜주어야 하는데, 방법은 간단하다. 안드로이드 프로젝트 안에 생성되어 있는 libs 폴더에 오른쪽 클릭을 하고 Import를 선택, 여기서 General > File System를 선택하면 From directory를 검색해서 설정해줄 수 있는데, 여기서 변환하고자 하는 jar 파일이 있는 parent directory를 선택한 뒤에 확인을 누르면 해당 jar 파일이 오른쪽 열에 나열이 된다. 이 jar 파일들을 모두 선택한 뒤에 Finish를 해주면 libs 폴더 안에 Dalvik-converted JAR 파일들이 libs 폴더안에 생성이 된다.

UnsupportedOperationException GLES20Canvas.clipPath

ICS를 얹은 갤넥에서 발생한다고 보고가 되었다.

java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:387)

해결방법은 아래와 같다.

private void safelyCropPath(Canvas c, Path p) {
    try {
        c.clipPath(p);
    } catch (UnsupportedOperationException e) {
        if (Build.VERSION.SDK_INT >= 11) {
            try {
                final int LAYER_TYPE_SOFTWARE = getClass().getField("LAYER_TYPE_SOFTWARE").getInt(this);
                Method layerTypeM = getClass().getMethod("setLayerType", Integer.TYPE, Paint.class);
                layerTypeM.invoke(this, LAYER_TYPE_SOFTWARE, null);
                c.clipPath(p);
            } catch (Throwable e1) {
                // 이래도 실패하면..@_@
            }
        }
    }
}

Error generating final archive: Debug certificate expired on

이클립스에서 안드로이드 애플리케이션 빌드 중에 이런 오류 메시지가 나오는 경우가 있다.

Error generating final archive: Debug certificate expired on ...

Debug certificate가 만료되어서 발생하는 문제인데, Debug certificate는 만들어진 후 365일이 지나면 만료된다. 그러므로 만료된 Debug certificate를 새로 갱신해주면 된다. 방법은 간단하다. debug.keystore 파일을 삭제한 후, 그냥 다시 안드로이드 애플리케이션을 빌드만 하면 된다. debug.keystore 파일의 위치는 Window > Preferences > Android > Build에서 Default debug keystore 항목을 참조하면 된다.

Activity xxx has leaked window xxxxxxx that was originally added here

액티비티에서 생성한 다이얼로그가 존재할 때 액티비티가 종료되어 메모리 누수가 발생할 경우 나타난다. 액티비티가 종료되기 전에 다이얼로그의 dismiss()를 호출해야한다.

Favorite site

References


  1. Android_Handler_Story_-_Handler_and_Looper.pdf 

  2. Blog.naver.com_-jolangma-_android_anr.pdf 

  3. Blog.naver.com_-jolangma-_android_listview_anr.pdf