20 ноября 2010

Про Андроид

Я давно копил яд и тщательно сцеживал в баночку. Но сегодня есть повод наконец-то высказаться. Поводом стало интерью с Максом Хауэллом (Max Howell) оригинал, одним из разработчиков TweetDeck (маководам-гикам он также может быть известен как автор Homebrew) и некоторых других полезных проектов.

Практически со всем, что пишет Макс, я могу согласиться. "Debug cycles on Android take half a minute at least." Да, чёрт побери, с запуском приложения всё плохо, очень плохо. Варианта, как водится, два: эмулятор (а не симулятор, как для iPhone) и реальное устройство. Первый вариант отпадает сразу, потому что эмулятор жестоко медленный (отдельный пункт для злословия - зачем делать эмулятор, который по идее должен досконально воспроизводить работу эмулируемой сущности, если он этого не делает? А тормозит так, будто целый кластер эмулирует. Вот симулятор iPhone - тоже часть функционала можно протестировать только на устройстве, но то, что можно на симуляторе - можно очень быстро). Какое там быстродействие, достаточное, чтобы UI плавно следовал за пальцем! Шевелится - и ладно. В мусорку, годится только на первый день, пока не завезут девайс. Да и тогда между сохранением исходников и запуском программы стоят неповоротливые компилятор, отправка бинарника на устройство, пакетный менеджер, который установит программу. Потом она запустится, и ведь наверняка у ней есть некий этап инициализации (да хотя бы логин в твиттер или что там у них). Полминуты? Да, что-то вроде того. Купите кресло и мешок кофе.

Второй безальтернативный вариант - реальное устройство. Девайс лучше брать мощный. А лучше пять, разной степени говнистости, но один мощный. У меня их 4, 2 из них (худший и лучший) - постоянно со мной, 2 лежат в офисе на случай, если команде срочно потребуется альтернативный девайс для тестов. У моего коллеги 2 (ну и он всегда может взять с моего стола те 2 которые я не ношу с собой). Вы подумали только что, что мы все совсем тут еб^W с ума сошли? Нет, отнюдь. Например для тестирования iOS приложений у меня ровно 1 девайс. Просто это единственный способ бороться с другой проблемой платформы Android - "фрагментацией". Про это я могу под пиво задвинуть немалую тираду, но постараюсь тут и кратко.

О, все так полюбили это слово с подачи Джобса, но никто нихрена не понимает, что это значит по отношению к Андроиду. И Макс тоже не догоняет, считая эту проблему надуманной. Вот он рассказывает про адаптацию интерфейса, тут же признаваясь, что с офигенной системой менеджеров размещения Андроида это вообще не проблема для таких приложений как твиттер-клиент (но в то же время я с ужасом жду момента, когда придётся переносить с iOS приложение не использующее стандартный UI, для которого эта система будет бессмысленна). Да не в этом дело, при чём тут разные экраны и разрешения? Ребята из Google тут всё сделали за вас (против ребят из Apple, у которых например функция загрузки изображения соответствующего разрешения вообще не работает, хотя описана в документации). А дело в том, что Андроид есть только один - в git репозитариях Google и на Nexus One. Всё остальное - это прошивка от HTC, прошивка от LG, прошивка от Motorola, взгромождённые на железо от HTC, LG и Motorola соотв. И в эту прошивку, что характерно, этот производитель залез руками (да, чтобы был хоть какой-то added value, который выделял бы его телефончик на фоне сотен других моделей) и, вероятно, непоправимо там наследил. Один из телефонов, к примеру, появился у нас вследствие того, что производитель переписал стандартный класс из Android SDK так, что при его использовании приложение гарантированно падало с исключением. Пришлось брать этот класс из исходников андроида и адаптировать, заменяя своим вариантом как сломанный вариант у того производителя так и стандартный вариант у всех других и лишаясь потенциальных будущих его обновлений. Другой телефон гарантированно уходил в ребут в одном месте приложения. Без какой-либо причины, которую хоть как-то можно было бы установить. После пришедшего обновления перестал. Зато вдруг стал разряжаться за полдня даже в режиме ожидания. Вот что такое фрагментация Андроида - никогда невозможно гарантировать, что у пользователя будет хоть что-то работать. Будет работать у меня на 4 аппаратах, ещё на 2 у коллеги, на 2 у шефа - не будет у 100500 пользователей на каком-нибудь китайском куске говна. Кто-то из них непременно придёт в маркет и насрёт в карму. Видели наверное - у приложения >250 000 загрузок, 5 звёзд и куча истеричных комментариев. Энди Рубин даёт нам определение открытости как возможность собрать андроид и поставить на свой телефон целиком из исходников, я смеюсь над ним - пусть проделает этот трюк с произвольным телефоном из магазина. Или это должен сделать разработчик, который лишь хочет продать свою программу?

