ATAK (Android Team Awareness Kit) oraz jego desktopowy odpowiednik WinTAK to faktyczny standard taktycznych aplikacji świadomości sytuacyjnej używanych w siłach USA i NATO, sojuszniczych armiach, a coraz częściej także przez cywilne służby ratownicze. Renderują wspólny obraz operacyjny (COP), wymieniają wiadomości Cursor-on-Target (CoT) przez serwer TAK, zarządzają nakładkami mapowymi i udostępniają otwarte SDK dla wtyczek. Dla inżynierów oprogramowania obronnego budowa wtyczki ATAK lub WinTAK to zazwyczaj najszybsza droga do dostarczenia zdolności w terenie — o rzędy wielkości szybsza niż wydanie samodzielnej aplikacji taktycznej.

Ten artykuł to przewodnik inżynierski: od pustego projektu Android Studio do podpisanej, dystrybuowalnej wtyczki, która przetrwa dzień prawdziwego operatora. Zakłada, że poprosiłeś i otrzymałeś ATAK-CIV SDK z tak.gov oraz że masz instancję serwera TAK, z którą możesz się połączyć.

Dlaczego wtyczki ATAK/WinTAK

Strategiczny powód, by budować wtyczkę zamiast samodzielnej aplikacji, to dźwignia. ATAK już rozwiązał trudne problemy: renderowanie map ze źródeł wektorowych i rastrowych, obsługę GPS, integrację radia, wiadomości CoT, multicast discovery, szyfrowany transport TAK Server, tożsamość użytkownika i model nawigacji, na którym operatorzy szkolą się od lat. Wtyczka dziedziczy to wszystko za darmo.

Taktyczny powód to adopcja. Operator, który już używa ATAK na Samsungu S22 Tactical Edition lub Galaxy XCover w uprzęży na klatce piersiowej, zainstaluje kolejną wtyczkę w kilka sekund. Przekonanie tego samego operatora do zainstalowania, nauczenia się i zaufania drugiej samodzielnej aplikacji taktycznej to znacznie bardziej oporna ścieżka. Wtyczki korzystają z istniejącej powierzchni zaufania. Dla nowych czujników, przepływów pracy specyficznych dla misji, integracji dronów lub translatorów wiadomości specyficznych dla NATO wtyczka jest niemal zawsze właściwą formą dostarczenia.

ATAK to platforma, a nie tylko aplikacja. Traktowanie go jako platformy — a twojego kodu jako uczestnika kontraktów tej platformy — to zmiana sposobu myślenia wymagana do dostarczania wtyczek przechodzących przegląd operatora.

ATAK-CIV vs ATAK-MIL

Istnieją dwie edycje ATAK, które interesują autora wtyczek. ATAK-CIV to wersja cywilna dystrybuowana przez Google Play oraz tak.gov, do nieograniczonego użytku. ATAK-MIL to wariant wojskowy utrzymywany przez U.S. Army DEVCOM C5ISR Center, dystrybuowany wyłącznie kanałami kontrolowanymi do upoważnionych jednostek.

Z perspektywy SDK obie dzielą wspólne API wtyczek — to samo AbstractPlugin, ten sam MapView, ten sam CotEventDispatcher. Różnice istotne dla inżyniera wtyczki: ATAK-MIL zawiera adaptery danych niejawnych, symbologię wojskową (w pełni wypełniony MIL-STD-2525D), sterowniki radiowe SRW, ANW2C, bramy Link 16 oraz kontrole bezpieczeństwa, które bramkują ładowanie wtyczek przez klucz podpisujący. Wtyczka skompilowana przeciwko ATAK-CIV załaduje się przeciwko ATAK-MIL pod warunkiem zgodności wersji API i podpisania zatwierdzonym kluczem — ale założenia UI i zdolności mogą się zepsuć, jeśli zależysz od widgetów istniejących tylko w jednej edycji.

