A Look at App Modularization

Ken Baldauf

Senior Software Engineer @ Originate

Advantages

  • Faster gradle builds
  • Code reusability & separation
  • Step towards app bundles & instant apps

Case Study

  • Shopping app
    • Amazon for Android themed socks
  • Our app consists of 3 main sections
    • Onboarding
    • Marketplace
    • Checkout

Modules

  • App
  • Common
  • Onboarding
  • Marketplace
  • Checkout

File Structure

.
├── app # connects all of the modules together
│   ├── src
│   ├── build.gradle
├── common (library)
│   ├── src # common utilities and resources shared by multiple modules
│   ├── build.gradle
├── onboarding (library)
│   ├── src # onboarding specific source code & resources
│   ├── build.gradle
├── marketplace (library)
│   ├── src # marketplace specific source code & resources
│   ├── build.gradle
├── checkout (library)
│   ├── src # checkout specific source code & resources
│   ├── build.gradle
└── build.gradle

Dependencies

App

Onboarding

Marketplace

Checkout

Common

Module Interaction

  • How do modules interact with each other?
    • App interacts with everything directly
    • Features interact directly with Common
  • But how do features interact with each other?
    • AppRouter
      • Handles all activity & fragment transitions

AppCommonRouter

package com.ocandroid.common;

public abstract class AppCommonRouter {

    private static AppCommonRouter instance;

    // required to set instance since static methods can't be abstract
    public static void setInstance(AppCommonRouter routerInstance) {
        instance = routerInstance;
    }

    public static AppCommonRouter getInstance() {
        return instance;
    }

    public abstract void startOnboarding(@NonNull Activity activity);

    public abstract void startMarketplace(@NonNull Activity activity);

    public abstract void startCheckout(@NonNull Activity activity);
}

AppRouter

package com.ocandroid.app;

public class AppRouter extends AppCommonRouter {

    private static AppRouter instance = new AppRouter();

    public static AppRouter getInstance() {
        return instance;
    }

    public void startOnboarding(@NonNull Activity activity) {
        // implementation here
    }

    public void startMarketplace(@NonNull Activity activity) {
        // implementation here
    }

    public void startCheckout(@NonNull Activity activity) {
        // implementation here
    }
}

AppRouter Connection

package com.ocandroid.app;

public class OCAndroidApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        AppCommonRouter.setInstance(AppRouter.getInstance());
        // other app creation logic
    }
}

AppRouter Usage

package com.ocandroid.marketplace;

public class MarketplaceActivity extends AppCompatActivity {

    // other app methods and variables

    public void checkoutButtonClicked() {
        AppCommonRouter.startCheckout(this);
    }
}

Questions?

A Look at App Modularization

By Kenneth Baldauf

A Look at App Modularization

An overview on how Android's app modules were used on a recent project to improve build speed and facilitate cleaner code.

  • 345