The document discusses changes to Android development at Merari since 2014. It summarizes that they have kept daily standup meetings between Tokyo and San Francisco offices. They have also kept one source code base but target two products for the US and JP markets by using flavors. Issues worked on include streamlining the translation process and reducing app size. Current work involves developing an in-house analysis platform and AB testing tool to have more control and insights.
5. 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
6. But before we go,
Let’s talk about our current status
7. 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…
8. 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
9. 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
10. 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
11. 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"
}
}
12. 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
13. 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
14. Support older SDK version
Importing 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
15. 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”…
16. 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
17. Word Translations
• Transifix was used to prevent omission of
translation
Translation
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
18. Word Translations
• However, too much time was taken for
changing one word
Translation
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
19. 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
21. 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
23. 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
24. Reducing the size of App
• Modularize functions
- Set flavor to dependencies
- Split codes by flavor
25. Reducing the size of App
• Look over the size of images
• Remove unused libraries, methods…
4.6MB→721KB
26. Reducing the size of App
• Size went down by 25%!!
16.5 MB -> 12.4 MB
• Though did not raise the install rate… :-(
27. 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
28. In-house AB testing
{
result: "OK",
data: {
experiment_results: [
{
name: "003_buy_button_colors",
variant: 3,
metadata: { color : blue}
}
]
},
Request testing data
29. 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) { . . .}
30. 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