Советы по разработке приложения для Android: мои извлеченные уроки
Опубликовано: 2022-03-11Привет! Меня зовут Иван, и я уже довольно давно занимаюсь разработкой приложений для Android. Или так кажется. Когда-то (мы говорим о 2009 году) Android был всего лишь младенцем, и с тех пор я наблюдал, как растет Маленький Зеленый Человек . Боюсь, какое-то время назад Android успел меня перерасти.
Сегодня Android есть не только на десятках тысяч разных телефонов и планшетов. Он у вас на запястье, в вашей гостиной, в машине, и как только мы начнем присваивать IP-адреса неодушевленным предметам, он будет повсюду вокруг нас. Многое для того, чтобы охватить даже опытного Android-разработчика!
Кроме того, только в Google Play есть более миллиона приложений, не считая Amazon AppStore или рынков, которые нас обычно не интересуют, таких как Китай. Давайте не будем забывать о бесчисленных компаниях-разработчиках мобильных приложений, которые ежегодно приносят миллиардные доходы.
Так как же независимому разработчику создать успешное приложение на этом огромном рынке с крупными игроками? Понятия не имею, я не сделал успешного приложения! Но, я сделал симпатичный, и я хотел бы поделиться своей историей с вами.
Урок 1: Соедините точки
Успех (обычно) не приходит в одночасье, и это не первое мое приложение. У меня есть такие, начиная от неожиданных хитов, появившихся на выходных , таких как Македонский православный календарь , с более чем 30 000 пользователей на языке, понятном не более чем 4 миллионам человек, до более успешных провалов, таких как TweetsPie , приложение с широким освещением в СМИ и ужасная пользовательская база из чуть более 600 активных пользователей. Там много уроков!
Хотя эти приложения помогли мне немного лучше понять разум «неуловимого существа по имени Пользователь», меня вдохновил двухчасовой проект. Первоначально разработанное, чтобы сделать меня миллионером, когда 1 428 571 пользователей приобрели приложение, поскольку Google берет 30 центов с каждого доллара, приложение Dollar было создано для проверки моей учетной записи продавца.
Я и не подозревал, что годы спустя я получу электронное письмо от счастливой мамы, в которой будет сказано, что это был лучший доллар, который она когда-либо тратила с тех пор, как ее мальчик улыбался каждый раз, когда мое приложение обнимало его.
И вот так родилась идея! Почему бы не использовать фундаментальную человеческую потребность в объятиях и не сделать это красиво? Сделайте его для определенной аудитории интерактивным, сложным, интересным в использовании и еще более интересным для совместного использования.
Урок 2. Знакомство с Android Market
Все, что я упомянул выше, добавлено в приложение с живыми обоями. Основы догадаться не так уж и сложно. Android занимает большую долю рынка, чем iOS, но пользователи iOS покупают больше. Приложения для обмена сообщениями пользуются огромной популярностью, но самые прибыльные — бесплатные игры. Китай, Индия, Бразилия и Россия являются развивающимися рынками, но им не хватает покупательских привычек. Вы можете прочитать индекс App Annie для получения дополнительной информации.
Так как же приложение с живыми обоями вписывается в это? Прежде всего, он исключает большинство платформ, поскольку живые обои — это Android. Во-вторых, эта функция была добавлена в Android 2.1, поэтому у нее большое сообщество и довольно много красивых примеров. В частности, Paperland и Muzei с открытым исходным кодом Романа Нурика, возможно, лучший ориентир для разработки Android.
Несмотря на то, что существует множество живых обоев, большинство из них подпадают под категорию живописных/погодных изображений, и очень немногие подпадают под категорию перегрузки привлекательностью . Это то, что мы хотели изменить и предложить что-то, что вызывает у вас улыбку каждый раз, когда вы разблокируете свой телефон, даже если вы разблокировали его по совершенно другой причине. Мы дали вам милый маленький комочек радости, чтобы обнять вас перед сном ночью или когда вы выключаете будильник утром. А еще лучше, сделать его персональным и настраиваемым.
Без дальнейших церемоний, и прежде чем мы углубимся в технические детали, я с гордостью представляю вам: Ooshies - живые обои
Особенности:
- бесплатное приложение с живыми обоями, которое дарит вам объятия
- 12 уникальных ушей на выбор
- бесплатный, разблокируемый и приобретаемый контент
- текущие обновления погоды
- социальный вход и синхронизация данных
- сезонные поздравления
- много сюрпризов
- кот ниндзя
- мы упоминали об объятиях?
Урок 3: Постарайтесь, чтобы это произошло
Ooshies казался довольно простой идеей приложения для Android. Нарисуйте фон, наложите облака и звезды, поместите медведя с воздушным шаром сверху, и все готово. Но нет, это Андроид! То, что кажется простым, часто оказывается довольно трудным, и мы склонны повторять одни и те же распространенные ошибки снова и снова. Вот краткое изложение проблем, с которыми я столкнулся:
Аппаратное ускорение — зачем рисовать с помощью процессора, если графический процессор справляется с этим намного лучше? Что ж, получается, что отрисовка растровых изображений на холсте не может быть ускорена аппаратно. По крайней мере, пока.
OpenGL — если нам нужно аппаратное ускорение, нам нужно использовать OpenGL ES или, что еще лучше, фреймворк, который делает большую часть работы за нас.
Загрузка растрового изображения — хорошо известная проблема с потреблением памяти. Нам нужно выделить 1 байт [0-255] памяти для каждого канала в #ARGB для отображения одного пикселя. Также изображения, которые мы используем, часто имеют более высокое разрешение, чем дисплей устройства. Загрузка их всех быстро приведет к OutOfMemroyException.
Домашние средства запуска — живые обои будут размещены в процессе домашнего средства запуска, и разные средства запуска, как правило, дают разные обратные вызовы службе живых обоев (в первую очередь Nova и TouchWiz).
Срок службы батареи - если не сделать это правильно, живые обои и виджеты могут сильно разрядить батарею. Со всеми слухами об ужасном времени автономной работы Lollipop (Android 5.0) первым приложением, которое уйдет, будут живые обои.
Таким образом, наложение растрового изображения, рисование его на холсте, а затем переключение кадров при касании, чтобы обнять, не кажется чем-то большим, даже если это делается на процессоре, верно? Правильно, это не проблема. Но кому нужны статические живые обои? Это превосходит цель. Обои должны реагировать на ваши прикосновения, они должны двигаться, когда вы прокручиваете свои домашние экраны, они должны совершать случайные добрые дела и делать вас счастливыми.
И для этого есть хитрость разработки Android. Существует термин, называемый эффектом параллакса, для добавления глубины в двумерное пространство. Представьте себя за рулем автомобиля. Дом ближе к вам движется быстрее, чем гора вдалеке. Такого же эффекта можно добиться, перемещая объекты по холсту с разной скоростью. Хотя все они находятся в одной плоскости, ваш мозг воспринимает более быстро движущиеся объекты как более близкие к вам. Подобно добавлению теней, эффект параллакса добавляет ось Z.
И тут разверзся весь ад! На большинстве устройств перемещение Ooshie, наложения погоды и фона с разной скоростью приводит к значительному падению частоты кадров. Вот как рисуется один кадр:
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
— это процент расстояния, на которое прокрутил пользователь. Это обратный вызов, который обеспечивает движок обоев:
@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); } } }
Должен отметить, что все это было бы излишним, если бы я умел работать с OpenGL! Это в моем списке TODO , поскольку все, что сложнее, чем то, что у нас есть сейчас, потребует аппаратного ускорения. Но пока мне нужно работать усерднее, а не умнее (я открыт для предложений в комментариях). Итак, вот что мы сделали:
Урок 4: Работайте с тем, что у вас есть
Будучи активными сторонниками инициативы minSdk=15
, мы с самого начала исключили все устройства 2.x. Усилия по поддержанию обратной совместимости больше, чем возможный доход от пользователей, которые не могут\не хотят обновлять свои телефоны. Таким образом, в большинстве случаев мы сможем добиться плавности работы с добавленной опцией отключения параллакса, если это необходимо.

