Maven Central nie jest tak wolny, jakby się wydawał

F-Droid jest zawsze zaangażowany w dystrybucję aplikacji FOSS na Androida. Budowanie wolnego oprogramowania ze źródeł dla Androida wiąże się z innym zestawem wyzwań niż dystrybucje GNU/Linux, takie jak Debian. Aplikacje na Androida są skompilowane krzyżowo: nie są zbudowane na tym samym systemie operacyjnym, w którym działają. Co więcej, Android udostępnia tylko zestaw wbudowanych bibliotek. Podobnie jak ekosystem Java, oczekuje się, że aplikacje będą pobierać pliki binarne z bibliotek z repozytoriów Maven i wbudowywać je w aplikację. Aby upewnić się, że aplikacja jest zbudowana tylko z depsami FOSS, opracowujemy system skanowania w fdroidserver, aby ograniczyć źródło zależności i znaleźć problematyczne zależności.

F-Droid zabrania nieznanych repozytoriów Maven i ufa tylko niektórym dobrze znanym repozytoriom Maven od 2015. Od tego czasu, trochę więcej repos repozytoriów zostało dodanych do listy. Obecnie istnieje 8 repozytoriów Maven, którym ufamy:

  • Centrum Maven
  • Repozytorium Google Maven
  • JCenter
  • OSS Sonatype
  • OSS JFrog
  • JitPack.io
  • Clojars
  • CommonsWare
  • Repozytorium wtyczki Gradle

W 2020 r. pliki JAR i AAR osadzone w kodzie źródłowym były zakazane, a te zaufane repozytoria stały się ostatnim słabym punktem. Polegamy na nich, aby dostarczać tylko biblioteki FOSS. Jednak żaden z nich nie ma gwarancji, że to zrobi i były dużym źródłem niewolnych bibliotek wkradających się do APK.

Repozytorium Maven Central to “największa kolekcja Java i innych komponentów o otwartym kodzie” i domyślne źródło biblioteki dla Maven i Gradle “Serving Open Source Components od 2002”. Zdecydowana większość bibliotek używanych w aplikacjach na Androida, poza bibliotekami Google, jest pobierana z Maven Central. To jedno z najbardziej uznanych i znanych repozytoriów Mavena. Maven Central ma ścisłe wymagania dotyczące kodu źródłowego oraz informacji o systemie kontroli źródła i należy zadeklarować licencję. Wymaga również, aby identyfikator grupy był zgodny z domeną właściciela, a pliki powinny być podpisane. Co więcej, Maven Central obsługuje powtarzalne kompilacje w sposób pierwszorzędny, co jest bardzo pomocne w zapewnieniu, że aplikacje są w 100% bezpłatnym oprogramowaniem.

Wszystko brzmi zbyt dobrze, aby mogło być prawdziwe. Niestety tak jest. Chociaż deklarują, że Maven Central to “Hosting repozytorium OSS”, nie wymagają, aby hostowane tam biblioteki były FOSS. Czasami okazuje się, że (https://gitlab.com/fdroid/fdroidserver/-/issues/628) niewolna biblioteka została pobrana z Maven Central i musi wyłączyć wiele wersji opublikowanych aplikacji, których dotyczy problem.

Czy te biblioteki o otwartym kodzie hostowane na Maven Central są godne zaufania? Nie, nie bardzo. Niektóre biblioteki są oznaczone licencją FOSS, ale źródłowe pliki JAR są puste. Co gorsza, zachęcają nawet do przesyłania fałszywego źródłowego pliku JAR ze źródeł, w celu spełnienia wymagań, co sprawia, że ich wymagania są całkowicie bezsensowne. Zadeklarowane informacje o licencji mogą po prostu być złe i informacje o systemie kontroli źródła tylko wskazują na losowy link lub repo tylko z plikami jar. Innym częstym przypadkiem jest to, że sama biblioteka jest „open source”, ale zależy od innych zastrzeżonych bibliotek.

Inne zaufane repozytoria Maven również mają problemy. Biblioteka Google obsługuje oczywiście wiele zastrzeżonych bibliotek, a biblioteki o otwartym kodzie mogą zależeć od tych zastrzeżonych. Repozytoria OSS Sonatype i JCenter są zsynchronizowane z Maven Central i zawierają dodatkowe biblioteki. JitPack.io obsługuje wszystko, co jest zbudowane z GitHub, bez sprawdzania licencji lub jeśli w repozytorium znajduje się jakakolwiek binarna, nie mówiąc już o zależnościach. Repo wtyczek Clojars i Gradle również nie wymaga licencji. Pakiety java z Debiana i repozytorium CommonsWare są całkiem w porządku, ale rzadko używane.

Biorąc pod uwagę nasze ograniczone zasoby i sytuację, może to być niekończąca się walka. Ale dostajemy więcej broni. Dzięki naszemu skanerowi binarnemu znaleźliśmy wiele bibliotek, które zależą od niewolnych dep w tych repozytoriach Maven, z których większość pochodzi z Maven Central. W przyszłości możemy przeskanować mapę zależności, aby znaleźć je przed kompilacją. Jednak nie może to pomóc w znalezieniu bibliotek z niewolną licencją. Te niewolne biblioteki na naszej liście bloków są w większości znajdowane przez przypadek i doświadczenie. Obecnie pracujemy nad bardziej niezawodnymi metodami na przyszłość.