Breaking Up (an Artifact) Is (Not That) Hard To Do
If you are like me, you missed the announcement about v24.2.0 of the
Android Support Library being released last week.
This release has an interesting change: support-v4
is being chopped
up into smaller modules.
support-v4
still exists. However, rather than being a library itself,
support-v4
relies upon transitive dependencies to pull in a series
of other modules that, in aggregate, cover what the standalone
support-v4
used to:
-
support-compat
: for most of the...Compat
classes -
support-media-compat
: media-specific backports -
support-fragment
: theandroid.support.v4
implementation of fragments, includingFragmentActivity
-
support-core-ui
: other stuff not listed above that has a UI, such asViewPager
-
support-core-utils
: other stuff not listed above, such asFileProvider
If you use support-v4
, nothing really changes. However, now you can
start requesting the individual modules that you need. This is reminiscent
of how play-services
was broken up into lots of smaller modules a couple
of years ago, so developers could pull in only the pieces that were needed.
The idea is that you should wind up with smaller APKs as a result, as you are not pouring lots of extraneous code into your project, then hoping that tools like ProGuard can get rid of that stuff.
In practice, the results will be mixed. For example, support-fragment
requires all the rest of the current modules, so changing from
support-v4
to support-fragment
will have no significant impact.
Modules like appcompat-v7
will need support-fragment
, and so
you will wind up with the extra ~1MB of APK bloat anyway if you are using
appcompat-v7
.
If you publish a large library, you could do the same sort of thing
as Google did with support-v4
.
Reorganize your source into discrete modules, with appropriate cross-module
dependencies. If needed, have a placeholder artifact representing the
entire library that pulls in all of the new modules, but adds little to
no code of its own. In general, having smaller libraries helps with
APK size; having the “kitchen sink” artifact makes it easier for
newcomers to get going with the library.