Download - 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