Железо разное, очень разное. Казалось бы, везде какой-то ARM, но один аппарат тормозит как тот эмулятор, а другой, раза в 2 дешевле с резистивным говно-экраном на 16 цветов - летает. Парадокс! Или вы думаете, что Rovio от хорошей жизни объявили, что их злые птицы не поддерживаются на куче устройств? Посмотрите на список - это устройства дешевле $500 (в России, очень грубая прикидка на глаз). Такие вот кирпичи. В кирпичи превращаются устройства, как только вы их купите. Они морально устарели, когда добрались до России, и производитель не будет выпускать для них новую прошивку. Купить что-то стоящее на Андроид - сложно, обычно это означает накинуть $50-$150 сверх того, что задумывалось, тщательно выбрать производителя по отзывам (и вероятности обновления прошивок), и магазин, в который можно без проблем вернуть устройство (или поменять). Но это так, к слову, потребительская сторона вопроса меня не особо касается, просто хочется подчеркнуть, что придётся тщательно выбирать. В случае с Apple придётся выбирать между 16 & 32 Gb к примеру, и только. И я не знаю, что лучше или хуже, но париться по поводу 16 и 32 обычно придётся гораздо меньше, чем с тысячей аспектов андроид телефона.

Что-то я отклонился. Далее Макс говорит о жизненном цикле приложения. И вот тут происходит очередной разрыв шаблона, потому что приложение на Android работает совсем по-другому, нежели привычное десктоп или даже iOS приложение. Как вам, например, тот факт, что приложение нельзя закрыть? Это не нужно в той парадигме, которую предлагает Google. Приложение, будучи запущенным, вероятно понадобится пользователю в дальнейшем. Ну так и не надо его закрывать, пусть оно будет доступно как можно быстрее, когда вы захотите к нему вернуться! А андроид сам позаботится об использовании памяти, процессора и батареи. Но это же просто невозможно! и пользователь требует кнопку "Закрыть". А единственный способ приложению закрыться - это послать себе kill -9, да и это не гарантирует, что удивлённый таким ходом событий андроид не перезапустит его тотчас же. Другие способы уже требуют пользователя - удалить приложение или перезагрузить телефон. Вот тогда оно точно закроется. Знаете, я видел одно приложение, которое предлагало себя закрыть. Как вы думаете, что оно делало? Скрывало все свои 'окна' и засыпало, как любое другое добропорядочное андроид приложение.

Тут разрыв шаблона случается и у разработчиков (у некоторой части), потому что чтобы стать "good citizen" нужно хотя бы пару раз хорошенько прочитать документацию по теме (по этой теме она весьма подробна) и приложить голову. И если хороший разработчик "в итоге будет писать гораздо более надёжные приложения, чем раньше (особенно после отладки)", то остальные "говнякают код по-быстрому", чтобы завалить маркет бесплатными поделиями. И это тоже большая, просто огромная проблема - отсутствие не только контроля, но и каких бы то ни было гайдлайнов - как для разработчиков софта, так и для производителей аппаратов. Поэтому в маркете такое количество шлака, о чём так любят упоминать противники платформы, забывая при этом, сколько шлака в Apple AppStore, а на прилавках такое количество неудобных аппаратов, то не имеющих D-pad в каком-либо виде, то с самой часто используемой на андроиде кнопкой "назад", засунутой в самое труднодоступное место, то страдающих чем-то ещё из широкого арсенала недоработок юзабелистов. Отсюда возникает самый популярный класс программ на андроиде - тасккиллеры, и холиворы - нужны они или нет. Пока я увидел в такой свободе только один положительный момент - отсутствие задержки между публикацией и доступностью приложения, за что все яростно клянут AppStore (упущенные возможности, конкуренты догоняют и пр.).

Далее идёт речь о самом SDK. Документация местами хороша, местами просто отсутствует, средства странны, не образуют что-то цельное и удобное (даже если заменить Eclipse на Idea, хоть последняя мне лично гораздо приятнее) и также неполны (ну какой смысл в отслеживании выделений памяти в куче, если большая её часть выделяется вне её и не отображается стандартными средствами? Собственные велосипеды дают лишь примерную картину) что в купе с драконовскими ограничениями типа слабых устройств на рынке, непредсказуемостью GC и домокловым мечом OutOfMemory (16 Mb! 21 век на дворе! и из этого треть откусывает runtime) создаёт картину безысходности. Нет, бывают вещи гораздо, гораздо хуже (RIM, вам икается?), но тут действительно непаханое поле для улучшений.

