2016-07-07 50 views
5

Wystąpił następujący problem: Aplikacja, którą zaimplementowałem, zawiera inny projekt jako zależność (typu aar). Oba projekty mają tę samą nadrzędną pom. Zależność obejmuje zasoby, z których korzysta aplikacja. Aby uzyskać dostęp do zasobów w projekcie bibliotecznym, identyfikator zasobu jest pobierany przez wywołanie context.getResources().getIdentifier(resourceKey, resourceType, packageName). Otrzymuję nazwę pakietu przez wywołanie getPackageName() na podanym obiekcie context. Przed zmianą nazwy pakietów projektów za pomocą

<renameManifestPackage>com.example.newpackagename</renameManifestPackage> 

dostępu do zasobów bibliotecznych działało. Ale po zmianie nazwy pakietu aplikacji otrzymuję android.content.res.Resources$NotFoundException, ponieważ wywołanie getIdentifier() nadal oczekuje starej nazwy pakietu aplikacji i wywołanie getPackageName() zwraca nowy (zgodnie z oczekiwaniami).
Teraz zastanawiam się, czy czegoś brakuje lub czy jest to błąd w pluginach androida?

Odpowiedz

2

Odpowiedź brzmi: coś przeoczyłem. Otworzyłem bilet dotyczący tego problemu na stronie projektu (https://github.com/simpligility/android-maven-plugin/issues/736). Okazało się, że to, co widziałem jako problem, to oczekiwane zachowanie konfiguracji renameManifestPackage, ponieważ zmiana nazwy nie tylko pakietu manifestu, ale także zasobów jest poza zakresem tej konfiguracji.

Istnieje jednak nie zbyt brzydki obejście tego:

Zamiast pobierania nazwy pakietu od obiektu Context, możliwe jest odzyskanie go z obiektu Resources. Nadchodzi część, gdzie robi się nieco brzydki: Zasób z pojedynczego celu pobierania nazwy pakietu musi zostać dodany, ponieważ inne środki są zwykle ulec zmianie:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <!-- The only purpose of this resource is to retrieve the resource package name --> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

Teraz można pobrać nazwę pakietu zasób w następujący sposób:

Resources resources = context.getResources(); 
String packageName = resources.getResourcePackageName(R.id.used_for_package_name_retrieval); 

zasługa: http://www.piwai.info/renaming-android-manifest-package/