最近几年,Android动态化,插件化相关技术在国内市场弄的风声水起,可以说Android程序员不去了解一下相关技术都会被人鄙视,但是相关技术却遭到苹果和Google双重封杀,毕竟人家希望平台的生态完全掌握在自己的手中。但国人的努力并非没有得到认可,Google就为此开发了App Bundle,其实就是对相关技术的认可。使用App Bundle,apk必须上传到google play才支持,幸运的是,国内华为的HMS为了兼容android平台,也支持相关技术,所以实例中会同时说到两个产家的方案。
App Bundle是什么东西?介绍性的东西,无论是官网还是简书上都有不少介绍,这里就不累述,可参考:
Android App Bundle
AndroidAppBundle
这里主要侧重于实例。
什么是Base APK
你用Android Studio新建任何一个工程(Application),都可以是Base APK。
- 新建base apk与Dynamic feature
新建一个Empty Activity工程作为Base apk,然后app右键,通过New -> New Module,新建一个Dynamic Feature Module:
在Dynamic Feature Module同样新建一个Empty Activity。
那么如何使Base APk与Dynamic Feature Module关联起来呢?其实这部分工作Android Studio默认就做了:
在Base apk中,它会添加:
dynamicFeatures = [":dynamictest"]
而在Dynamic部分,会添加:
implementation project(':app')
- 动态管理
1)依赖包,前者为Google的依赖包,后者为华为的依赖包,
api "com.google.android.play:core:1.7.3"
api 'com.huawei.hms:dynamicability:1.0.11.302'
要使得华为的依赖包可以下载,还需要在Project中添加仓库maven {url ‘http://developer.huawei.com/repo’}:
allprojects {
repositories {
google()
jcenter()
maven {
url 'http://developer.huawei.com/repo'}
}
}
2)华为的动态管理实现
华为的APP Bundle需要在base apk和dynamic feature分别初始化,base apk端在application初始化:
public class DynamicApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
FeatureCompat.install(base);
}
}
而dynamic feature处在Activity中初始化:
package net.wen.dynamic.test;
public class MainActivity extends AppCompatActivity {
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
FeatureCompat.install(newBase);
}
}
除了初始化,其它部分的代码都在base apk中。
华为的动态管理类叫FeatureInstallManager,在Activity中可以对其进行初始化和添加listener:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFeatureInstallManager = FeatureInstallManagerFactory.create(this);
findViewById(R.id.click_test).setOnClickListener(v -> launchDynamic());