infinum android talks #13 - developing android apps like navy seals by ivan kušt

55
Developing Android apps like Navy Seals Ivan Kušt, Android team leader

Upload: infinum

Post on 21-Jan-2018

508 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Developing Android apps like Navy Seals

Ivan Kušt, Android team leader

Page 2: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Infinum Android team

Page 3: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

How it all began?

Page 4: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

How it all began

Page 5: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt
Page 6: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

First steps

• Android plugin for Eclipse

• tests? who needs them

• Activities with > 1k lines

Page 7: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

First steps

• no segregation of duties

• no code review

• poor code structure

Page 8: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Aint nobody got time for that

Regression testing?

Page 9: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

So what did we do?

• Improved implementation process

• Included testing to development process

• Improved release process and analytics

Page 10: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Implementation process

Page 11: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Working in a team

• git conflicts

• different code styles

• environment switching (test, production)

Page 12: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Working in a team

• bugfixing while developing a new feature

• weekly meetings and progress reports

Page 13: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt
Page 14: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

branching / merging process

Page 15: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Pull Requests

Page 16: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

debug staging release

obfuscated no yes yes

logs yes yes no

crash reporting no yes in most cases

Build types

Page 17: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Gradle

• Build types - debug, staging, release

• Product flavors - test API server, production API server

Page 18: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Product flavors

• number of flavours = number of API environments

Page 19: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Build variants

• flavor x buildType

• example productionDebug

• production API

• debuggable, unobfuscated, logs enabled

Page 20: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Model Presenter View

Code architecture

Page 21: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

MVP

• a derivative from MVC

• Models and Views never communicate directly

Model Presenter View

Page 22: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

View

• Activity, Fragment, View

• propagates UI events to presenter

• exposes methods that control presentation of data

Model Presenter View

Page 23: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Presenter

• middle man between View and Model

• updates the UI - difference to MVC

Presenter ViewModel Presenter

• Activity, Fragment, View

• propagates UI events to presenter

• exposes methods that control presentation of data

View

Page 24: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

View

Model

• gateway towards the business logic

• methods for data retrieval

Model Presenter

Page 25: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

ExampleshowLoading() hideLoading() setUsernameError() setPasswordError()

LoginPresenterlogin(username, pass)

LoginView LoginModellogin(username, pass, listener)

showLoading() hideLoading() setUsernameError() setPasswordError()

LoginActivityloginPresenter

login(username, pass)

LoginPresenterImplloginView loginModel

LoginModelImpl

login(username, pass, listener)

Page 26: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Testing

Page 27: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Instrument testing

• Robotium, Espresso

• runs on emulator or real device

Page 28: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Unit testing

• Robolectric

• write mock View and Interactor

• unit test Presenter

Page 29: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Dependency injection

• Dagger 2

• https://github.com/reisub/Dagger-2-Example

• simplifies writing tests

• Model / View / Presenter can easily be replaced

Page 30: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Without DI

@Overrideprotected void onCreate(Bundle savedInstanceState) { //... //dependencies loginPresenter = new LoginPresenterImpl(this, new LoginModelImpl());}

LoginView LoginPresenter LoginModel

LoginActivity LoginPresenterImpl LoginModelImpl

Page 31: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

With DI

@Overrideprotected void onCreate(Bundle savedInstanceState) { //... //dependencies DaggerLoginComponent.builder() .loginModule(new LoginModule(this)) .build() .inject(this); }

Page 32: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

With DI

• decoupling dependencies from implementation

• easier to replace dependencies

• more about Dagger:http://google.github.io/dagger/

Page 33: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Robolectric

• mock Android VM (tests run on desktop machine)

• View doesn’t have to be mocked

• full control of Activity / Fragment lifecycle

• http://robolectric.org/

Page 34: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

MockWebServer

• part of OkHttp library

• server that runs on localhost

• responses can be enqueued

• https://github.com/square/okhttp/tree/master/mockwebserver

Page 35: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Mocking network layer

• network layer can be replaced with MockWebServer

• no additional mock classes

Page 36: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Continuous integration

• if not forced, you won’t run tests

Page 37: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Idea

• commit to a branch starts test execution

• CI server clones the repo, compiles and runs tests

• test results are archived and notified via mail / chat

Page 38: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

CI servers

• Jenkins

• Travis

• Circle CI

• https://circleci.com/

• works only with GitHub

Page 39: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Static code checks

Page 40: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Findbugs

• http://findbugs.sourceforge.net/

• java.net.URL.hashCode()

Page 41: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Android Lint

• android related checks

• missing translations

• unused drawables

Page 42: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Checkstyle

Page 43: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Releasing and analytics

Page 44: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Infinum Labs

Page 45: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Infinum Labs

• internal app store

• gradle task increments version name

• upload app via web, CLI tool or AS plugin

• library that notifies when new version is available

Page 46: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt
Page 47: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Analytics

Page 48: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Recap

• Improved implementation process

• Included testing to development process

• Improved release process and analytics

Page 49: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Implementation process

• organise teamwork - git flow

• monitor code quality - pull requests

• one click build - build variants

• code structuring - MVP

Page 50: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Testing

• Unit testing

• Continuous integration

• Static code checks

Page 51: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Releasing and analytics

• internal store for clients

• automatic notification when new version is up

• analytics / crashlytics

Page 52: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

• initial project setup takes more time

• steeper learning and onboarding curve

• developing new features initially takes more time to cover the code with unit test

Cons

Page 53: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

• confidence in builds(so much that we believe we’re Navy Seals)

• more maintainable code

• regression testing

Pros

Page 54: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Implementation Testing Release Post Release

ArchitectureBuild Types

MVP

Dependency injection

Unit TestsRobolectric

MockWebServer

Manual testsHuman tester

Infinum Notifier lib

AnalyticsGoogle analytics

Crashlytics

Play Store

Page 55: Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt

Ivan Kuš[email protected]

• if you have any questions: