Size: a a a

Surf Android Standard

2019 March 18

MT

Max Tuev in Surf Android Standard
Артем 👓💻📱
Вижу, что используете для внедрения зависимостей Dagger2, не задумывались попробовать что-то новое, например, Koin?
Задумывались, но пока даггер не слижком сильно напрягает чтобы усиленно исследовать альтернативы
источник

А👓

Артем 👓💻📱 in Surf Android Standard
меня всегда дико раздражала портянка из ошибок, если где-то ошибся в объявлении модулей или провайдеров
источник

А👓

Артем 👓💻📱 in Surf Android Standard
конечно, я научился довольно быстро находить нужные ошибки среди этого списка, но когда приложение разрастается, находить всё сложнее и сложнее...
источник

ВИ

Влад Исаев in Surf Android Standard
Max Tuev
Если еще интересно, то нужные маршруты теперь есть в версии (ветке) 0.4.0-SNAPSHOT
👍👍👍
источник
2019 March 20

VM

Vladimir Makeev in Surf Android Standard
Dmitry Gordin
какого это было? какой фреймворк использовали?
мы столкнулись с пролемой что production ready сейчас только TF Mobile и он с этого года deprecated
TF Lite, который Гугол форсит работает на порядок(!) дольше, хоть квантизируй модель, хоть не квантизируй . SNPE, Mace не production ready показались
У нас в продакшене приложение работает на TF Mobile, мы делали его ещё до TF Lite. В целом они отличаются только тем, что в TF Lite вырезали ещё больше лишнего, поэтому бинарники легче.

SNPE сами не пробовали, но у нас в студии выступал чувак из Prisma, они используют SNPE. Он будет работать на 40% устройств и даст ускорение на видеокарте. И этим способом можно покрыть аппаратным ускорением наибольшее число устройств.

Ещё есть MLKit от Google, под капотом там тот же TF, но ускорение на видюхе будет только на Android 8.1+. Мы давно с этим экспериментировали, так и не удалось увидеть реальный девайс, на котором мы бы увидели ускорение.

Основная проблема нейронок на телефоне, что без видюхи модель не способна за вменяемое время обрабатывать фото или видео. Поэтому в Android приложении придется использовать одновременно несколько AI SDK и в зависимости от железа и версии ОС переключаться между ними. Половину устройств можно покрыть через SNPE + MLKit. Кажется у Mi есть ещё свой фреймворк, это тоже даст какой-то процент. А на остальных будет работать слишком медленно для продакшена, придется обрабатывать на сервере.

Надеюсь, ничего не напутал, давно занимались этими ресерчами )
источник

VM

Vladimir Makeev in Surf Android Standard
Vladimir Makeev
У нас в продакшене приложение работает на TF Mobile, мы делали его ещё до TF Lite. В целом они отличаются только тем, что в TF Lite вырезали ещё больше лишнего, поэтому бинарники легче.

SNPE сами не пробовали, но у нас в студии выступал чувак из Prisma, они используют SNPE. Он будет работать на 40% устройств и даст ускорение на видеокарте. И этим способом можно покрыть аппаратным ускорением наибольшее число устройств.

Ещё есть MLKit от Google, под капотом там тот же TF, но ускорение на видюхе будет только на Android 8.1+. Мы давно с этим экспериментировали, так и не удалось увидеть реальный девайс, на котором мы бы увидели ускорение.

Основная проблема нейронок на телефоне, что без видюхи модель не способна за вменяемое время обрабатывать фото или видео. Поэтому в Android приложении придется использовать одновременно несколько AI SDK и в зависимости от железа и версии ОС переключаться между ними. Половину устройств можно покрыть через SNPE + MLKit. Кажется у Mi есть ещё свой фреймворк, это тоже даст какой-то процент. А на остальных будет работать слишком медленно для продакшена, придется обрабатывать на сервере.

Надеюсь, ничего не напутал, давно занимались этими ресерчами )
Но зависит от постановки задачи. В нашем визуальном поиске SqueezeNet выдает довольно много FPS. И у нас бутыльное горлышко — запросы на backend, где уже идёт поиск по 300k товаров.
источник
2019 March 26

RS

Ruslan Sharipov in Surf Android Standard
Привет!
Расскажите пожалуйста как вы работаете с авторизацией пользователей и хранением пользовательских авторизационных данных?

Недавно попал в большой старый проект, который использует Retrofit 1, okhttp3, jobManager и Picasso 2.71828
Приложение авторизуется на сервере по OAuth.
Есть несколько трудностей - часть данных запрашивается с сервера с токеном в боди, а часть в url - обрабатывается это в okhttp3 Authenticator, который получилось использовать вместе с Picasso, но это вызвало еще одну трудность - картинки содержат токен в url  и если он протух - Picasso одновременно или почти одновременно сваливается в Authenticator с 401 ошибкой и пытается отрефрешить токен. На stack overflow посоветовали сделать часть кода Authenticator синхронизированным чтобы решить эту проблему.
С токеном в боди проще - authenticator разбирает request с помощью gson, делает синхронный запрос на обновления токена и после получения подменяет в старом реквесте токен и повторяет запрос.
И по хранению данных - приложение поддерживает несколько аккаунтов и раньше логины-пароли хранились в sharedPreferences и каждый раз при смене пользователя просто происходила его авторизация, получался токен от сервера и делались запросы с ним. Ушли от хранения связок логин-пароль и теперь храним связки логин-Auth(token, refreshToken, sessionId), но все еще в sharedPreferences.
Синхронизация Authenticator сработала, так же как и разборка-сборка запроса с новым токеном, но интересно какие подходы используете вы в работе.
Поделитесь пожалуйста лучшими практиками)
источник

