Wskazówki dotyczące tworzenia aplikacji na Androida: Wyciągnięte wnioski

Opublikowany: 2022-03-11

Hej! Jestem Ivan i od jakiegoś czasu jestem programistą aplikacji na Androida. A przynajmniej tak się wydaje. Kiedyś (mówimy o 2009 r.) Android był tylko niemowlęciem i od tego czasu obserwowałem, jak Mały Zielony Człowiek rośnie. Obawiam się, że jakiś czas temu Android zdążył mnie przerosnąć.

W dzisiejszych czasach Android działa nie tylko na dziesiątkach tysięcy różnych telefonów i tabletów. Jest na twoim nadgarstku, w twoim salonie, w twoim samochodzie i jak tylko zaczniemy przypisywać adresy IP do obiektów nieożywionych, będzie prawie wszędzie wokół nas. Dużo miejsca, nawet dla doświadczonego programisty Androida!

Poza tym w samym Google Play jest ponad milion aplikacji, nie licząc Amazon AppStore czy rynków, którymi generalnie nie jesteśmy zainteresowani, takich jak Chiny. Nie zapominajmy o niezliczonych firmach zajmujących się tworzeniem aplikacji mobilnych, które każdego roku generują miliardowe przychody.

Jak więc niezależny programista może stworzyć odnoszącą sukcesy aplikację na tym ogromnym rynku z dużymi graczami? Nie mam pojęcia, nie stworzyłem udanej aplikacji! Ale zrobiłem uroczą i chciałbym podzielić się z tobą moją historią.

Lekcja 1: Połącz kropki

Sukces (zazwyczaj) nie następuje z dnia na dzień i nie jest to moja pierwsza aplikacja. Mam takie, od nieoczekiwanych , weekendowych hitów rozwojowych, takich jak macedoński kalendarz prawosławny , z ponad 30 000 użytkowników w języku, który może zrozumieć nie więcej niż 4 miliony ludzi, po bardziej udane porażki, takie jak TweetsPie , aplikacja o dużym nagłośnieniu w mediach i straszna baza użytkowników licząca nieco ponad 600 aktywnych użytkowników. Dużo lekcji!

Chociaż te aplikacje pomogły mi nieco lepiej zrozumieć umysł „nieuchwytnej istoty zwanej Użytkownikiem”, tym, który mnie zainspirował, był dwugodzinny projekt. Pierwotnie opracowany, aby uczynić mnie milionerem, gdy 1 428 571 użytkowników kupiło aplikację, ponieważ Google pobiera 30 centów z każdego dolara, aplikacja Dollar została stworzona, aby przetestować moje konto sprzedawcy.

Nie wiedziałam, że po latach otrzymam wiadomość e-mail od szczęśliwej mamy, w której stwierdzi, że to najlepszy dolar, jaki wydała, odkąd jej syn uśmiechał się za każdym razem, gdy moja aplikacja go przytulała.

Tworzenie aplikacji na Androida dla początkujących może być proste i przyjemne, gdy jest efektywnie skalowane.

I tak narodził się pomysł! Dlaczego nie wykorzystać podstawowej ludzkiej potrzeby przytulenia i nie sprawić, by była ładna? Stwórz ją dla określonej grupy odbiorców, interaktywną, wymagającą, przyjemną w użyciu i jeszcze przyjemniejszą w udostępnianiu.

Lekcja 2: Zrozumienie Android Market

Wszystkie rzeczy, o których wspomniałem powyżej, złożyły się na aplikację na żywo. Podstawy nie są trudne do odgadnięcia. Android ma większy udział w rynku niż iOS, ale użytkownicy iOS kupują więcej. Aplikacje do przesyłania wiadomości są szalenie popularne, ale gry freemium są najbardziej dochodowe. Chiny, Indie, Brazylia i Rosja to rynki wschodzące, ale brakuje im nawyków w zakresie wydatków. Więcej informacji znajdziesz w App Annie Index.

Jak więc pasuje do tego aplikacja na żywo? Przede wszystkim eliminuje większość platform, ponieważ tapeta na żywo to rzecz na Androida. Po drugie, ta funkcja została dodana w Androidzie 2.1, więc ma dużą społeczność i sporo pięknych przykładów. Przede wszystkim otwarte oprogramowanie Muzei firmy Paperland i Romana Nurika, prawdopodobnie najlepszy punkt odniesienia dla rozwoju Androida.

