2013-06-03 3 views
4

JavaSE에서 이미 작동하는 사용자 정의 문자 세트가 있습니다.'META-INF/services'- 파일을 apk에 보관하십시오.

내 CharsetProvider 클래스는 에 있으며 META-INF/services에 있으며 모든 것이 정상적으로로드되고 예상대로 작동합니다.

하지만 지금은 안드로이드에서도 lib를 사용하고 있지만 Android-App에서는 charset이로드되지 않습니다.

Android-App에서 예상대로 사용할 수 있도록 내 charset을 어떻게 통합 할 수 있습니까? 순간

Charset.forName("MyCS"); 

나는이 같은 문제를 해결하고 있어요 :

매번 때문에, 작동하지만, 나에게 효과가 보인다
public static String decode(String encoding, byte[] buffer, int offset, int length) { 
    String result = ""; 
    try { 
     result = new String(buffer, offset, length, encoding); 
    } catch (UnsupportedEncodingException ex) { 
     MyCharsetProvider provider = new MyCharsetProvider(); 
     Charset cs = provider.charsetForName(encoding); 
     if (cs == null) { 
      Logger.getLogger(Converters.class.getName()).log(
        Level.SEVERE,null,ex); 
      result = new String(buffer, offset, length); 
     } else { 
      result = cs.decode(ByteBuffer.wrap(buffer, offset, length)).toString(); 
     } 
    } 
    return result; 
} 

난 내 자신의 캐릭터 세트, 예외와 같이 디코딩하려고 Throw되어 CharsetProvider-Object가 생성됩니다.

물론 싱글 톤 패턴으로 생성을 줄일 수 있습니다. 그러나 MyCharsetProvider를 직접 사용하지 않는 것이 문제입니다.

편집 : META-INF/services/java.nio.charset.spi.CharsetProvider 이후

내가 비록 아마 난독 그것을 제거 APK에 없습니다. 그런 다음 proguard.cfg에서 다음 옵션을 시도했습니다.

-adaptresourcefilenames **.CharsetProvider 
-adaptresourcefilecontents **.CharsetProvider 

그러나 문제는 여전히 지속됩니다. 그렇다면이 파일들을 META-INF/services에서 내 apk에 자동으로 개미 (netbeans)를 사용하여 어떻게 가져올 수 있습니까?

답변

3

지금은 다음과 같은 솔루션을 사용하고

ANT :

내가 정렬되지 않은 및 서명되지 않은 APK에 META-INF/services에 파일을 복사 할 따라와 목표와 custom_rules.xml를 만들었습니다.

<target name="-post-package" depends="-custom-copy" /> 

<target name="-copy-custom"> 
    <zip destfile="${out.packaged.file}" 
     update="true" 
     basedir="${source.absolute.dir}" 
     includes="${custom.copy}" /> 
</target> 

그리고 ant.properties에서

나는 내가 단지에 포함하기 위해 내 자신의 프로젝트의 META-INF/서비스 폴더에 도서관에서 관련 파일을 복사해야 이제 선

custom.copy=META-INF/services/** 

추가 APK. 이를 통해 ServiceLoader에서로드 할 클래스를 완전히 제어 할 수 있습니다.

비고 : 외부 자바 SE-항아리에 이런 식으로 포함되어 현재 내가 유일한 부하 구현. 구현이 android-project에 있으면 난독 화가 구성되어야합니다. 이클립스 플러그인을 사용


ECLIPSE-PLUGIN

는 ANT에서 같은 해결 방법이 없습니다. 문제는 ExportHelper (줄 405)이며 META-INF 폴더에있는 모든 것을 igores합니다.이 Bug에 따르면 안드로이드 스튜디오/Gradle을


당신은 당신의 주요 프로젝트에서 META-INF -directory을 정의 할 수 있으며, 이것은 당신의 APK로 포장됩니다. META-INF - 라이브러리 폴더가 제외되므로 프로젝트에 사용할 구현을 지정해야합니다 (이것이 의도라고 생각합니다).

+0

Ant로 전환하지 않고 복사하려면 어떻게해야합니까? – Singagirl

+0

@DmitriyR 어떤 빌드 시스템을 사용합니까? 나는 eclipse-plugin을위한 좋은 해결 방법이있을 것이라고 생각하지 않는다. – AlexS

+0

나는 이클립스를 사용하므로 마침내 서명되지 않은 .apk를 내 보낸 다음 apk 및 서명과 ziplaligning에 경로를 추가하는 스크립트를 작성했습니다. 불편하지만 작동합니다. Eclipse에서 에뮬레이터로 바로 전개 할 수없는 주요 문제점. – Singagirl