Add support for Split APK dependcies
Apps can now declare in their base APK AndroidManifest.xml that they want to have their split APKs loaded in isolated Contexts. This means code and resources from the split get loaded into their own ClassLoader and AssetManager. <manifest xmlns:android="..." ... android:isolatedSplits="true" ... In order to make this more useful, splits can declare dependencies on other splits, which will all get pulled in to the Context and run as expected at runtime. A split declares its dependency on another split by using the tag <uses-split> in its AndroidManifest.xml: <manifest xmlns:android="..."> ... <uses-split android:name="feature_split_1" /> ... A split can have a single parent on which it depends on. This is due to the limitation of having a single ClassLoader parent. All splits depend on the base APK implicitly. PackageManager verifies that no cycles exist and that each dependency is present before allowing an installation to succeed. The runtime will then load splits based on the dependencies. Given the following APKs: base <-- split A <-- split C ^----- split B If an Activity defined in split C is launched, then the base, split A, and split C will be loaded into the ClassLoader defined for the Activity's Context. The AssetManager will similarly be loaded with the resources of the splits. A split can be manually loaded by creating a Context for that split, defined by its name: Context.createContextForSplit("my_feature_split_1"); All installed Activities, Services, Receivers, and Providers are accessible to other apps via Intent resolution. When they are instantiated, they are given the appropriate Context that satisfies any dependencies the split they were defined in stipulated. Test: WIP (CTS tests to come) Change-Id: I8989712b241b7bc84381f2919d88455fcad62161
Loading
Please register or sign in to comment