2016-10-19 47 views
5

Próbuję dodać obsługę Crashlytics do mojego projektu Android, który używa NDK i gradacja CMake. Oznacza to, że potrzebuję symboli dla moich wspólnych projektów. Więc jeśli chcę tworzyć symbole kompilacji uwalniania Zadzwonię gradlew crashlyticsUploadSymbolsReleaseCrashlytics NDK symbol budynku z linii poleceń

Oficjalny dokument w https://docs.fabric.io/android/crashlytics/ndk.html mówi, że Proces generacji symbol i przesłać zakłada standardową strukturę projektu: src/main/obj debugowania dla plików binarnych, a src/main/libs dla plików binarnych wydań produkowanych przez ndk-build.

W pliku Gradle oznacza to nowy blok, który jest jak następuje:

crashlytics { 
    enableNdk true 
    androidNdkOut 'src/main/obj' 
    androidNdkLibsOut 'src/main/libs' 
} 

Ponieważ używam Gradle integrację CUpewnij budować moje rodzimych bibliotekami, ścieżki domyślne oczywiście nie działają. Moje natywne biblioteki w trybie zwolnienia są wbudowane w katalog build/intermediates/cmake/release/obj, aw trybie debugowania przechodzą do katalogu build/intermediates/cmake/debug/obj.

Od prób i błędów doszedłem do wniosku, że jeśli chcę, aby moja kompilacja wydania zadziałała, będę musiał umieścić ścieżkę do bibliotek rodzimych w trybie zwolnienia w obie linie, jak pokazano poniżej.

crashlytics { 
    enableNdk true 
    androidNdkOut 'build/intermediates/cmake/release/obj' 
    androidNdkLibsOut 'build/intermediates/cmake/release/obj' 
} 

ja po prostu naprawdę nie rozumieją różnicy między androidNdkOut i androidNdkLibsOut zmiennych, bo przynajmniej w moim scenariuszu wskazują one na tym samym katalogu. Na szczęście nie stanowi to dla mnie problemu, ponieważ potrzebuję Crashlytics do pracy z plikami binarnymi.

Więc moje pytania to:

1) Jaka jest naprawdę różnica między androidNdkOut i androidNdkLibsOut? Dlaczego nie mogę umieścić ścieżki do plików binarnych debugowania w jednym i ścieżki do wydania plików binarnych innym? Konkretny przykład byłby miły, oprócz wyjaśnień.

2) Jak powinienem zmodyfikować mój plik gradle, jeśli pewnego dnia chcę dołączyć symbole do moich bibliotek debugowania? Co oznacza, że ​​polecenie gradlew crashlyticsUploadSymbolsRelease oraz gradlew crashlyticsUploadSymbolsDebug zadziała?

Istnieje dyskusja na ten temat w wątkach Crashlytics NDK symbols and Gradle tasks i Crashlytics NDK multi androidNdkOut path support, ale tak naprawdę nie odpowiadają na te dwa pytania.

+0

Czy otrzymałeś numery linii? Gdzie znalazłeś rozpakowane pliki binarne? Te ścieżki, które podałeś, zawierają tylko obnażone. Tak, nie? – urSus

Odpowiedz

3

Pracuję w zespole Fabric, który obsługuje naszą obsługę Crashlytics NDK.

Aby podać pewien kontekst, nasze narzędzie do przesyłania symboli jest oparte na procesie ndk-build, który tworzy 2 zestawy plików binarnych: pliki binarne produkcji, które są pozbawione danych symboli i debugowania plików binarnych, które mają dane symboli nienaruszone do celów debugowania.

Własności Gradle map do zmiennych w procesie ndk-build, a konkretnie:

  • androidNdkOut jest katalog pod którym unstripped, binarne debugowania są umieszczone (odpowiednik zmiennej w ndk-build$NDK_OUT) nazywa obj domyślnie.
  • androidNdkLibsOut to katalog, w którym domyślnie są usuwane pliki binarne wydania (równoważne zmiennej $NDK_LIBS_OUT w ndk-build) o nazwie libs.

Oczekiwane zawartość tych ścieżek są architektura specyficzne katalogi dla bibliotek, więc na przykład:

obj/ 
    — armeabi 
    — lib1.so 
    — lib2.so 
    — x86 
    — lib1.so 
    — lib2.so 

libs/ 
    — armeabi 
    — lib1.so 
    — lib2.so 
    — x86 
    — lib1.so 
    — lib2.so 

Wszystko trzeba zrobić dla naszego symbolu przesłaniu do pracy jest, aby wygenerować te te same zestawy plików binarnych od CMake, a następnie ustaw twoje androidNdkOut i androidNdkLibsOut do odpowiednich katalogów najwyższego poziomu, gdzie można znaleźć te biblioteki.

EDIT/UPDATE 07 lipca 2017

Właśnie wydana wersja 1.23.0 wtyczki tkaniny do Gradle który obsługuje automatycznie rozdzielając odpowiednie ścieżki natywne biblioteki kiedy używasz wtyczki Android Gradle 2.2.0+ z DSL externalNativeBuild, więc nie musisz już ustawiać androidNdkOut i androidNdkLibsOut, jeśli korzystasz z najnowszej wtyczki do systemu Android Gradle. Sprawdź więcej informacji tutaj: https://docs.fabric.io/android/crashlytics/ndk.html#specifying-the-path-to-debug-and-release-binaries