Як я Android додаток писав

Привіт друзі! Сьогодні хочу поділитись своїм досвідом з розробки додатка для Android, що не є звичним форматом для цього блогу, але, маю надію, вам буде цікаво.

⁉️ Проблема
Моя дружина багато років користується одним і тим самим додатком для нотаток на Android. Що наразі викликає деякі проблеми, оскільки його немає в play store чи в інших маркетах. Є тільки apk файл, що акуратно зберігається на випадок заміни телефону. Додаток настільки старий, що деякі його функції вже просто не працюють, оскільки вимагають таку ж стару версію Android 🦕
“А чому б просто не знайти іншу програму? Аналогів – безліч, на будь-який смак”. Саме це запитання я теж ставив – але виявилось, що жоден зі знайдених додатків був не ідеальним.
Тому я вирішив при нагоді розібратись з програмуванням на Android та розробити свій ідеальний додаток 👌

👨‍💻 І що тут складного?
Для розуміння контексту. Я – тестер. Так, я роблю автоматизацію, програмую трохи для задоволення і за свою кар’єру написав багато коду на різних мовах типу JS, C#, Java, Groovy і, звісно, мій улюблений зараз Python. Але все ще не програміст. І освоїти з нуля нові для себе технології мені завжди складно.

🎯 Мета
Отже, є ідея, є вимоги, лише нагоди ніяк не було 😅
І ось одного ранку я знайшов таку статтю: Створюємо додаток для Android швидко та просто.
Гей, це ж як раз для мене! Прочитав. Автор пропонує створити додаток на Xamarin (хто не в курсі – така технологія для C#, що дозволяє створювати кросплатформенні додатки одразу на IOS, Android та Windows Phone). Мої колеги кілька років тому писали комерційні проєкти на ньому і в цілому хвалили технологію. Ще одним плюсом статті я бачив використання в якості інтерфейсу WebView – код програми можна написати на C#, а от інтерфейс розробити на HTML! Як раз те, що нам треба. Я малюю жахливі інтерфейси, а от дружина – веб розробник і може самостійно створити інтерфейс своєї мрії.

❌ Xamarin – розробка з букви Х
Для початку повторив код статті, потім почав робити PoC. Не зважаючи, що останній раз я писав на C# десь у 2015, виходило в мене досить непогано. Досить швидко я створив API для роботи з Web інтерфейсом, додав роботу з БД, і почав реалізовувати механізм нотифікацій…
І тут почались проблеми:

  • Захотілось додати js бібліотек, щоб інтерфейс працював гарно та швидко, а от зась 😛
  • Нотифікації вперто не хотіли плануватись на майбутнє, офіційна документація не допомогла а єдиний приклад, що я знайшов – датований 2017 роком 😕
  • Взаємодія з ОС працювала через костилі (як тестер, я костилі нюхом чую, і там точно були вони)
  • навіть Visual Studio не хотіла мені допомагати – я звик до гарячих клавіш в продуктах IntelliJ, які звісно, тут працювали не так

В якийсь момент гугління, я знайшов потрібні мені приклади, але вони були написані на… Java. Проглянувши їх, я зрозумів, що код на C# та Java надзвичайно схожий, тому треба кидати костилі та переходити на нативну розробку.

⚠️Disclaimer
Для Android розробників ця частина може виглядати наївно, але, не зважаючи на всі страждання, я задоволений отриманим результатом за такий короткий проміжок часу

🤖 Android Studio
Почалось все досить круто – легко встановив, налаштував. Більшу частину вже написаного на C# коду просто переніс – на щастя, синтаксис мов дуже схожий, а назви android класів взагалі однакові. Концепція залишилась незмінна – WebView на весь екран, в ньому інтерфейс додатку на html. З однозначних плюсів – Якщо покласти всі файли: html, css, js в одну директорію, додаток їх всі знаходить та використовує, лишень треба вказати посилання на html файл.

💾 Збереження даних. Xamarin пропонував використовувати sqllite. Наскільки я зрозумів, і на котлін цю базу божна використати, але цей підхід застарів, і офіційна документація рекомендує використовувати Room. Що я і використав. Код простий та зрозумілий. Одна проблема, яку я не поборов – міграції. В процесі розробки я кілька разів змінював структуру бази: типи полів, нові таблиці. Документація дає приклад, як безболісно провести міграцію і не втратити дані. І це приклад не працює 😕 Тому я просто чистив кілька разів дані додатку в Android Emulator.

💬 Наступне – нотифікації. Як виявилось, змусити по натиску кнопки створювати нотифікацію – просто. А от зробити так, щоб нотифікація з’являлась в чітко визначений час – справжня проблема. Прикладів – безліч, але майже всі – не робочі. Я припускаю, що API для відкладених задач кілька разів змінювався, тому почав шукати приклади ще й за датою, не старше 2 років, і знайшов простий робочий варіант

🔄 Далі – синхронізація даних. Щоб можна було змінити телефон і не переносити всі нотатки руками. Спочатку я хотів просто зберігати файл на Google Drive – це ж Android, все має бути легко і просто. Viber, наприклад, зберігає в drive чати. Але от і ні! Найсмішніше – є офіційна документація, як інтегрувати в свій додаток Google Drive. Але в цій документації великий disclaimer – що вказані API застарілі і ними не треба користуватись. “Переходьте за оцим посиланнячком і програмуйте на здоров’я”. Переходжу, і нової документації не знаходжу. Напишіть мені, якщо то я шукати не вмію і “ну ось же все написано”.

♻️ Але я вирішив не здаватись і вирішити задачу типово для мене – через костилі. Створив Google App Script, розгорнув його як REST Web Service, що може як зберігати дані і їх версію в Google Spreadsheet (що зручно, до речі, оскільки всі нотатки можна редагувати не тільки на телефоні тепер), так і віддавати їх в додаток. В самому додатку створив корутину (асинхронний процес), що періодично звіряє версії даних та синхронізує їх. Мінуси такого підходу очевидні – його не можна опублікувати в Google Play, оскільки URL сервісу – унікальний і зашитий в програму. Але оскільки я й не збирався ніде публікувати додаток – тому нам таке рішення було ок.

І це все – згенерував apk файл (релізний, підписаний власним ключем), і передав дружині! ❤️ Додаток мрії готовий.

Якщо ви хочете більше подробиць чи є питання – пишіть, подумаю, як опублікувати частини коду

Позначки:,
2 Серпня 2021
Автор: 
  • Тестові метрики на раз-два-три
  • MQTT performance test
  • Роботи не п’ють 🔞🍺
  • Метод класифікації дерев

Залишити коментар

Залишити вiдгук