Android development at mercari 2015

Post on 15-Apr-2017

1.413 views 0 download

Transcript of Android development at mercari 2015

Android Development at Merari 2015Tomoaki Imai @ Roppongi.aar #2 11/17/2015

Hi I’m Tomo(今井智章)twitter: tomoaki_imai github: tomoima525

Launched App in US market on September 2014

http://www.slideshare.net/tomoakiimai2/us-localization

What has changed / kept the same so far?

See our changes from KPT stand point

K eep

P roblem

T ry

What we keep doing since 2014

Issues we worked on

What we are currently working on

But before we go, Let’s talk about our current status

How we develop now• IDE

- Eclipse -> Android Studio

• Teams

- Tokyo & San Francisco

- 3 Android Engineers

• 1 source code, 2 product (US/JP)

• Powered by lots of external services…

See our changes from KPT stand point

K eep

P roblem

T ry

What we keep doing since 2014

Issues we worked on

What we are currently working on

Standup meeting• JST 11AM(PST 6PM), 10min, everyday

• Between Tokyo & San Francisco office

• The best way to track progress, issues

JP Office Hours

US Office Hours

6PM PST

11AM JST

Standup Meeting

Updating tickets Code reviews

Feedback

1 repository, 2 products• Both Apps have the same UI, but some features are

different

• Package names

• Targeting single language

US -> com.mercariapp.mercari JP -> com.kouzoh.mercari

US -> English JP -> Japanese

US JP

ex) Shipping

Set up flavors for targeted languages

def PACKAGE_NAME = "com.kouzoh.mercari"def PACKAGE_NAME_US = "com.mercariapp.mercari"

productFlavors { jp { minSdkVersion 9 applicationId PACKAGE_NAME manifestPlaceholders = [appName:"@string/app_name"] resConfigs "ja" } us { minSdkVersion 14 applicationId PACKAGE_NAME_US resConfigs "en" } }

Set up flavors for targeted languages

def PACKAGE_NAME = "com.kouzoh.mercari"def PACKAGE_NAME_US = "com.mercariapp.mercari"

productFlavors { jp { minSdkVersion 9 applicationId PACKAGE_NAME manifestPlaceholders = [appName:"@string/app_name"] resConfigs "ja" } us { minSdkVersion 14 applicationId PACKAGE_NAME_US resConfigs "en" } }

Change package name

Set up flavors for targeted languages

def PACKAGE_NAME = "com.kouzoh.mercari"def PACKAGE_NAME_US = "com.mercariapp.mercari"

productFlavors { jp { minSdkVersion 9 applicationId PACKAGE_NAME manifestPlaceholders = [appName:"@string/app_name"] resConfigs "ja" } us { minSdkVersion 14 applicationId PACKAGE_NAME_US resConfigs "en" } }

Apply targeted language

Support older SDK versionImporting a library which min SDK version is more recent than App's min SDK version fails with an error

Error:Execution failed for task ':Tasks:processDebugManifest'.> Manifest merger failed : uses-sdk:minSdkVersion 9 cannot be smaller than version 10 declared in library /Users/tomo/Projects/mercari/Tasks/build/intermediates/exploded-aar/com.aviary.android/aviary/21.0.2/AndroidManifest.xml Suggestion: use tools:overrideLibrary=“com.aviary.android.feather.library" to force usage

ex) App’s min SDK -> 9 Aviary’s min SDK -> 10

Support older SDK version

Use overridelibrary marker to avoid the build error

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:installLocation="auto"> <uses-sdk tools:overrideLibrary=“com.aviary.android.feather.library”…

See our changes from KPT stand point

K eep

P roblem

T ry

What we keep doing since 2014

Issues we worked on

What we are currently working on

Word Translations• Transifix was used to prevent omission of

translationTranslation

TeamEngineer

3. Translate wordings

5. Push string.xml

4. Pull string.xml

2. Push string.xml

1. Pull string.xml

string.xml should be updated to the latest

to avoid conflict

Word Translations• However, too much time was taken for

changing one wordTranslation

TeamEngineer

3. Translate wordings

5. Push string.xml

4. Pull string.xml

2. Push string.xml

1. Pull string.xml

string.xml should be updated to the latest

to avoid conflict

How we changed translation process

• Wordings are decided on Redmine

• Created a check list to prevent omission

Translation Team

Engineer

Push string.xml

Product Manager

Analyzation• External analysis tools are easy way to collect

logs and visualize data

Analyzation• External analysis tools are easy way to collect

logs and visualize data

• On the other hand…

- Not suitable for analyzing into deeper meanings

- Data are stocked in each analysis tools

In-house Analysis platform : Pascal

• Now every logs are fully accessible from BQ

See our changes from KPT stand point

K eep

P roblem

T ry

What we keep doing since 2014

Issues we worked on

What we are currently working on

Reducing the size of App• Modularize functions- Set flavor to dependencies

- Split codes by flavor

Reducing the size of App• Look over the size of images

• Remove unused libraries, methods…

4.6MB→721KB

Reducing the size of App

• Size went down by 25%!!16.5 MB -> 12.4 MB

• Though did not raise the install rate… :-(

In-house AB testing• Apptimize for mobile AB Testing

• Some issues

- Can configure AB test programatically

- Segment specific users from GUI

- Analyzing data in detail was not so easy

- Not enough for complex testing including server-side

- Wanted to control A/B test from our server

In-house AB testing{ result: "OK", data: { experiment_results: [ { name: "003_buy_button_colors", variant: 3, metadata: { color : blue} } ] },

Request testing data

In-house AB testing{ result: "OK", data: { experiment_results: [ { name: "003_buy_button_colors", variant: 3, metadata: { color : blue} } ] },

Send testing result to Pascal

ABTest.runTest(ABTestList.BUY_BUTTON.getTestName(), new ABTest.ABTestRunner() { @Override public void run(ABTestContent content) { int id = content.getVariant(); switch (id) { . . .}

See our changes from KPT stand point

K eep

P roblem

T ry

Daily standup meeting 1 source code 2 products

Changed translation flow Developed in-house Analysis tool

Reducing the size of App Developing in-house AB Testing tool