Flisol 2012

Preview:

DESCRIPTION

Apresentação sobre Ferramentas Livres para Desenvolvimento Android feita no Flisol 2012, em Salvador.

Citation preview

DESENVOLVENDO PARA ANDROIDCOM FERRAMENTAS LIVRES

MARLON SILVA CARVALHO domingo, 29 de abril de 12

twitter.com/marlonscarvalho

marlon.silvacarvalho.net

marlon.carvalho@gmail.com

domingo, 29 de abril de 12

domingo, 29 de abril de 12

domingo, 29 de abril de 12

domingo, 29 de abril de 12

o inevitável para os desenvolvendores......era surgir uma grande quantidade de ferramentas opensource

domingo, 29 de abril de 12

domingo, 29 de abril de 12

vamos começar do começo...

...ao criar seu projeto.

domingo, 29 de abril de 12

dependências para bibliotecas

domingo, 29 de abril de 12

lib-dep-1.1 lib-dep-1.2

lib-xml lib-json

domingo, 29 de abril de 12

domingo, 29 de abril de 12

ou você pode usar o:

e gerenciar seu projeto por ele!

domingo, 29 de abril de 12

o processo de build é complexo? requer muitas regras?

por que usar?

domingo, 29 de abril de 12

testar

compilar

empacotar

deploy

gerar um tags no repositório

empacotar com certificados diferentes

testes unitários, com BDD, com seilaoquê!

domingo, 29 de abril de 12

sua aplicação possui muitas dependências para bibliotecas externas?

por que usar?

domingo, 29 de abril de 12

quer automatizar tarefas repetitivas no seu processo de build?

por que usar?

domingo, 29 de abril de 12

você usa um servidor de integração contínua?

por que usar?

domingo, 29 de abril de 12

sua aplicação está dividida em vários módulos?

por que usar?

domingo, 29 de abril de 12

foi feito para você!

então,

domingo, 29 de abril de 12

dependency injectionevents, logs, factories, fragments, services, resources

http://roboguice.googlecode.com/

domingo, 29 de abril de 12

- =

a simples equação

+AOP

domingo, 29 de abril de 12

“Dependency injection is a software design pattern that allows a choice of component to be made at run-time rather than compile time.”

domingo, 29 de abril de 12

com DI eu não faço isso:

MinhaInterface objeto =

new UmaClasseQueImplementaInterface();

domingo, 29 de abril de 12

com DI eu faço apenas isso:

@InjectUmaInterface obj;

domingo, 29 de abril de 12

class AndroidWay extends Activity {     TextView name;     ImageView thumbnail;     LocationManager loc;     Drawable icon;     String myName;

    public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);        name      = (TextView) findViewById(R.id.name);         thumbnail = (ImageView) findViewById(R.id.thumbnail);         loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);         icon      = getResources().getDrawable(R.drawable.icon);         myName    = getString(R.string.app_name);         name.setText( "Hello, " + myName );     } }

código repetitivoo modo “android nativo” de programar:

domingo, 29 de abril de 12

class RoboWay extends RoboActivity {     @InjectView(R.id.name)             TextView name;     @InjectView(R.id.thumbnail)        ImageView thumbnail;     @InjectResource(R.drawable.icon)   Drawable icon;     @InjectResource(R.string.app_name) String myName;     @Inject                            LocationManager loc;

    public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);        name.setText( "Hello, " + myName );     } }

código não-repetitivoo modo “RoboGuice” de programar:

domingo, 29 de abril de 12

@Inject

domingo, 29 de abril de 12

public class MyActivity extends RoboActivity {    @Inject protected Listeners listeners;}

class Listeners {        public void doOnResume(@Observes OnResumeEvent e) {    }        public void doOnCreate(@Observes OnCreateEvent e) {    }    }

eventos pra cá, eventos pra láo modo “RoboGuice” de programar:

domingo, 29 de abril de 12

quem usa isso?será que presta mesmo?

domingo, 29 de abril de 12

eliminar código repetitivopor que usar?

domingo, 29 de abril de 12

focar no negócio da aplicação

por que usar?

domingo, 29 de abril de 12

ter os benefícios da injeção de dependência no

desenvolvimento mobile

por que usar?

domingo, 29 de abril de 12

o maldito context não precisa mais caminhar

entre as diversas camadas da sua aplicação

por que usar?

domingo, 29 de abril de 12

código mais limpo, claro e focado no negócio da sua

aplicação

enfim:

domingo, 29 de abril de 12

testes unitários em qualquer jvm

http://roboletric.org/

domingo, 29 de abril de 12

o maldito emulador!

domingo, 29 de abril de 12

testes rodando na própria IDE

por que usar?

domingo, 29 de abril de 12

testes rodando em servidores de integração

por que usar?

domingo, 29 de abril de 12