А👓

Артем 👓💻📱 in Surf Android Standard
Я использую android.accounts.AccountManager.
Вот статья от яндекса на этот счёт: https://habr.com/ru/company/yandex/blog/347152/
источник

ВИ

Влад Исаев in Surf Android Standard
Привет) Не совсем понятно,как работает ActivityCrossFeatureWithParamsRoute. Откуда должен приходить интент в конструктор?
источник

OZ

Oleg Zhilo in Surf Android Standard
Влад Привет. Конструктор с Intent нужен для для конфигуратора экрана.
Например вот
https://github.com/surfstudio/SurfAndroidStandard/blob/snapshot-0.4.0/template/f-main/src/main/java/ru/surfstudio/standard/f_main/di/MainScreenConfigurator.kt
источник

OZ

Oleg Zhilo in Surf Android Standard
Ruslan Sharipov
Привет!
Расскажите пожалуйста как вы работаете с авторизацией пользователей и хранением пользовательских авторизационных данных?

Недавно попал в большой старый проект, который использует Retrofit 1, okhttp3, jobManager и Picasso 2.71828
Приложение авторизуется на сервере по OAuth.
Есть несколько трудностей - часть данных запрашивается с сервера с токеном в боди, а часть в url - обрабатывается это в okhttp3 Authenticator, который получилось использовать вместе с Picasso, но это вызвало еще одну трудность - картинки содержат токен в url  и если он протух - Picasso одновременно или почти одновременно сваливается в Authenticator с 401 ошибкой и пытается отрефрешить токен. На stack overflow посоветовали сделать часть кода Authenticator синхронизированным чтобы решить эту проблему.
С токеном в боди проще - authenticator разбирает request с помощью gson, делает синхронный запрос на обновления токена и после получения подменяет в старом реквесте токен и повторяет запрос.
И по хранению данных - приложение поддерживает несколько аккаунтов и раньше логины-пароли хранились в sharedPreferences и каждый раз при смене пользователя просто происходила его авторизация, получался токен от сервера и делались запросы с ним. Ушли от хранения связок логин-пароль и теперь храним связки логин-Auth(token, refreshToken, sessionId), но все еще в sharedPreferences.
Синхронизация Authenticator сработала, так же как и разборка-сборка запроса с новым токеном, но интересно какие подходы используете вы в работе.
Поделитесь пожалуйста лучшими практиками)
Для хранения данных авторизации используются кастомные хранилища с шифрованием. Для перехвата 401й ошибки и установки своих хедеров используются кастомные интерцепторы для OkHttp.

Хранить токены, и прочую sensitive data в SharedPreferences строго не рекомендуется.

Пример с базовым набором интерцепторов можно глянуть тут

https://github.com/surfstudio/SurfAndroidStandard/blob/snapshot-0.4.0/template/base_feature/src/main/java/ru/surfstudio/standard/application/network/di/OkHttpModule.kt
источник

RS

Ruslan Sharipov in Surf Android Standard
@O_Z_H , @scraplesh спасибо за ссылки! буду изучать)
источник

OZ

Oleg Zhilo in Surf Android Standard
;)
источник

AE

Alexey Egin in Surf Android Standard
Привет! Коль такая пляска - может пример с кастомным шифрованием для хранения sensitive data тоже имеется, или из соображений безопасности не выкладываете?
источник

OZ

Oleg Zhilo in Surf Android Standard
да почему же)
https://github.com/surfstudio/SurfAndroidStandard

security-sample-template
и
filestorage
источник

AE

Alexey Egin in Surf Android Standard
Спасибо! Круто, что кто-то вот так просто делится своим опытом)
источник

ВИ

Влад Исаев in Surf Android Standard
Oleg Zhilo
Влад Привет. Конструктор с Intent нужен для для конфигуратора экрана.
Например вот
https://github.com/surfstudio/SurfAndroidStandard/blob/snapshot-0.4.0/template/f-main/src/main/java/ru/surfstudio/standard/f_main/di/MainScreenConfigurator.kt
Я вас не совсем понял) К примеру нужно передать данные в активити из другого модуля. intent с данными передается в презентер -> из презентера -> в роут наследник от ActivityCrossFeatureWithParamsRoute ?
источник

OZ

Oleg Zhilo in Surf Android Standard
Влад Исаев
Я вас не совсем понял) К примеру нужно передать данные в активити из другого модуля. intent с данными передается в презентер -> из презентера -> в роут наследник от ActivityCrossFeatureWithParamsRoute ?
в роут данные передаются. Роут формирует Intent ;) посмотрите внимательно исходники и примеры. И доки конечно
источник

VR

Volodymyr Riznyk in Surf Android Standard
Привет ребята. Пытаюсь у себя в компании сделать что-то подобное, как с вашим репозиторием, только в меньших масштабах,  ибо нужно шарить код между несколькими проектами, и не могу никак выработать стратегию по отношению к 3rd-party зависимостям. Можете объяснить, или ткнуть носом в доки, какими вы принципами руководствуетесь, особенно в случае, когда один с модулей подразумевает зависимость от другого.
источник

ВИ

Влад Исаев in Surf Android Standard
Oleg Zhilo
в роут данные передаются. Роут формирует Intent ;) посмотрите внимательно исходники и примеры. И доки конечно
Хорошо, спасибо)
источник