Chociaż istnieje wiele żywych tapet, większość z nich należy do kategorii scenicznej / pogodowej, a bardzo niewiele należy do kategorii przeciążenia bystrością . To jest coś, co chcieliśmy zmienić i zaoferować coś, co wywoła uśmiech za każdym razem, gdy odblokujesz telefon, nawet jeśli odblokowałeś go z zupełnie innego powodu. Daliśmy Ci uroczy mały pakiet radości, aby Cię przytulić przed pójściem spać w nocy lub gdy rano wyłączysz budzik. A jeszcze lepiej, spraw, aby był osobisty i konfigurowalny.

Bez zbędnych ceregieli, zanim przejdziemy do szczegółów technicznych, z dumą przedstawiam: Ooshies - Animowana tapeta

Ooshies to nazwa mojej aplikacji na Androida. Może się nie udało, ale pomogło mi nauczyć się lekcji potrzebnych do napisania tego przewodnika dla początkujących programistów Androida.

Zawiera:

  • darmowa aplikacja na żywo z tapetami, która daje przytulanie
  • 12 wyjątkowych oszów do wyboru
  • darmowe, odblokowane i do kupienia treści
  • aktualne aktualizacje pogody
  • logowanie społecznościowe i synchronizacja danych
  • życzenia świąteczne
  • wiele niespodzianek
  • kot ninja
  • czy wspomnieliśmy o uściskach?

Skuteczne aplikacje na Androida czasami po prostu wywołują uśmiech.

Lekcja 3: Postaraj się, aby to się stało

Ooshies wydawał się całkiem prostym pomysłem na aplikację na Androida. Pomaluj tło, nałóż chmury i gwiazdy, połóż misia z balonem na wierzchu i gotowe. Ale nie, to Android! To, co wydaje się łatwe, jest często dość trudne i mamy tendencję do powtarzania w kółko tych samych typowych błędów. Oto krótki przegląd wyzwań, z którymi się zmierzyłem:

  1. Akceleracja sprzętowa – po co rysować przy użyciu procesora, skoro GPU jest w tym o wiele lepszy? Okazuje się, że rysowanie bitmap na kanwie nie może być przyspieszane sprzętowo. Przynajmniej na razie nie.

  2. OpenGL - jeśli chcemy akceleracji sprzętowej, musimy użyć OpenGL ES lub jeszcze lepiej frameworka, który wykona większość pracy za nas.

  3. Ładowanie bitmap — dobrze znany problem ze zużyciem pamięci. Musimy przydzielić 1 bajt [0-255] pamięci dla każdego kanału w #ARGB, aby wyświetlić pojedynczy piksel. Również obrazy, których używamy, często mają wyższą rozdzielczość niż wyświetlacz urządzenia. Załadowanie ich wszystkich szybko spowoduje wyjątek OutOfMemroyException.

  4. Wyrzutnie domowe – animowane tapety będą hostowane w procesie uruchamiania domowego, a różne programy uruchamiające mają tendencję do zapewniania różnych wywołań zwrotnych do usługi tapet na żywo (w szczególności Nova i TouchWiz).

  5. Żywotność baterii — jeśli nie zostanie to zrobione prawidłowo, animowane tapety i widżety mogą zużywać dużo baterii. Z całym szumem o fatalnej żywotności baterii Lollipop (Android 5.0) pierwszą aplikacją, która zostanie uruchomiona, będzie tapeta na żywo.

Tak więc nakładanie bitmapy, malowanie jej na płótnie, a następnie przełączanie ramek dotykiem, aby się przytulić, nie wydaje się wielkim problemem, nawet jeśli odbywa się to na procesorze, prawda? Zgadza się, to nie problem. Ale kto chce statycznej tapety na żywo? Pokonuje cel. Tapeta powinna reagować na dotyk, poruszać się podczas przewijania ekranów głównych, wykonywać przypadkowe akty dobroci i sprawiać, że czujesz się szczęśliwy.