Еще одна большая оптимизация — это то, как мы обрабатываем растровые изображения. Очень похожий эффект параллакса можно получить, отрисовав два растровых изображения вместо трех:
Наложение Ooshie — обрезанное и тщательно отмасштабированное растровое изображение Ooshie (можно дополнить аксессуарами)
Комбинированное наложение - комбинированное растровое изображение фона и погоды, которое перемещается с небольшой скоростью Ooshie.
Эта хитрость разработки для Android экономит память и ускоряет время рисования для небольшого ухудшения эффекта параллакса.
При прокрутке домашних экранов кадры будут прорисовываться довольно часто (в идеале более 30 раз в секунду). Крайне важно не рисовать их, когда главный экран не виден (некоторые экраны блокировки, некоторые приложения, открытие/переключение приложений и т. д.), чтобы свести к минимуму использование ЦП.
Все это тесно связано с обновлениями погоды. Изначально была повторяющаяся задача, выполняющаяся каждый час или два, для синхронизации погоды, но это было действительно излишеством. Если пользователь не видит обои, информация о погоде не имеет значения. Итак, теперь обновления погоды происходят только тогда, когда видны обои.
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); }
Итак, в основном, вот контрольный список для оптимизированного для памяти плавного растрового изображения программного обеспечения:
- Объединить растровые изображения один раз
- Рисовать меньше растровых изображений
- Перерисовывать только по требованию
- Избегайте фоновых задач
- Предложите пользователям некоторый контроль над процессом
Урок 5: Тест. Тестовое задание. Тестовое задание
Я не могу не подчеркнуть, насколько это важно! Никогда, повторяю НИКОГДА , не выпускайте приложение до его тестирования! И я не имею в виду, что ВЫ должны делать тестирование. Вы написали код, знаете, как он работает, и влияете на результат, зная ожидания. Я говорю не о тестировании JUnit (хотя и рекомендуется), а о поэтапном развертывании, т.е. альфа- и бета-тестировании.
Если вы занимаетесь разработкой программного обеспечения для Android, условия просты, но вот краткое изложение:
Альфа-тестеры — небольшая группа людей, состоящая из ваших товарищей по команде и людей из индустрии, предпочтительно Android-разработчиков. Скорее всего, у них будут устройства высокого класса, и они будут экспериментировать с опциями разработчиков. Они отправят вам трассировку стека, отчеты об ошибках и даже дадут вам несколько советов и рекомендаций по оптимизации кода/интерфейса. Идеально подходит для ранних выпусков с частичными/отсутствующими функциями.
Бета-тестеры — гораздо более широкая аудитория с различной демографией. Стабильные версии должны быть опубликованы здесь. Даже если ваш уровень ниндзя чертовски высок, вы никогда не сможете предсказать, не говоря уже об учете, всех возможных дистрибутивов Android и того, как люди используют свои телефоны.
Как только мы прошли альфу, я подумал, что мы закончили. Но, мальчик, я был неправ?! Оказалось, что не у всех пользователей Android есть устройства Nexus с последним программным обеспечением! Кто бы знал? :)
Вот некоторые проблемы разработки Android, основанные на этом открытии:
У разных лаунчеров разные домашние экраны по умолчанию - обычно первый или средний, и, насколько я знаю, нет способа узнать его положение.
Трудно центрировать Ooshie, не зная положения главного экрана по умолчанию — таким образом, ползунок настроек для регулировки смещения параллакса.
Обычный пользователь не знает, что означает смещение параллакса — на странице настроек следует использовать гораздо более простую терминологию.
Случайный пользователь предложит вашу следующую функцию.
Поэтому я хотел бы поблагодарить всех наших бета-тестеров за тяжелую работу, которую они проделали. Я надеюсь, что получение всех новейших функций раньше всех станет достойной наградой за их самоотверженность. Если хотите, вы также можете стать частью нашего бета-сообщества Google+.
Урок 6. Пусть говорят данные
Сделать приложение для Android, которое выделяется сегодня, немного сложнее, чем приложение-калькулятор, которого еще не было в 2009 году. Создать идеальное приложение сложно. В основном потому, что совершенство в глазах смотрящего. То, что хорошо для меня, не обязательно означает, что это хорошо для вас. Вот почему важно позволить приложению расти. Наш контрольный список новых функций показывает, что у нас достаточно работы на весь 2015 год. Среди прочего, мы скоро включим:
- Звуки
- Сезонные фоны
- Индивидуальные настройки (цвет фона, погодные пакеты, скины ooshie и т. д.)
- Уши, характерные для региона (например, бабушки)
- Множество новых ушей и способов их разблокировать
Теперь мы могли бы оставить приложение в бета-версии, пока все не будет сделано, но таким образом мы выбрасываем ценные данные. Не все бета-тестеры посвящают часть своего дня отправке вам отзывов. Именно здесь вы можете извлечь выгоду из использования инструментов для получения обратной связи. Вы можете использовать Google Analytics, Flurry, Mixpanel, Crashalytics, ACRA и т. д. для сбора данных об использовании.
Например, проанализировав данные, мы заметили, что пользователи редко нажимают кнопку настроек, поэтому сделали это более очевидным и добавили краткое руководство по настройке параметров.
Хотя это фоновый процесс, его можно использовать для дальнейшего улучшения взаимодействия с пользователем. Почему бы не показать пользователю, сколько раз:
- он / она получил объятие
- сколько дождливых дней скрасила улыбка
- сколько нажатий потребовалось, чтобы разблокировать Ooshie с помощью мини-игры
- сколько друзей установили приложение из-за тебя
Это важно, потому что это обеспечивает последствия для их действий. Не совершайте ту же ошибку, что и наша образовательная система, превращая пользователей в пассивных потребителей контента. Сделайте их ответственными. Дайте им возможность управлять своими устройствами и создавать свой личный опыт. Если вам удастся упаковать все это в симпатичный пакет, который крадет улыбку при первом всплеске, то не так уж и сложно просить пользователя о спам-услугах для разблокировки контента.
В конце концов, вам нужно развивать разработку приложений для Android, основываясь на этих данных в качестве руководства. Хотя это приложение в первую очередь предназначено для мам и детей, оно может стать популярным и в других демографических группах. Это может не вписываться в наше первоначальное видение, но потребности пользователей должны быть удовлетворены. Иначе они найдут того, кто сможет.
Заключение
Вернемся к моему самому успешному провалу TweetsPie. Несмотря на пару наград и широкое освещение в СМИ, приложение не смогло удержать своих пользователей (причины этого выходят за рамки данной статьи).
Успех не всегда очевиден. Благодаря всему этому опыту я многому научился. Я прочитал, как минимум, десяток лекций о том, как (не)провалиться стартапу на различных мероприятиях и хакатонах, и успел заполучить пару клиентов в Toptal.
Что еще более важно, я стараюсь не повторять те же ошибки разработки Android с Ooshies, следуя советам и рекомендациям в этом руководстве.
Подводя итог этому длинному руководству, то, что мы определяем как успех, на более позднем этапе тесно связано с тем, что мы поставили в качестве цели в начале. Самым распространенным показателем успеха, конечно же, является зарабатывание больших денег. Независимо от того, работает ваше приложение или нет, вы должны постараться, чтобы это произошло, и поверьте мне, в конце концов вы станете лучше (надеюсь, тому, кому удастся изучить OpenGL). У вас появятся новые друзья, немного врагов, и если вы достаточно удачливы/сообразительны, вы сделаете многих пользователей счастливыми.
Вы можете проверить наш веб-сайт или загрузить Ooshies, чтобы попробовать.