$30 off During Our Annual Pro Sale. View Details »

Reducing Mobile Data Usage in your Android Apps

Reducing Mobile Data Usage in your Android Apps

In this presentation, we take a look at the different areas in your app that you can improve mobile data usage in. Specifically Server Interactions, Images and APK Package Size.

Rebecca Franks

June 14, 2016
Tweet

More Decks by Rebecca Franks

Other Decks in Technology

Transcript

  1. @riggaroo
    Reducing Mobile Data
    Usage in your Apps
    Rebecca Franks
    @riggaroo

    View Slide

  2. @riggaroo
    Rebecca Franks
    Senior Android Developer & Google Developer
    Expert
    DVT / DStv
    www.riggaroo.co.za
    @riggaroo

    View Slide

  3. @riggaroo
    Why should we reduce data usage?

    Expensive Mobile Data

    View Slide

  4. @riggaroo

    Why should we reduce data usage?

    View Slide

  5. @riggaroo
    3 Areas to improve
    Images

    Bundled App

    Server Interactions

    View Slide

  6. @riggaroo
    Server Interactions

    View Slide

  7. @riggaroo
    Features of your API have a
    huge impact on
    performance of your app

    View Slide

  8. @riggaroo
    Offline First Design

    View Slide

  9. @riggaroo
    Every Request Counts.

    View Slide

  10. @riggaroo
    Aggregate on the Backend

    View Slide

  11. @riggaroo
    Design your API
    based on the usage
    of your app
    {
    "name": "Rebecca Franks”,
    "profileUrl": "http://riggaroo.co.za/image.jpg",
    "followers": 50,
    "repositories": [
    {
    "name": "Book Dash Android App",
    "id": "bookdash-android-app"
    },
    {
    "name": "MVP Example",
    "id": "mvp-example"
    }
    ]
    }

    View Slide

  12. @riggaroo
    Strip unused information
    {
    login: "riggaroo",
    id: 9973046,
    avatar_url: "https://avatars.githubusercontent.com/u/9973046?v=3",
    gravatar_id: "",
    url: "https://api.github.com/users/riggaroo",
    html_url: "https://github.com/riggaroo",
    followers_url: "https://api.github.com/users/riggaroo/followers",
    following_url: "https://api.github.com/users/riggaroo/following{/other_user}",
    gists_url: "https://api.github.com/users/riggaroo/gists{/gist_id}",
    starred_url: "https://api.github.com/users/riggaroo/starred{/owner}{/repo}",
    subscriptions_url: "https://api.github.com/users/riggaroo/subscriptions",
    organizations_url: "https://api.github.com/users/riggaroo/orgs",
    repos_url: "https://api.github.com/users/riggaroo/repos",
    events_url: "https://api.github.com/users/riggaroo/events{/privacy}",
    received_events_url: "https://api.github.com/users/riggaroo/received_events",
    type: "User",
    site_admin: false,
    name: "Rebecca Franks",
    company: null,
    blog: "http://riggaroo.co.za",
    location: "Johannesburg, South Africa",
    email: null,
    hireable: null,
    bio: "Google Developer Expert for Android. Senior Android Developer based in South Africa. ",
    public_repos: 14,
    public_gists: 5,
    followers: 128,
    following: 13,
    created_at: "2014-11-27T06:32:40Z",
    updated_at: "2016-06-03T15:23:57Z"
    }
    {
    login: "riggaroo",
    id: 9973046,
    avatar_url: "https://avatars.githubusercontent.com/u/9973046?v=3",
    url: "https://api.github.com/users/riggaroo",
    html_url: "https://github.com/riggaroo",
    followers_url: "https://api.github.com/users/riggaroo/followers",
    following_url: "https://api.github.com/users/riggaroo/following{/other_user}",
    gists_url: "https://api.github.com/users/riggaroo/gists{/gist_id}",
    starred_url: "https://api.github.com/users/riggaroo/starred{/owner}{/repo}",
    repos_url: "https://api.github.com/users/riggaroo/repos",
    type: "User",
    site_admin: false,
    name: "Rebecca Franks",
    blog: "http://riggaroo.co.za",
    location: "Johannesburg, South Africa",
    bio: "Google Developer Expert for Android. Senior Android Developer based in South Africa. ",
    public_repos: 14,
    followers: 128,
    following: 13,
    }

    View Slide

  13. @riggaroo
    GZIP your Data
    Ensure app is requesting GZIP

    View Slide

  14. @riggaroo
    Enable HTTP Cache
    Cache-Control: max-stale=3600
    private final OkHttpClient client;
    public CacheResponse(File cacheDirectory) throws Exception {
    int cacheSize = 10 * 1024 * 1024; // 10 MiB
    Cache cache = new Cache(cacheDirectory, cacheSize);
    client = new OkHttpClient.Builder()
    .cache(cache)
    .build();
    }

    View Slide

  15. @riggaroo
    Keeping user’s data fresh
    Any new data now?
    And now?
    What about now?
    Have some data
    Have the same data
    Have the same data

    View Slide

  16. @riggaroo
    Keeping user’s data fresh
    Give me the data
    Have some data
    Have the changed data

    Firebase
    Cloud Messaging
    Have the changed data

    View Slide

  17. @riggaroo
    Be courteous
    Wait for ideal conditions
    - WiFi + Battery
    Defer unimportant operations

    View Slide

  18. @riggaroo
    GcmNetworkManager
    •Schedule one-off vs. periodic tasks.
    •Automatic back-off and failure retry.
    •Awareness of network activity.
    •Awareness of device charging state.
    •Persistence of tasks across boot.

    View Slide

  19. @riggaroo
    Give your user options…
    Sync Frequency Image Quality

    View Slide

  20. @riggaroo
    Try new things
    Push Messaging

    View Slide

  21. @riggaroo
    Tools to monitor
    Data Usage

    View Slide

  22. @riggaroo
    Stetho by Facebook (Android)
    Allows you to use Chrome Developer Tools with Android Apps
    - Monitor requests
    - Edit Preferences & Databases

    View Slide

  23. @riggaroo
    Charles Proxy
    •HTTP Request Proxying
    •View Web Traffic
    •Throttle connections
    •Intercept Traffic
    •https://www.charlesproxy.com/

    View Slide

  24. @riggaroo

    View Slide

  25. @riggaroo
    Android Network Monitor
    How and when your app transfers data

    View Slide

  26. @riggaroo
    Emulator

    View Slide

  27. @riggaroo
    Images

    View Slide

  28. @riggaroo
    Don’t download what your
    users wont see.

    View Slide

  29. @riggaroo
    Don’t download large images
    for small areas
    fb.com/image1.jpg?w=150 fb.com/image1.jpg?w=400

    View Slide

  30. @riggaroo
    Look at Device Pixel Ratio
    fb.com/image.jpg?dpi=0.75 fb.com/image.jpg?dpi=2.0
    Android Low DPI Retina Display

    View Slide

  31. @riggaroo
    Don’t download images twice.
    Cache them.

    View Slide

  32. @riggaroo
    Download lower quality on slower
    networks.

    View Slide

  33. @riggaroo
    Image Compression
    Always use *SAVE FOR WEB*

    View Slide

  34. @riggaroo
    zopfliPNG
    ImageMagick
    PNGQuant
    PNGWolf
    PunyPNG Defluff
    TinyPNG
    PNGGauntlet TruePNG

    View Slide

  35. @riggaroo
    1.2MB 183KB 201KB
    aaptOptions {
    cruncherEnabled = false
    }
    Custom
    Compression
    AAPT

    View Slide

  36. @riggaroo
    • VectorDrawable / ShapeDrawable
    • WebP (4.1 above)
    • Transparent WebP - (4.4 above)
    • JPEG
    • PNG
    Image Types Supported in Android

    View Slide

  37. @riggaroo
    VectorDrawable
    WebP
    JPG
    PNG
    Can the image be a VD?
    Do you support WebP?
    Does it need transparency?
    Is it simple or complex?
    Yes
    Yes
    Yes
    Simple
    Complex
    No
    No
    No
    How to decide what type of image to use:

    View Slide

  38. @riggaroo
    Bundled Package Size
    Size of your APK

    View Slide

  39. @riggaroo
    What is packaged in our APK?
    • App Code
    • classes.dex
    • Native Code (libs/
    /*.so)
    • Resources
    • res/
    • resources.arsc
    (uncompressed!)
    • Misc
    • assets/
    • META-INF/
    • AndroidManifest
    .xml
    .apk

    View Slide

  40. @riggaroo
    APK Analyser
    • Demo

    View Slide

  41. @riggaroo
    Removing Unused Code
    buildTypes {
    release {
    minifyEnabled true
    shrinkResources true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'
    }
    Enable ProGuard + Test

    View Slide

  42. @riggaroo
    Removing Unused Code
    android {
    defaultConfig {
    ...
    resConfigs "en", "zu"
    }
    }
    Remove unused configurations
    0.35MB
    SAVED
    4MB -> 3.65MB =

    View Slide

  43. @riggaroo
    Build Variants
    • Split APK up
    • Architecture
    • Screen Size
    • Downside - many APKs to test
    android {
    ...
    splits {
    abi {
    enable true
    reset()
    include 'x86', 'armeabi-v7a', 'mips'
    universalApk true
    }
    }
    }

    View Slide

  44. @riggaroo
    ArscBlamer
    • resources.arsc file gets big
    • ArscBlamer is a command-line tool that can parse an Android
    app's resources.arsc file and extract useful, actionable
    information about its contents.
    • https://github.com/google/android-arscblamer

    View Slide

  45. @riggaroo
    REMEMBER
    Every Request Counts
    Reduce your size of your app
    Optimise your image usage

    View Slide

  46. @riggaroo
    Thank you.
    www.riggaroo.co.za

    View Slide

  47. @riggaroo
    Links
    • Image Compression for Android Developers- https://www.youtube.com/
    watch?v=r_LpCi6DQME
    • APK Analyser - http://android-developers.blogspot.co.za/2016/05/
    android-studio-22-preview-new-ui.html
    • Network Monitor - https://developer.android.com/studio/profile/am-
    network.html
    • Put your APK on a diet - https://www.youtube.com/watch?v=xctGIB81D2w
    • http://www.slideshare.net/fbrunel/mobile-api-design-techniques-26952520
    • https://code.facebook.com/posts/872547912839369/improving-facebook-s-
    performance-on-android-with-flatbuffers/
    • https://medium.com/@duhroach/smaller-pngs-and-android-s-aapt-
    tool-4ce38a24019d#.vi5zl3tjr

    View Slide