2013-08-30 1 views
2

확장 가능한 안드로이드 응용 프로그램을 만들고 있는데, 다른 응용 프로그램 (apk)에서 Fragment를 확장하는 클래스를로드 할 수 있어야합니다. ClassLoader loading 안드로이드 지원 라이브러리에서 android 클래스를 확장하는 android 클래스

String packageName = "com.something.project"; 
String className = "com.something.project.TestFragment"; 
String apkName = getPackageManager().getApplicationInfo(packageName, 0).sourceDir; 
PathClassLoader classLoader = new PathClassLoader(apkName,ClassLoader.getSystemClassLoader()); 
Class<?> clazz = classLoader.loadClass(className); 
Fragment f = (Fragment)obj; 

이 제대로 작동 되었으나 나는 문제가 발생하기 이전의 안드로이드 장치와 내 응용 프로그램이 호환되도록 안드로이드 지원 라이브러리 (android.support.v4.app.Fragment)에서 조각을 사용하려고 할 때. 구체적으로 Fragment (ClassCastException)로 캐스트하려고하면 예외가 발생합니다. Fragment 클래스가 다른 ClassLoader로로드 되었기 때문에 이것이 실현되고 있음을 알고 있지만 작동하게 만들 수는 없습니다.

답변

1

그래서 나는 마침내 그것을 알아 냈습니다. 내 플러그인 응용 프로그램에서 안드로이드 지원 라이브러리를 제거해야했습니다. 그래서이 기사의 도움을 받아 http://android-developers.blogspot.cz/2011/07/custom-class-loading-in-dalvik.html 나는 앤트 로이드를 사용하여 내 플러그인 애플리케이션을 안드로이드 지원 라이브러리 클래스없이 컴파일 할 수있었습니다. 그런 다음 매력처럼 작동했습니다.

+0

이 기술을 gradle 빌드 시스템으로 마이그레이션 할 수 있었습니까? –

+0

나는 gradle로 마이그레이션 할 필요가 없습니다. Android 스튜디오는 아직 조기 액세스 미리보기입니다. 나는 그것을 사용하는 것이 현명하다고 생각하지 않는다. – BJMg

+0

의견에 감사드립니다. 나는 안드로이드 개발로 시작하고 최신으로 갈 것이라고 생각했습니다. 불행히도이 항목은 android gradle 플러그인의 문제인 것으로 보입니다. compileClasspath는 표준 Gradle 빌드 시스템에있는 그대로 SourceSet에 정의되어 있지 않습니다. –

관련 문제