2014-02-26 2 views
1

리소스를 사용하여 상태 표시 줄에 알림을 표시하는 service.apk가 있습니다.리소스를 사용하는 apk를 동적으로로드하십시오.

동적으로 어떻게 든 사라 이러한 자원 그러나 알림에 대한 자원을 사용하는 클래스를 로딩하고, 나는이 오류를 받고 있어요 :

W/ResourceType(1142): No known package when getting value for resource number 0x7f020001 W/StatusBarIconView(1142): Icon not found in 2130837505: 7f020001 W/StatusBarIconView(1142): No icon for slot android/0x20 W/ActivityManager( 941): crashApplication: trying to crash self! D/NotificationService( 941): onNotification error pkg=android tag=null id=32; will crashApplication(uid=1000, pid=941) W/StatusBar(1142): removeNotification for unknown key: [email protected]

동적으로로드 코드 :

PathClassLoader classLoader = 
       new PathClassLoader("system/app/ServiceImpl.apk", 
           ClassLoader.getSystemClassLoader()); 
       Class someClass = 
      classLoader.loadClass("com.bla.ServiceImpl"); 
       Constructor<Class> ctor = someClass.getConstructor(Context.class); 
       Object someObject = ctor.newInstance(context); 

내가 apk를로드하는 방식이 잘못되었을 수도 있습니다. 자원에 대한 경로를 추가해야할까요?

도움을 주시면 매우 감사하겠습니다.

+0

마치 심지어 가능하다면 이것은 매우 복잡해 보입니다. 이 기능에 대해 생각하는 기능면에서 실제로 무엇을 달성하려고합니까? –

+0

service.apk는 리소스를 사용하는 경우에만 가능하며 리소스를 사용하여 상태 표시 줄에 알림을 표시합니다 (드롭 다운 메뉴 제외). 그 service.apk를 동적으로로드해야하고 여전히 알림을 표시해야합니다 ... –

+0

하지만 서비스 apk를 동적으로로드하면 무엇을 얻을 수 있습니까? 당신이 상상하는 것을하지는 않을 것입니다. –

답변

0

다른 apk에서 자원을 얻으려면, getResourcesForApplication()을 사용해야합니다. 주 APK에는 생성 된 아이콘이 없으므로 R 클래스이지만 서비스는 하나입니다. 불행하게도

Resources res = packageManager.getResourcesForApplication("com.your_service"); 
Drawable icon = res.getDrawable(iconId); 

, 나는 그냥 통지 iconId을 통과 할 수 없을 거라고 생각하고 당신은해야합니다 : 그래서, 당신은 리소스에 액세스하려는 때마다 서비스에, 그것과 같아야합니다 알림에 사용하기 전에 리소스를 직접로드하십시오 (예 : RemoteViews 설정 및 Notification.Builder.setContent() 사용).

+0

serviceImpl.apk는 상태 표시 줄에 아이콘을 게시하는 것으로서 resource-id를 전달해야합니다. 그래서 리소스가 APK에 존재하기 때문에 리소스를로드해서는 안됩니다. –

+0

나는 당신의 추측이 잘못되었다고 생각합니다. 다른 앱 컨텍스트에서 서비스를 시작하면 설명 된대로 작동합니다. 지금 가능한 솔루션 만 - 리소스를 직접로드하려면 ID가 작동하지 않습니다. 주 앱에 표시되지 않기 때문입니다.PathClassLoader를 사용하지 않고 일반적인 방법 (예 : 인 텐트)을 사용하여 서비스를 시작할 필요가 없을 것입니다. 그러면 리소스 ID에 문제가 없습니다. – sandrstar

+0

해당 서비스를로드하려면 동적로드를 사용해야합니다. 그것이 요청입니다. –

1

다음과 같은 오픈 소스 프로젝트를 참조 할 수 있습니다 : https://github.com/singwhatiwanna/dynamic-load-apk/blob/master/README-en.md

다음 키의 생각은 다음과 같습니다 첫째, APK는이 SDCARD 또는 시스템 디렉토리에 있는지 무시, 호스트 안드로이드 응용 프로그램에서로드 할 수 있습니다. 그러나 우리는 어떻게 이것을 할 수 있습니까? 자원과 활동의 생명주기 두 가지 문제를 해결할 필요가있다. 위의 프로젝트는이 두 가지 문제를 해결합니다. 리소스를 사용하는 동적으로 apk를로드 할 수 있으며, DexClassLoader를 사용하고 새로운 AssetManager를 제공하여 요구를 충족시킬 수 있습니다.

protected void loadResources() { 
    try { 
     AssetManager assetManager = AssetManager.class.newInstance(); 
     Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); 
     addAssetPath.invoke(assetManager, mDexPath); 
     mAssetManager = assetManager; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Resources superRes = super.getResources(); 
    mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(), 
      superRes.getConfiguration()); 
    mTheme = mResources.newTheme(); 
    mTheme.setTo(super.getTheme()); 
} 

다음으로 리소스는 R 식별자로 방문 할 수 있습니다. getResource를 사용하십시오.

+1

은이 오픈 소스 프로젝트가 무엇을하고 어떻게 도움이되는지에 대한 정보를 조금 더 제공하면 좋을 것입니다. – JackDev

관련 문제