I jest na to sztuczka programistyczna dla Androida. Istnieje termin zwany efektem paralaksy, który określa głębię w dwuwymiarowej przestrzeni. Wyobraź sobie, że prowadzisz samochód. Dom bliżej ciebie porusza się szybciej niż góra w oddali. Ten sam efekt można osiągnąć, przesuwając obiekty na płótnie z różną prędkością. Chociaż wszystkie znajdują się na tej samej płaszczyźnie, twój mózg postrzega szybciej poruszające się obiekty jako bliżej ciebie. Podobnie jak dodawanie cieni, efekt paralaksy dodaje oś Z.

I tu rozpętuje się piekło! Na większości urządzeń poruszających Ooshie nakładka pogodowa i tło z różnymi prędkościami powodują znaczny spadek liczby klatek na sekundę. Oto jak rysowana jest pojedyncza ramka:

 canvas.drawBitmap(background, 0 - offsetX / 4, 0, null); canvas.drawBitmap(weatherOverlay, 0 - offsetX / 2, 0, null); if (!validDoubleTap) { canvas.drawBitmap(ooshieNormal, positionX - offsetX, positionY, null); } else { canvas.drawBitmap(ooshieTapped, positionX - offsetX, positionY, null); }

offset to procent odległości, jaką przewinął użytkownik. Jest to wywołanie zwrotne, które zapewnia silnik tapet:

 @Override public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset){ super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); // athe current offset should be a fraction of the screen offset to achieve parallax if (!isPreview()) { float newXOffset = xOffset * 0.15f; wallpaperDrawHelper.setOffsetX(newXOffset); if (isVisible() && hasActiveSurface) { wallpaperDrawHelper.drawFrame(false); } } }

Muszę zauważyć, że wszystko to byłoby niepotrzebne, gdybym wiedział, jak pracować z OpenGL! Jest na mojej liście TODO , ponieważ wszystko, co jest bardziej złożone niż to, co mamy teraz, będzie wymagało akceleracji sprzętowej. Ale na razie muszę pracować ciężej, a nie mądrzej (jestem otwarty na sugestie w komentarzach). Oto, co zrobiliśmy:

Lekcja 4: Pracuj z tym, co masz

Jako wielcy zwolennicy inicjatywy minSdk=15 od początku wyeliminowaliśmy wszystkie urządzenia 2.x. Wysiłek związany z utrzymaniem kompatybilności wstecznej jest większy niż możliwe przychody od użytkowników, którzy nie chcą\ulepszyć swoich telefonów. Tak więc w większości przypadków będziemy w stanie osiągnąć płynne wrażenia dzięki dodanej opcji wyłączenia paralaksy, jeśli zajdzie taka potrzeba.

Zgodnie z tym przewodnikiem dla programistów Androida chciałem dać opcję wyłączenia paralaksy.

Kolejną dużą optymalizacją jest sposób obsługi bitmap. Bardzo podobny efekt paralaksy można uzyskać rysując dwie bitmapy zamiast trzech:

  1. Nakładka Ooshie — przycięta i starannie przeskalowana bitmapa Ooshie (można dodać akcesoria)

  2. Połączona nakładka - połączona bitmapa tła i pogody, która porusza się z ułamkiem prędkości Ooshie

Ta sztuczka programistyczna na Androida oszczędza pamięć i przyspiesza czas rysowania, co powoduje nieznaczne pogorszenie efektu paralaksy.

Podczas przewijania ekranów głównych ramki będą rysowane dość często (najlepiej ponad 30 razy na sekundę). Ważne jest, aby nie rysować ich, gdy ekran główny nie jest widoczny (niektóre ekrany blokady, niektóre szuflady aplikacji, otwieranie/przełączanie aplikacji itp.), aby zminimalizować zużycie procesora.

