Android架构_组件化Android开发Android知识整理

使用Small进行Android模块化开发

2016-11-18  本文已影响4791人  黄怡菲

如果你还未尝试过Small,建议你可以先去github上看看怎么使用Small

由于github上的文档较少,而且项目还在发展阶段,所以关于怎么使用Small的线索只能从Issue中寻找线索,而且有些问题是历史版本的问题。

这篇文章主要讲几个实践中的经验,也欢迎大家反馈使用中遇到的问题,一起踩坑。

根目录build.gradle

使用Small架构的工程中,根目录的build.gradle中一定包含

buildscript  {
    dependencies {
        classpath 'net.wequick.tools.build:gradle-small:1.1.0-beta3'
    }
}

apply plugin: 'net.wequick.small'

small {
    aarVersion = '1.1.0-beta9'
}

版本号的历史记录可以在Bintray上看到

工程目录结构

small_framework.png

上图是一个建议的工程结构图,一个Android Studio工程中包含三大部分

{
  "version": "1.0.0",
  "bundles": [
    {
      "uri": "main",
      "pkg": "com.example.mysmall.app.main",
      "rules":{
        "community":".CommunityFragment"
      }
    },
    {
        "uri": "lib.main",
        "pkg": "com.example.mysmall.lib.main"
    }
  ]
}

在宿主模块的assets目录下的bundle.json声明宿主使用的插件,每个bundle还能定义一些rule去启动特定的Activity。

这里注意,lib模块也要在bundle中定义,否则运行时会出错。

还需要在宿主模块中增加签名配置和共享的依赖库

signingConfigs {
    release {
        storeFile file('../sign/release.jks')
        storePassword "5mall@ndro!d"
        keyAlias "small"
        keyPassword "5mall@ndro!d"
    }
}
buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

[...]

compile 'com.android.support:design:23.1.1'

关于怎么添加一个插件模块,请参考怎么使用Small

编译

编译公共库插件

[./]gradlew buildLib -q (-q是安静模式,可以让输出更好看,也可以不加)

small_build_lib.gif

可以看到buildLib不仅编译了lib.xxx,还编译了宿主模块。

编译业务插件

[./]gradlew buildBundle -q

small_build_bundle.gif

单独编译一个插件

[./]gradlew -p app.main assembleRelease

对插件的编译,会在app/smallLibs/生成对应的so文件,这些so文件本质上就是独立的apk包。

所以修改某个模块之后,要在运行时生效,必须先编译对应的插件,更新smallLibs下的so文件。

在lib.xxx中删除资源

编译后的lib,如果删除资源再编译就会出现错误

No support deleting resources on lib.* now!

这是为了保证lib的资源id不变,从而可以独立更新而不影响任何依赖它的app插件。具体可参考为什么要使用last built id

所以在删除lib中的资源后,需要删除lib.xxx模块下的public.txt再通过cleanLib, buildLib, cleanBundle, buildBundle重新编译。

运行过程分析

Small的运行可以分为三步

  1. 框架的初始化
  2. 插件的初始化
  3. 通过uri启动插件
public class SmallApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        CrashHandler.getInstance().setCustomCrashHanler(getApplicationContext());
        /**
         * 1. Small框架初始化
         */
        Small.preSetUp(this);
    }
}
public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        /**
         * 2. Small插件初始化
         */
        Small.setUp(SplashActivity.this, new Small.OnCompleteListener() {
            @Override
            public void onComplete() {
                        /**
                        * 3. 通过uri启动插件
                        */
                        Small.openUri("main", SplashActivity.this)
                        finish();
            }
        });
    }
}

从插件初始化,到初始化完成会耗费几百毫秒,甚至更多(应该和机器速度和插件规模相关),所以可以考虑将欢迎页放入宿主工程之中。

如果欢迎页有比较复杂的广告逻辑或统计相关的逻辑,则可以考虑在主插件中做一个透明的Activity来处理。

Manifest相关

热更新

具体可参考Small热更新源码

  1. 通过接口获取更新信息,里面可以包括version,bundles,updates

{
"manifest": {
"version": "1.0.0",
"bundles": [
{
"uri": "lib.utils",
"pkg": "net.wequick.example.small.lib.utils"
},
{
"uri": "lib.style",
"pkg": "com.example.mysmall.lib.style"
},
{
"uri": "lib.analytics",
"pkg": "net.wequick.example.lib.analytics"
},
{
"uri": "main",
"pkg": "net.wequick.example.small.app.main"
},
{
"uri": "home",
"pkg": "net.wequick.example.small.app.home"
},
{
"uri": "mine",
"pkg": "net.wequick.example.small.app.mine"
},
{
"uri": "detail",
"pkg": "net.wequick.example.small.app.detail",
"rules": {
"sub": "Sub"
}
},
{
"uri": "about",
"pkg": "net.wequick.example.small.app.about"
}
]
},
"updates": [
{
"pkg": "net.wequick.example.small.app.about",
"url": "http://wequick.github.io/small/upgrade/libnet_wequick_example_small_app_about.so"
},
{
"pkg": "net.wequick.example.small.lib.utils",
"url": "http://wequick.github.io/small/upgrade/libnet_wequick_example_small_lib_utils.so"
},
{
"pkg": "com.example.mysmall.lib.style",
"url": "http://wequick.github.io/small/upgrade/libcom_example_mysmall_lib_style.so"
},
{
"pkg": "net.wequick.example.small.app.home",
"url": "http://wequick.github.io/small/upgrade/libnet_wequick_example_small_app_home.so"
}
]
}

2. 通过**Small.updateManifest**更新bundles.json和version信息
3. 根据updates下载各插件的so文件,并将so文件复制到对应的补丁文件路径下(通过**Bundle.getPatchFile**获取补丁文件目录)
4. 调用**Bundle.upgrade**使更新后的插件生效
上一篇 下一篇

猜你喜欢

热点阅读