2015-06-19 10 views
20

Mam trochę nietypowy problem - moja aplikacja na Androida zawiera natywne biblioteki i buduję natywne biblioteki dla armeabi-v7a i x86. Jednak teraz muszę zintegrować bibliotekę stron trzecich z moją aplikacją, która zawiera również biblioteki natywne (trzecia biblioteka to Crashlytics, którą zawarłem za pośrednictwem Maven z mojego build.gradle). Problem polega na tym, że AAR biblioteki strony trzeciej zapewnia wszystkie arhitectures (armeabi, arm64-v8a, armeabi-v7a, mips, mips64, x86 i x86_64), a moja aplikacja obsługuje tylko armeabi-v7a i x86 (arm64-v8a jest planowana na najbliższą przyszłość) , więc gdy budowany jest końcowy plik APK, zawiera on wszystkie biblioteki ABI i tylko x86 oraz ABI armeabi-v7a mojego natywnego kodu. Powoduje to awarię mojej aplikacji po uruchomieniu na urządzeniu arm64, takim jak Galaxy S6.Jak importować tylko wybrane ABI ABI z natywnej biblioteki z AAR?

Moje pytanie brzmi: czy możliwe jest włączenie tylko wybranych ABI z AAR trzeciej strony?

Należy pamiętać, że jestem świadomy APK splits, ale to rozwiązuje tylko częściowo mój problem, tj. Działa tylko wtedy, gdy rozpowszechniam moją aplikację za pośrednictwem Sklepu Play. Mimo że Play Store obsługuje dystrybucję testów beta, propagacja zaktualizowanego pliku APK jest raczej powolna, więc wcześniej przesyłając aktualizację do kanału beta PlayStore aplikacji, przesyłająśmy aktualizację za pośrednictwem systemu dystrybucji beta Crashlytics, który jest znacznie szybszy. Problem polega na tym, że system dystrybucji Crashlytics nie obsługuje splitów APK (czy też nie mam racji?). Dlatego muszę zbudować "uniwersalny" pakiet APK, który będzie zawierał tylko wybrane ABI. Jak to osiągnąć?

Chociaż byłbym zadowolony nawet z odpowiedzi specyficznych dla Crashlytics (jak na przykład, jak dystrybuować split APK za pośrednictwem swojego kanału beta), byłbym bardziej zadowolony z rozwiązania do budowania "uniwersalnego" pakietu APK, który zawiera tylko wybrane ABI, ponieważ w naszej firmie udostępniamy naszym klientom także pakiety SDK jako archiwa AAR, które zawierają tylko obsługiwane architektury. Chcielibyśmy im przekazać instrukcje postępowania w przypadku, gdy integrują nasz pakiet SDK z innymi pakietami SDK, które mają obsługiwane różne ABI.

Używam najnowszego stabilnego studia Android (1.2.1.1), gradle 2.4 i android gradle w wersji 1.2.3.

+0

Zobacz czy 'ndk.abiFilter' w smaku produktu /' defaultConfig' DSL pozwoli Ci określić wiele elementów. Przykłady, które widzę, wymieniają tylko jeden. Jeśli akceptuje listę rozdzielaną przecinkami, prawdopodobnie rozwiąże ona Twój problem. – CommonsWare

+0

Próbowałem dokładnie tego prirora zadając pytanie tutaj na stackoverflow. Wystąpił błąd gradulacyjny, jeśli określę wiele ABI w abiFilter, mówiąc, że metoda DSL "abiFilter" nie istnieje. Próbowałem nawet wstawiać wiele ABI wewnątrz jednego ciągu do abiFilter, ale to też nie działało - w ogóle robiło APK bez natywnych bibliotek. – DoDo

Odpowiedz

17
packagingOptions { 
    exclude 'lib/arm64-v8a/libcrashlytics-envelope.so' 
    exclude 'lib/arm64-v8a/libcrashlytics.so' 
    exclude 'lib/armeabi/libcrashlytics-envelope.so' 
    exclude 'lib/armeabi/libcrashlytics.so' 
    exclude 'lib/mips64/libcrashlytics-envelope.so' 
    exclude 'lib/mips64/libcrashlytics.so' 
    exclude 'lib/mips/libcrashlytics-envelope.so' 
    exclude 'lib/mips/libcrashlytics.so' 
    exclude 'lib/x86_64/libcrashlytics-envelope.so' 
    exclude 'lib/x86_64/libcrashlytics.so' 
    } 