Такую же безрадостную картину может составить себе читатель статьи Android vs. iPhone: the good, the bad and the ugly нашего соотечественника Олега Андреева, но с ней я не во всём согласен, большей частью она была вызвана плохим аппаратом и непониманием. Согласен с тем, что делать вещи на Java гораздо сложнее, и только упрощением сборки мусора (которая только добавляет проблем на самом-то деле) нельзя это оправдать. Java даёт средства для постройки чего угодно, но даже простые вещи делаются сложно, и без хорошего опыта это ещё сложнее. Поэтому, например, перед началом изучения андроида я настоятельно порекомендую Java Concurrency in Practice. Это достаточно подробная, толстая и дорогая книга про многопоточность в Java. Это почти обязательно для разработки приложения сложнее фоточки кота и мяукания (это шпилька в адрес App Inventor. Где он кстати?).

Вопреки всему вышеизлитому яду я, как и Макс, считаю, что у Андроида всё впереди. Но для этого придётся пойти на решительнейшие шаги. Отказаться от любой поддержки старых прошивок (например ниже 2.1), остальные объявить устаревающими (deprecated) и только после этого выпускать следующую версию, подняв аппаратные требования, чтобы убрать наконец те ограничения, в которых вынуждена запускаться андроид программа. Это оставит на обочине большую часть ныне существующих аппаратов, но иначе детские болезни погубят платформу. Необходима работа над документацией (к примеру, в документации Microsoft встречаются недостаточно полно освещённые моменты, в документации Apple их меньше, в документации Google же зияют дыры); над гайдлайнами, в первую очередь HIG; средствами разработки, мониторинга и отладки; возможно даже над какой-либо системой принятия приложения в магазин.

Хороших выходных. Ответные посты коллег, подкреплённые опытом, приветствуются.

9 комментариев:

lrrr комментирует...

Гугл не будет агрессивно депрекейтить старые андроиды ни в коем случае, с т.з. захвата мира это основная фишка: любой дядюшка Лю может сделать смартфон с гуглоосью за двести баксов.

Единственное что напрашивается -- сделать отдельный стандарт типа Android + Gaming, и вот его сертифицировать по производительности (чтоб птицы нормально работали) и бить по голове нарушителей. Игрушки это важно.

sёmka комментирует...

2lrrr: дак, родной, в таком случае андроид так и останется говном навеки. Рамки и ограничения этой платформе жизненно необходимы.
Ну или тот же HTC сделает собственный форк андроида с HIG, депрекейтами, блекджеком и роботом Бендером.
И правильно сделает, кстати.

PhoeniX комментирует...

Я понимаю, что это несбыточные мечты, и так прогибаться приходится самим птицам (lite-версия для тех девайсов из списка), а не гуглу. Но планку вроде они всё-таки поднимают. Да и вообще, время идёт, у дядюшки Лю племянники подрастают...

Также они не стесняются депрекейтить API (правда в тех местах, которые ещё до 1.0 стоило выкинуть. Как вам например тот факт, что до 1.6 он не умел CDMA?)

Опять же, если посмотреть на то, как приходится писать игры, то впечатления остаются смешанные.

hudvin комментирует...

Вы забыли про главный недостаток.
На задней панели нет надгрызеного яблока.

PhoeniX комментирует...

на некоторых есть логотип Google. Следующий тролль!

lrrr комментирует...

Я ж не говорю что вообще не будет депрекейтить, я говорю -- *агрессивно* не будет :)

Кроме того, простые игрушки и софт там вполне нормально работают (говорю как владелец слабого ондроеда), разработчеги вполне справляются, так что тут никакой катастрофы нет, один профит.

Портят user experience только мощные игры, с этим точно надо что-то делать (т.е. прятать их от юзеров с недостаточно шустрыми девайсами).

PhoeniX комментирует...

Агрессивно не будет, согласен.

Как полгода пользователь слабого андроид я знаю, что там и как, и заявляю - так быть не должно. Это влияет не только на игры, но и на вполне обычные вещи вроде скорости смены кадров при съёмке фото, поиска по контактам, отображения истории звонков, календаря и т.п. Субъективное навязчивое ощущение нехватки отзывчивости.

± нивелировать эти ограничения можно, собрав кучу компромиссов в приложении. Оно не будет после этого адово тормозить, но не станет бодрячком.

Да, игры некоторые ничего идут, но я даже знать не хочу, какой ценой, хотя и догадываюсь.

booter комментирует...

Кажется, Гугл дал реаьного маху с Java и VM-на мобильных устройствах. Надо было делать на базе LLVM с последующей компилляцией в код платформы (к чему Эппл в итоге и пришла), в резуьтате чего а) был бы пофик язык программирования, б) не пришлось бы выносить мозг нюансами работы GC и отлавливать для него утечки (а они там могут проявляться совсем неочевидно).

В результате получилось классическое. Может одумаются...

PhoeniX комментирует...

нет, уже не одумаются, он весь на смеси Java и native code. Ладно хоть JIT встроили.