2011-04-22 5 views
11

저는 java와 android development에 매우 익숙하며 munin과 같은 통계 및 정보를 수집하는 응용 프로그램부터 배우려고합니다. 내 응용 프로그램에서 "플러그인"을로드 할 수 있도록 노력하고 있습니다. 이 플러그인은 이미 애플리케이션에 포함되어 있지만 별도로 호출 할 필요는 없지만 반복 할 수는 있습니다. serviceloader를 사용하려고했지만 APA에 META-INF/services를 가져올 수 없었습니다. 그래서 안드로이드에 serviceloader를 사용하는 것이 가능한지 궁금하네요 감사합니다
편집 : 나는 java.util.ServiceLoader에 대해 물어 보는거야, 나는 그것이해야한다고 생각하지만, 내 서비스 폴더를 얻는 방법을 알아낼 수 없다. APK의 INFandroid에서 serviceloader 사용

+0

"serviceloader"가 무엇인지 알 수 있습니다. – CommonsWare

+0

java.util.ServiceLoader에 대해 묻고 싶습니다.하지만 APK의 META-INF에 내 서비스 폴더를 가져 오는 방법을 알아낼 수 없습니다. – silverchris

+0

이 직접 시도하고 있는데 [이 사람 ] (http://groups.google.com/group/android-developers/browse_thread/thread/ba98351e50897499/2c96aecee4ece3d0) 누가 그 일을 처리했는지, 불행히도, 그는 세부 사항에 대해 약간의 빛이 있습니다. 나는 좀 더 많은 정보를 요구했고 그가 나에게 돌아 오면 나는 여기에 당신을 알려주도록 할 것이다 :) – SubmittedDenied

답변

2

가능합니다. 확인하고 싶을 수도 있습니다 http://developer.android.com/reference/java/util/ServiceLoader.html

+3

APA에 META-INF/services를받는 방법을 알고 있습니까? 나는 몇 시간 동안 노력해 왔으며 항상 배제 된 것으로 보인다. 이클립스를 사용하여 프로그램을 작성하고 빌드합니다. – silverchris

+1

AFAIK 유일한 선택은 apk 생성 후 Ant 스크립트를 사용하고 jar 작업을 사용하여 META-INF 폴더를 삽입하는 것입니다. –

+0

[answer] (http://stackoverflow.com/a/17066147/731183) – AlexS

-3

ServiceLoader는 Android와 관련이없는 Java 언어의 내용입니다. 나는 그것을 사용하지 않는 것이 좋습니다. 로드하려는 .apk 내의 클래스 목록을 찾으려면,이를 수행하는 다양한 방법이 있습니다. res/xml에 XMl 파일을 나열하고, 리플렉션, 주석 등을 사용합니다.

+0

내 의견을 말하면서도 "플러그인"을로드하라는 제안 된 방법 중 많은 정보를 찾는 데 어려움을 겪고 있습니다. 손으로 실행. 나는 중요한 Java 놈이므로 좋은 링크 나 예제를 실제로 사용할 수있다. 감사합니다. – silverchris

+11

ServiceLoader 클래스는 Android API 레벨 9에 포함되어 있으므로 관련성이 있습니다. 리소스 파일에 구현 클래스 목록을 포함 시키면 APK에서 'META-INF/services/'파일로 이동해야하므로 작동하지 않습니다. – SubmittedDenied

4

META-INF 폴더는 ApkBuilder에서 의도적으로 APK에서 제외됩니다. ApkBuilder.java의 유일한 주석은 "다른 폴더 (예 :/META-INF)를 제외해야합니다"이지만 다른 설명은 없습니다.

개미로 META-INF를 추가 한 후에도 META-INF/services/* 파일의 내용을 바꾸거나 이름을 바꾸지 않는 Proguard를 사용하려는 경우 여전히 문제가 발생합니다 (다른 이야기 인 저자는 프로 가드를 불가지론 자로 유지하기를 원한다.)

그러나 maven을 사용하는 사람들은 https://github.com/pa314159/maven-android-plugin ("modified"라는 이름의 분기)을 확인하여 두 문제를 모두 해결하려고 할 수 있습니다. 그것은 한 달 전에 내 자신의 안드로이드 프로젝트에 대해 수정 한 원래 "android-maven-plugin"의 포크입니다.

은 또한 어떤 의견을 환영합니다,이 도움이 Proguard와-4.7

희망에 대한 패치를 제공합니다.

+1

Gradle과 호환됩니다. https://code.google.com/p/android/issues/detail?id=59658 – TJR

2

일부 상황에서는 해결할 수있는 해결책을 찾았습니다. ServiceLoader 대신 NetBeans와 함께 제공되는 org.openide.util.Lookup 클래스/라이브러리를 사용하고 있습니다.이 라이브러리는 ServiceLoader의 상위 집합입니다. NetBeans 자체는 필요하지 않으며 Eclipse에서 제대로 작동하는 것 같습니다. 응용 프로그램에서 사용중인 ServiceLoader 기능을 Lookup 도구로 바꾸고 org-openide-util-lookup 라이브러리를 추가해야합니다./

Lookup lookup = new ProxyLookup(Lookup.getDefault(), 
       Lookups.metaInfServices(myClass.getClassLoader(), "services/")); 

을 그리고 서비스/META-INF는/서비스에서 ServiceLoader 파일을 이동 : 그럼, 당신은 같은 것을 할 수 있습니다.

ProxyLookup으로 인해 표준 Java 환경에서 변경되지 않고 계속 작동합니다 (즉, META-INF/services를 계속 살펴볼 것임).여기

이 라이브러리의 문서에 대한 링크입니다 : 며칠이 작업을 한 후 http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/Lookups.html

UPDATE

, 잘 작동하는 것 같다 - 나는 환경 (표준 자바와 안드로이드 사이를 이동) 각 위치에서 제대로 작동합니다. 주된 단점은 파일을 수동으로/services 디렉토리에 복사해야한다는 것입니다.

+0

Lookup은 Java와 관련이 있으며 안드로이드는 아닙니다 .' 이것은 표준 Java 환경에서 계속 변경 될 것입니다 .' Android가 아닙니다. –

+0

아니요, Android에서 조회가 작동하므로 앱에 라이브러리 jar (org-openide-util-lookup.jar)를 포함하기 만하면됩니다. 요점은 내가 포함 된 코드가 프록시 측면 때문에 안드로이드와 표준 Java 환경에서 제대로 작동한다는 것입니다. – djilk