Prototypuj na ATAK-CIV. SDK jest otwarte, wymagania sprzętowe są niższe i możesz iterować przeciwko publicznemu serwerowi TAK. Gdy zdolność jest sprawdzona, przenieś na ATAK-MIL: podpisz ponownie zatwierdzonym wojskowym łańcuchem podpisującym, zwaliduj przeciwko docelowej wersji API i przetestuj ponownie na rzeczywistych urządzeniach końcowego użytkownika (typowo Samsung klasy EUD lub puck displays Persistent Systems MPU5).

Szkielet projektu

Wtyczka ATAK to moduł biblioteki Android z określonym kontraktem manifestu. Zacznij od projektu Gradle plugin-template dostarczanego w ATAK-CIV SDK. Istotne zależności: main.jar z SDK (API ATAK), plugin Gradle gradle-atak-plugin oraz biblioteki AndroidX przypięte do wersji, z którymi sam ATAK jest dostarczany — niezgodność wersji to częsta przyczyna NoSuchMethodError w runtime.

AndroidManifest.xml musi deklarować metadane deskryptora wtyczki: com.atakmap.app.component wskazujący na twoją podklasę AbstractPlugin, wersję API, na którą celuje wtyczka, oraz wymagane uprawnienia. ATAK używa manifestu do wykrycia i załadowania wtyczek; niepoprawny deskryptor to najczęstszy powód, dla którego wtyczka nie pojawia się w menedżerze wtyczek ATAK.

Hooki cyklu życia żyją w AbstractPlugin (w nowszych wersjach SDK także jako IPlugin). onCreate(Context, MapView) to miejsce rejestracji narzędzi, drop-downów, warstw i listenerów. onDestroyImpl to miejsce, gdzie musisz je wyrejestrować — niepowodzenie powoduje wycieki listenerów między przeładowaniami wtyczki, co jest realnym scenariuszem podczas aktualizacji operatora. onConfigurationChanged obsługuje rotację urządzenia i zmiany motywu. Traktuj metody cyklu życia jak cykl życia Activity Android: zakładaj, że mogą być wywołane wielokrotnie w nieoczekiwanej kolejności.

Kompatybilność wersji API jest wymuszana w momencie ładowania. ATAK 4.x do 5.x dostarczył łamiące zmiany API; przypnij PluginAPI w manifeście do najniższej wspieranej wersji i testuj przeciwko każdemu wydaniu pomniejszemu w docelowym wdrożeniu. Macierz kompatybilności w README — "ta wtyczka: ATAK-CIV 4.10 do 5.2, ATAK-MIL 5.0+" — to kontrakt, do którego operatorzy będą cię rozliczać.

Integracja CoT

Cursor-on-Target (CoT) to format wiadomości XML, którym posługuje się każdy uczestnik ekosystemu TAK. Każde zdarzenie CoT ma UID, kod typu (hierarchiczny ciąg taki jak a-f-G-U-C-I dla przyjaznej jednostki naziemnej, bojowej, piechoty), punkt (szerokość/długość/wysokość), czas, czas wygaśnięcia i dowolnych potomków szczegółów. Wtyczki emitują CoT, aby raportować kontakty czujnikowe, misje, geofence i niestandardowe typy tracków; konsumują CoT, aby reagować na zdarzenia generowane przez operatora lub inne systemy.

Dwa istotne API: CotMapComponent udostępnia centralny CotEventDispatcher dla zdarzeń przychodzących, a CotMapComponent.getInternalDispatcher() plus CommsMapComponent.getInstance().sendCoT(event) — dla wychodzących. Zarejestruj CotEventListener w onCreate, filtruj po prefiksie typu i dyspozycjonuj do logiki domenowej wtyczki. Dla zdarzeń wychodzących buduj CotEvent programowo — nie konkatenuj ciągów XML. Operatorzy tracili ikony tracków z powodu zniekształconego XML produkowanego przez szablonowanie ciągów.