Wszystko to jest ściśle związane z aktualizacjami pogody. Początkowo było powtarzające się zadanie, wykonywane co godzinę lub dwie, aby zsynchronizować pogodę, ale to naprawdę była przesada. Jeśli użytkownik nie widzi tapety, informacje o pogodzie są nieistotne. Więc teraz aktualizacje pogody pojawiają się tylko wtedy, gdy widoczna jest tapeta.

 long lastUpdate = prefStore.getLong(SharedPrefStore.Pref.WEATHER_TIMESTAMP); if (System.currentTimeMillis() - lastUpdate > Consts.WEATHER_UPDATE_INTERVAL){ // update the weather if obsolete Intent intent = new Intent(getApplicationContext(), WeatherUpdateService.class); startService(intent); }

Oto lista kontrolna dla płynnego rysowania bitmap zoptymalizowanych pod kątem pamięci:

  1. Połącz mapy bitowe raz
  2. Rysuj mniej bitmap
  3. Przerysuj tylko na żądanie
  4. Unikaj zadań w tle
  5. Zaoferuj użytkownikom pewną kontrolę nad procesem

Lekcja 5: Test. Test. Test

Nie mogę podkreślić, jak ważne jest to! Nigdy, powtarzam NIGDY , nie publikuj swojej aplikacji przed jej przetestowaniem! I nie mam na myśli, że to TY powinieneś przeprowadzać testy. Napisałeś kod, wiesz jak to działa i masz wpływ na wynik znając oczekiwania. Nie mówię o testowaniu JUnit (choć zalecane), ale o wdrażaniu etapowym, czyli testowaniu alfa i beta.

Jeśli zajmujesz się tworzeniem oprogramowania na Androida, warunki są proste, ale oto krótkie podsumowanie:

  1. Testerzy alfa - niewielka grupa osób składająca się z kolegów z zespołu oraz osób z branży, najlepiej programistów Androida. Są szanse, że będą mieć wysokiej klasy urządzenia i będą bawić się opcjami programistów. Wyślą ci ślady stosu, raporty o błędach, a nawet podpowiedzą kilka wskazówek i sztuczek dotyczących optymalizacji kodu/UI. Idealny do wczesnych wydań z częściowymi/brakującymi funkcjami.

  2. Beta testerzy - znacznie szersza publiczność z różnymi danymi demograficznymi. Wydania stabilne powinny być publikowane tutaj. Nawet jeśli twój poziom ninja jest zbyt wysoki, nigdy nie możesz przewidzieć, nie mówiąc już o uwzględnieniu wszystkich możliwych dystrybucji Androida i sposobów, w jakie ludzie używają swoich telefonów.

Kiedy minęliśmy alfę, myślałem, że skończyliśmy. Ale chłopcze się myliłem?! Okazało się, że nie wszyscy użytkownicy Androida mają urządzenia Nexus z najnowszym oprogramowaniem! Kto by wiedział? :)

Oto kilka problemów z programowaniem na Androida opartych na tym objawieniu:

  1. Różne programy uruchamiające mają różne domyślne ekrany główne - zwykle pierwszy lub środkowy, i o ile wiem, nie ma możliwości poznania jego pozycji.

  2. Trudno jest wyśrodkować Ooshie bez znajomości domyślnej pozycji ekranu głównego - stąd suwak ustawień do regulacji przesunięcia paralaksy.

  3. Przeciętny użytkownik nie wie, co oznacza przesunięcie paralaksy - na stronie ustawień należy używać znacznie prostszej terminologii.

  4. Losowy użytkownik zasugeruje twoją następną funkcję.

Dlatego chciałbym podziękować wszystkim naszym beta testerom za ciężką pracę, którą wykonali. Mam nadzieję, że zdobycie wszystkich najnowszych funkcji, zanim ktokolwiek inny, będzie przyzwoitą nagrodą za ich poświęcenie. Jeśli chcesz, możesz również dołączyć do naszej społeczności Google+ Beta.

Testy beta to kluczowy krok dla początkujących użytkowników Androida, o których należy pamiętać, gdy zaczynają programować swoje aplikacje na Androida, które odniosły sukces.

Lekcja 6: Niech przemówią dane

Tworzenie aplikacji na Androida, która wyróżnia się dzisiaj, jest nieco trudniejsze niż tworzenie aplikacji kalkulatora, której nie było w 2009 roku. Tworzenie idealnej aplikacji jest trudne. Głównie dlatego, że doskonałość leży w oku patrzącego. To, co jest dla mnie dobre, niekoniecznie oznacza, że ​​jest dobre dla ciebie. Dlatego ważne jest, aby aplikacja mogła się rozwijać. Nasza lista kontrolna mapy drogowej dla nowych funkcji pokazuje, że mamy wystarczająco dużo pracy na cały rok 2015. Wkrótce dodamy między innymi:

  1. Dźwięki
  2. Tła sezonowe
  3. Dostosowania (kolor tła, pakiety pogodowe, skórki ooshie itp.)
  4. ooshie specyficzne dla regionu (np. babuszki)
  5. Wiele nowych gadżetów i sposobów na ich odblokowanie