+0

Dobry pomysł! Spróbuję to jak najszybciej. – DoDo

+0

Działa to jak czar i rozwiązuje mój problem. Jednak byłoby lepiej, gdyby działało to z użyciem symboli wieloznacznych ... – DoDo

+0

Symbole wieloznaczne nie działają. – mksaint13

3

Mike z Fabric i Crashlytics tutaj. W przypadku Splits, obecnie nie wiemy z góry, która gęstość zapewnia tester, więc po prostu dodaj tę linię do swojego konkretnego smaku lub wariantu, aby użyć uniwersalnego generowanego pliku APK.

ext.betaDistributionApkFilePath = „ścieżka do powszechnego podziału APK”

Ponadto, jeśli używasz raportowanie awarii NDK, w przypadku meczy katastrofę jesteś widzenie, check out this link.

+0

Cześć Mike! Rozprowadzamy już uniwersalny split APK za pośrednictwem Crashlytics. Czy możliwe jest rozdzielanie dystrybucji x86 i armv7 osobno, tak jak za pośrednictwem PlayStore - poprzez określenie różnych kodów wersji dla różnych podziałów? Czy Twoja aplikacja Beta może następnie zdecydować, którą wersję APK pobrać i zainstalować na urządzeniu? Zgłaszanie awarii działa poprawnie z podziałem APK, pod warunkiem, że są dystrybuowane za pośrednictwem PlayStore, a nie za pośrednictwem Crashlytics Beta. Idealnie chciałbym powiedzieć gradle, aby używał tylko natywnych bibliotek armv7 i x86 z twojego AAR. – DoDo

+0

Dzięki za te dodatkowe szczegóły, teraz nie mamy sposobu, aby to wspierać, ale podzielam ten pomysł z zespołem. –

+0

@MikeBonnell jest betaDistributionApkFilePath nadal obsługiwane? Muszę ustawić niestandardowe nazwy apk, ale także przesłać do fabric/crashlytics .. Zapewniam, że opcja betaDistributionApkFilePath jest ustawiona przed uruchomieniem: app: crashlyticsUploadDistribution {$ variant.name}? – speedynomads

-3

miałem ten sam problem co ty, ale faktycznie pomogłeś mi z linkiem, który opublikowałeś o APK Splits! W twoim przypadku, spróbuj dodać następujące swojej build.gradle wewnątrz zamknięcia android:

splits { 
     abi { 
      enable true 
      reset() 
      include 'armeabi-v7a', 'x86' 
      universalApk true 
     } 
    } 

Sztuką tam jest ustawienie universalApk do true aby wygenerować tylko jeden plik APK z wszystkich zdefiniowanych architektur zamiast dzielić je na kilka pakietów APK.

+0

To nie działa. W mojej aplikacji umieściłem "x86", "armeabi-v7a", "arm64-v8a", ale mój uniwersalny plik APK nadal zawiera "armeabi", "mips", "mips64" i "x86_64". Chcę tylko "x86", "armeabi-v7a" i "arm64-v8a" w moim uniwersalnym pakiecie APK. – DoDo

+0

Działa to dobrze dla mnie ... Używam wtyczki Android Gradle 1.3.1, docelowego SDK 22 i Build Tools w wersji 23.0.2. Zmienia także nazwę końcowego pliku apk, teraz powinno być nazywane " -universal- .apk". Powinieneś także mieć jedną na bibliotekę, taką jak "-x86- .apk" (to nie są te, które chcesz). Więc może próbujesz użyć starego pliku, jeśli nie zrobiłeś czystego? –

+0

Jorge, jeśli rozpakujesz " -universal- .apk", jaka jest zawartość folderu "lib" wewnątrz pliku APK? Dla mnie ten folder zawiera architektury, których nie chcę (takie jak "mips" i "armeabi"), mimo że zawierałem tylko "armeabi-v7a" i "x86". – DoDo

11

Działa to dla mnie:

(np: tylko armeabi & armeabi-v7a)

build.Gradle

android{ 
    defaultConfig{ 
     ndk{ 
      abiFilters "armeabi", "armeabi-v7a" 
     } 
    } 
} 

gradle.properties

android.useDeprecatedNdk=true; 
+2

Praca bez dodawania ustawień gradle.properties – sham

Powiązane problemy