기본 기능을 구현한 뒤 app market에 올렸다가 debugging phone에서는 막힘없이 되던 부분에서 app이 멎어버리는 bug를 접했다. logcat을 보니 library에서 class를 읽어들이는데 문제가 있는 모양인데 분명히 gradle에도 해당 .jar 파일들을 추가했고 이미 정상적으로 동작하는 폰도 있는데 왜 bug가 잡힌 것일까? bug가 잡힌 phone은 API 19고 되던 폰은 API 21이긴 한데 말이다.

E/dalvikvm: Could not find class 'org.apache.poi.ss.util.CellRangeAddress', referenced from method org.apache.poi.hssf.usermodel.HSSFWorkbook.setRepeatingRowsAndColumns
W/dalvikvm: VFY: unable to resolve new-instance 7124 (Lorg/apache/poi/ss/util/CellRangeAddress;) in Lorg/apache/poi/hssf/usermodel/HSSFWorkbook;
D/dalvikvm: VFY: replacing opcode 0x22 at 0x0009
W/dalvikvm: Unable to resolve superclass of Lorg/apache/poi/ss/util/CellRangeAddress; (7125)
W/dalvikvm: Link of class 'Lorg/apache/poi/ss/util/CellRangeAddress;' failed
E/dalvikvm: Could not find class 'org.apache.poi.ss.util.CellRangeAddress', referenced from method org.apache.poi.hssf.usermodel.HSSFWorkbook.setRepeatingRowsAndColumns
W/dalvikvm: VFY: unable to resolve new-instance 7124 (Lorg/apache/poi/ss/util/CellRangeAddress;) in Lorg/apache/poi/hssf/usermodel/HSSFWorkbook;
D/dalvikvm: VFY: replacing opcode 0x22 at 0x0010

 

  나와 같은 error를 먼저 만나본 사람이 어디없나 검색해 보니 다행히 있긴 있었다. MultiDex 기능이 Lollipop 이전에서는 제대로 동작하지 않을 수도 있기 때문에 아래 code를 class 내에 선언하여야 해당 library의 method들을 활용할 수 있다는 것이다.

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
[출처] StackOverflow - Android Studio E/dalvikvm﹕ Could not find class '.DatabaseHelper', referenced from method .DatabaseManager
                                  (http://stackoverflow.com/questions/32697460/android-studio-e-dalvikvm-could-not-find-class-databasehelper-referenced-fr

  결과는 성공이었다. 문제를 해결하게 되서 기쁘긴한데 이 해결책을 알아낸 사람들은 도대체 어떻게 찾은건지 ㅎㅎ. 역시 무작정 code만 짜기 보다는 전체적인 동작 원리와 구조를 파악할 줄 아는 것이 진정한 힘인 것 같다.

  이전에 CustomListView를 만들다 보니 ListView에 기본적으로 속할 사진을 미리 project 내부에 등록할 필요가 있었다. 방법을 까먹기 전에 기록해 두려 한다.

1. 목적 : 기본 ListView를 customizing하여 사용해 보자.

2. 개발 환경
 - PC : Windows 7, Android Studio 1.4.1(64-bit)
 - Phone : LG G pro Lollipop(API 21)

3. 과정
 1) App.의 project 내에서 [res] - [drawable] directory를 찾아 우클릭을 누르면 나오는 menu들 중에 [New] - [Image Asset]을 찾아 들어간다.

 

 2) [Image Asset] 창에서 'Asset Type'으로 'launcher Icons'를 선택한 뒤, Image file의 경로로 원하는 image를 찾아 지정한다. 그리고 Resource name으로 App. 개발 중 불러들일 때 사용할 변수명을 입력하고 [Next] 버튼을 눌러 적용 사항을 확인하고 [Finish] 한다.

  

 3) 다음과 같이 image를 반영할 때, 앞에서 지정한 'Resource Name'을 사용한다. 앞서 CustomListView에서 예시를 빌려 왔다.

 

  Android app으로 word 파일(.docx/.doc)를 볼 필요가 생겨서 관련된 library를 찾다가 먼저 Apache POI를 발견했다. 아직 App 개발에 익숙하지 않아 개발 환경을 꾸미는 것만으로도 구글링하면서 진땀을 뺐는데, 겨우겨우 관련 .jar file을 import하고 compile을 해보니 이게 웬 걸. duplicate class 어쩌구 하는 error가 떡하니 뜨는게 아닌가?

 

 

  구글링으로 해당 error의 이유를 보니 애초에 배포된 xmlbeans-2.6.0.jar 내에 중복된 이름의 class가 있어 그렇다고 한다. 이 문제를 해결하려면 직접 xmlbeans-2.6.0.jar를 푼 다음(unzip) 다시 jar로 repack을 해야한다는데, 일단 개발환경 내에 jar 명령어가 동작할 수 있도록 JDK를 설치해야 했다(JDK는 android studio의 구동을 위해 필히 설치해야하는 항목이었으므로 보통은 C:\Program Files\Java 내에 jdk1.x.x_xx 따위의 directory로 정리되어 설치되어 있을 것이다). 그리고 다른 경로에서도 java.exe를 활용할 수 있도록 window의 Path 환경변수에 (내 컴퓨터 내 Java jdk 경로)\bin을 추가해 놓아야 했다.

   

  

 

  그리고 POI-bin 내에 xmlbeans-2.6.0.jar 파일을 찾아 압축을 푼다. 나는 여기서 7-Zip을 활용했다. 압축을 풀다 보면 문제가 됐었던 중복된 class 파일들에 대해 대체여부를 묻는 창이 뜨는데 '모두 예(A)'를 선택하여 대체했다.

 

  다음으로 콘솔을 실행하여 압축을 푼 해당 directory에 들어가서 'jar cf (repack할 jar file명).jar -C *'을 수행했다. 다른 분들의 조언에 따르면 'jar cf (repack할 jar file명).jar -C * .'을 해야한다는데, 내 컴퓨터 환경에서는 그렇게 하면 환경 자체의 문제점이 있는 모양인지 손상된 jar file이 생성되어 제대로 동작하지 않았다. 혹시나 나와 비슷한 문제를 겪고 있는 분들이 있다면 jar 명령어에 관한 reference를 찾아 살짝 바꿔서 실행해 보면 원하는 결과가 나올지도 모르겠다.

 

 

  이제 새로 생성된 xmlbeans-2.6.0-repack.jar를 app library에 추가하여 compile/run을 시켜보았다. 그 결과 실행은 되긴 했으나 app이 XWPFDocument(); method를 거치는 순간 중단되는 문제가 발생하였다. 그러나 이 문제는 xmlbeans-2.6.0.jar 파일의 유무와 상관없이 그전에도 일어났던 터라 해당 파일과는 상관이 없으리라 생각된다. 이제 이 다음 문제를 해결해야지.

 

 

+ Recent posts