Teraz moglibyśmy utrzymywać aplikację w wersji beta, dopóki wszystko nie zostanie zrobione, ale w ten sposób wyrzucamy cenne dane. Nie wszyscy beta-testerzy poświęcą część swojego dnia na przesłanie opinii. To jest miejsce, w którym możesz skorzystać z narzędzi do uzyskiwania informacji zwrotnych. Możesz używać Google Analytics, Flurry, Mixpanel, Crashalytics, ACRA itp. do zbierania danych o użytkowaniu.

Na przykład, analizując dane, zauważyliśmy, że użytkownicy rzadko klikają przycisk ustawień, więc uczyniliśmy to bardziej widocznym i dodaliśmy krótki samouczek dotyczący dostosowywania ustawień.

Chociaż jest to proces działający w tle, można go wykorzystać do dalszej poprawy komfortu użytkownika. Dlaczego nie pokazać użytkownikowi ile razy:

  1. on/ona otrzymał uścisk
  2. ile deszczowych dni rozjaśnił uśmiech
  3. ile dotknięć było potrzebnych, aby odblokować Ooshie za pomocą mini-gry
  4. ilu znajomych zainstalowało aplikację dzięki Tobie?

Każdy przewodnik dla programistów Androida powinien podkreślać znaczenie Google Analytics w optymalizacji Twojej aplikacji!

Jest to ważne, ponieważ zapewnia konsekwencje dla ich działań. Nie popełniaj tego samego błędu, który robi nasz system edukacyjny, czyniąc użytkowników pasywnymi konsumentami treści. Niech oni rządzą. Daj im możliwość kontrolowania własnych urządzeń i tworzenia własnych, osobistych doświadczeń. Jeśli uda Ci się spakować to wszystko do uroczego pakietu, który przy pierwszym powitaniu kradnie uśmiech, to nie jest zbytnio naciągane, aby poprosić użytkownika o spamowe przysługi w celu odblokowania zawartości.

W końcu musisz rozwijać swoją aplikację na Androida w oparciu o te dane jako przewodnik. Chociaż jest przeznaczona głównie dla mam/dzieci, ta aplikacja może stać się popularna w innych grupach demograficznych. Może nie pasować do naszej oryginalnej wizji, ale potrzeby użytkowników muszą być spełnione. W przeciwnym razie znajdą kogoś, kto może.

Wniosek

Wróćmy do mojej najbardziej udanej porażki TweetsPie. Pomimo kilku nagród i ogromnego nagłośnienia w mediach, aplikacja nie utrzymała swoich użytkowników (powody, dla których wykraczają poza zakres tego artykułu).

Sukces nie zawsze jest oczywisty. Dzięki całemu doświadczeniu wiele się nauczyłem. Wygłosiłem co najmniej kilkanaście wykładów na temat tego, jak (nie) przegrać jako startup na różnych imprezach i hackathonach, i udało mi się zdobyć kilku klientów w Toptal.

Co ważniejsze, staram się nie powtarzać tych samych błędów programistycznych dla Androida z Ooshies, postępując zgodnie ze wskazówkami i wskazówkami w tym przewodniku.

Podsumowując ten długi przewodnik, to, co definiujemy jako sukces, jest na późniejszym etapie ściśle powiązane z tym, co wyznaczyliśmy sobie na początku jako cel. Najczęstszą miarą sukcesu jest oczywiście zarobienie dużych pieniędzy. Bez względu na to, czy Twoja aplikacja to robi, czy nie, musisz spróbować, aby tak się stało, i uwierz mi, że w końcu staniesz się lepszą osobą (miejmy nadzieję, że zdoła nauczyć się OpenGL). Zdobędziesz nowych przyjaciół, kilku wrogów, a jeśli będziesz miał szczęście/mądry, uszczęśliwisz wielu użytkowników.

Możesz sprawdzić naszą stronę internetową lub pobrać Ooshies, aby spróbować.