Walidacja schematu zapobiega uszkodzeniu danych taktycznych. Waliduj każde przychodzące zdarzenie CoT względem oczekiwanego schematu szczegółów przed zaufaniem jego zawartości — kod typu, granice punktu (szerokość 9000 to bug parsera gdzieś w górnym strumieniu, którego nie chcesz propagować na swoją nakładkę) oraz monotoniczność czasu wygaśnięcia. CoT jest z założenia permisywny; defensywne parsowanie to odpowiedzialność autora wtyczki.

Wtyczki warstw mapowych

Pojedynczy najczęstszy wzorzec wtyczki ATAK to dodanie niestandardowej nakładki mapowej: telemetria drona, zasięg sygnału EW (walka elektroniczna), wachlarze ognia artylerii własnej, strefy zakazu rażenia, szacunki zasięgu radiowego sieci mesh. Stos mapowy ATAK to GLMapView (OpenGL ES) z modelem kolejności warstw opartym na całkowitym z-order plus grupach widoczności.

Dodawaj warstwy podklasując AbstractLayer dla danych wektorowych lub rozszerzając TileClientControl dla nakładek rastrowych. MapItem to jednostka treści interaktywnej — markery, kształty, prymitywy rysunkowe — i ma pełny cykl życia: onMapItemEvent jest wywoływany dla kliknięć, przeciągnięć, usunięć i zmian widoczności. Długo żyjące wtyczki muszą usuwać swoje MapItemy w onDestroyImpl; osierocone elementy utrzymują się między przeładowaniami wtyczki i dezorientują operatorów.

Wydajność liczy się bardziej, niż ludzie się spodziewają. Tysiące cech jednocześnie to norma — szerokopasmowy feed ISR łatwo produkuje 5000 do 20000 widocznych tracków. Klastruj agresywnie, używaj Marker.setVisible(false) zamiast usuwania/odtwarzania, a ciężką matematykę (bufory geodezyjne, obliczenia viewshed) przenoś poza wątek UI. Osiągaj 60fps na Samsungu S22 Tactical; jeśli nie potrafisz, twoja wtyczka zostanie odinstalowana.

Dyscyplina UI

Konwencje UI ATAK istnieją z powodu: operator w rękawicach, w słabym świetle, być może pod ostrzałem, nawiguje pamięcią mięśniową. Drop-Downy (przesuwany panel po prawej) to kanoniczny sposób ujawniania UI wtyczki. Rozszerz DropDownReceiver, zarejestruj akcję intent i pozwól ATAK zarządzać cyklem życia show/hide. Nie otwieraj własnych okien dialogowych nad mapą — psują stos gestów mapy i dezorientują operatorów.

Umiejscowienie w menu nawigacyjnym jest zarządzane przez rejestrację narzędzi. Użyj ToolbarBroadcastReceiver lub nowszego API panelu wtyczek, aby umieścić swój punkt wejścia w prawym pasku narzędzi lub tacy nadmiarowej. Nazewnictwo ma znaczenie: krótkie czasowniki ("Track", "Mark", "Scan"), nie rzeczowniki ("Tracking Manager"). Ikony muszą być czytelne przy 24dp na 5-calowym ekranie w bezpośrednim słońcu — to znaczy wysoki kontrast, pojedynczy kształt pierwszego planu, brak gradientu.

Tryb ciemny to jedyny tryb. Domyślny motyw ATAK jest zbudowany pod operacje w słabym świetle i kompatybilność z noktowizją. Nigdy nie wprowadzaj białego tła w Drop-Downie — zalewa optykę NV operatora i ogłasza jego pozycję. Używaj stałych motywu ATAK (atakmap.android.R.style.ATAK_TextAppearance i podobnych), aby twoje widgety podchwyciły preferowany profil operatora, w tym tryb czerwonego światła kompatybilny z NVG.

Podpisywanie i dystrybucja wtyczek