@RunWith (RobolectricTestRunner.class)public class MyActivityTest { private Activity activity; private Button pressMeButton; private TextView results;

@Before public void setUp() throws Exception { activity = new MyActivity(); activity.onCreate(null);

pressMeButton = (Button) activity.findViewById(R.id.press_me_button); results = (TextView) activity.findViewById(R.id.results_text_view); }

@Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception {

pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); }}

domingo, 29 de abril de 12

mas... um rápido parênteses... (

domingo, 29 de abril de 12

por que você faz testes unitários em android?

domingo, 29 de abril de 12

regras de negócio em serviços

domingo, 29 de abril de 12

dados nas nuvens

domingo, 29 de abril de 12

)

domingo, 29 de abril de 12

e a maldita persistência de dados?

domingo, 29 de abril de 12

class MeuHelper extends SQLiteOpenHelper {

public void onCreate(SQLiteDatabase db) { }

public void onUpgrade(SQLiteDatabase db, int old, int newV) { }

}

faça um extends de SQLiteOpenHelpero modo android nativo de programar:

domingo, 29 de abril de 12

Cursor cursor = database.rawQuery("select * from tabela");

MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();

domingo, 29 de abril de 12

ContentValues values = new ContentValues();values.put(“coluna1”, comment);database.insert(“tabela”, null, values);

MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();

domingo, 29 de abril de 12

database.delete(“tabela”, “_id” + " = " + id, null);

MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();

domingo, 29 de abril de 12

aliendroid-activerecord para diminuir a dor da persistência de dados

https://github.com/marloncarvalho/aliendroid-activerecord

domingo, 29 de abril de 12

public class Item extends Model { public String atributo1; public String atributo2; public String atributo3;}

defina seu model

domingo, 29 de abril de 12

List<Item> itens = Model.!ndAll(Item.class);item.insert();

Item item = Model.load(Item.class, 1L);

item.delete();

item.update();Model.where(...);

domingo, 29 de abril de 12

tabela criada automaticamente

domingo, 29 de abril de 12

colunas mapeadas para os atributos

domingo, 29 de abril de 12

minimiza a necessidade de códigos SQL

por que usar?

domingo, 29 de abril de 12

automatiza tarefas repetitivaspor que usar?

domingo, 29 de abril de 12

integração contínuaserá que você precisa de um?

domingo, 29 de abril de 12

por que usar?sua equipe é de média a grande?

domingo, 29 de abril de 12

por que usar?quer garantir que a cada commit seu projeto continua funcionando?

domingo, 29 de abril de 12

por que usar?você precisa de resposta instantânea

para erros de integração?

domingo, 29 de abril de 12

use o jenkins com seu projeto androidroda tanto com o roboletric como com o emulador

domingo, 29 de abril de 12

domingo, 29 de abril de 12

tem como usar BDD no android?behavior driven development

domingo, 29 de abril de 12

calabash-android

https://github.com/calabash/calabash-android

domingo, 29 de abril de 12

calabash-android

Feature: Login feature Scenario: As a valid user I can log into my app Given I am a valid user And I enter my username And I enter my password And I press "Login" Then I see "Welcome to coolest app ever"

domingo, 29 de abril de 12

calabash-android

domingo, 29 de abril de 12

ter os benefícios do BDD em seu projeto android

por que usar?

domingo, 29 de abril de 12

e quando dá pau na sua app?como saber quando isso aconteceu

domingo, 29 de abril de 12

Google Playeles lhe dão uma forcinha, mas...

...e se você quiser mais informações?e um relatório personalizado?

domingo, 29 de abril de 12

Application Crash Report for Android

http://acra.googlecode.com/

domingo, 29 de abril de 12

ACRA is a library enabling Android Application to automatically post their

crash reports to a Google Docs form. It is targetted to android applications developers to help them get data from

their applications when they crash or behave erroneously.

domingo, 29 de abril de 12

import org.acra.*;import org.acra.annotation.*;

@ReportsCrashes(formKey = "dGVacG0ydVHnaNHjRjVTUTEtb3FPWGc6MQ") public class MyApplication extends Application {

    @Override    public void onCreate() {        ACRA.init(this);        super.onCreate();    }

}

domingo, 29 de abril de 12

domingo, 29 de abril de 12

domingo, 29 de abril de 12

você não está satisfeito com as opções do Google Play

por que usar?

domingo, 29 de abril de 12

você quer personalizar seu relatório

por que usar?

domingo, 29 de abril de 12

você quer dar um feedback mais elegante para o

usuário

por que usar?

domingo, 29 de abril de 12

você quer mais detalhes sobre o erro

por que usar?

domingo, 29 de abril de 12

é só isso!

domingo, 29 de abril de 12

androidbahia.info

domingo, 29 de abril de 12