ATAK wymusza podpisywanie wtyczek jako bramkę w momencie ładowania. Każde APK wtyczki musi być podpisane kluczem, któremu ufa działająca instalacja ATAK. ATAK-CIV jest dostarczany z permisywnym magazynem zaufania akceptującym klucz debug oraz mały zestaw kluczy społecznościowych; ATAK-MIL akceptuje tylko klucze wydane przez kontrolującą władzę wojskową. Planuj podpisywanie wcześnie — ponowne podpisanie wtyczki będącej już w rękach operatorów wymaga ponownej dystrybucji.

Łańcuch podpisywania to standardowy Android: keytool do generowania keystore, jarsigner lub Gradle signingConfigs do podpisania APK, apksigner v2/v3 do weryfikacji. ATAK weryfikuje podpis w momencie ładowania i wyświetla "Plugin signature invalid" w menedżerze wtyczek przy niepowodzeniu — ogólny błąd, który w praktyce niemal zawsze oznacza niezgodność klucza lub niezgodność wersji APK Signature Scheme.

Ścieżki dystrybucji zależą od edycji. Wtyczki ATAK-CIV dystrybuują się przez Play Store, tak.gov lub sideload przez pobieranie URL w menedżerze wtyczek. Wtyczki ATAK-MIL dystrybuują się przez wojskowe sklepy aplikacji (repozytoria NIPRNet/SIPRNet, kanały MDM specyficzne dla jednostki) z cyklami walidacji trwającymi tygodnie. Przypinanie wersji jest kontraktowe: wdrożenie MDM zazwyczaj blokuje zarówno wersje ATAK, jak i wtyczki, a aktualizacja wtyczki poza tym cyklem nie jest opcją po wdrożeniu rotacji.

Realia produkcyjne

Bateria to pierwsze ograniczenie produkcyjne. Wtyczka budząca GPS co sekundę lub trzymająca częściowy wake-lock wyczerpie baterię EUD przed zakończeniem czterogodzinnego patrolu. Profiluj Android Battery Historianem, preferuj istniejące usługi lokalizacji ATAK (które już deduplikują fixy między wtyczkami) i nigdy nie planuj pracy w tle niezależnie od intencji operatora.

Praca w warunkach niskiej sieci to drugie. ATAK jest zaprojektowany do operowania rozłączony i sporadycznie połączony; każda wtyczka zakładająca dostępność IP zawodzi w momencie, gdy operator odejdzie od FOB. Kolejkuj pracę wychodzącą na dysk, opróżniaj przy ponownym połączeniu i degraduj się płynnie — wzorce są takie same jak w aplikacjach wojskowych offline-first oraz stosie map offline MBTiles/PMTiles, którego używa sam ATAK.

Telemetria to trzecie ograniczenie i najbardziej restrykcyjne. OPSEC wymaga, by wtyczki nie dzwoniły do domu — ani do twojego endpointu analitycznego, ani do reportera awarii, ani do serwera licencji. Wpisuj telemetrię do lokalnego pliku logu, który ATAK już prowadzi, ujawniaj ją przez eksport bundle debug ATAK i pozwól jednostce zdecydować, czy się dzielić. Instynkt, by wprowadzić Firebase Crashlytics do wtyczki taktycznej, zakończy autoryzację wdrożenia wtyczki.

Cykle wsparcia dostosowują się do kadencji wydań ATAK, nie twojej mapy drogowej. ATAK-CIV wydaje się mniej więcej kwartalnie; ATAK-MIL wydaje się na osiach wojskowych, które mogą rozciągnąć pojedynczą wersję na 18 miesięcy. Utrzymuj kroczące okno wsparcia — bieżąca wersja plus dwie poprzednie wersje pomniejsze to zrównoważony kontrakt — i traktuj release notes ATAK jako obowiązkowy input do planu regresji. Zdolność integrująca się z szerszymi systemami C2 lub zasilająca taktyczne łącza danych NATO przez wtyczkę jest tylko tak niezawodna, jak twoja dyscyplina wokół pociągu wydań ATAK.