直接贴demo页面吧xxxd86/Axix: 关于新版动态化模块框架。可以打包apk

Axix解决了什么

        目前应用市场对于一些合规注册APP已经实现了静默app更新,让用户已经可以“无痛”升级到最新版本,不过对于我们开发者来说,每个冻结版本间的灰度测试也十分重要,这决定了正式版本上线的可用性以及用户适应度。以下从多个方面叙述一下Axix在开发方面的便捷体验。

        

        

首包体积——用户上手体验感

        考虑到设备的内存环境,设备Android SDK兼容,厂商……,新版本模块是否需要冻结打包上传这些都需要进行深度的考虑。

        Axix 通过动态加载模块的能力去掉二级模块包,按需加载,实现降低APK大小让用户快速下载应用,提高应用的传播速度。

        插件发版的意义与热更新的意义一样,都是为了让用户能够“无痛”感受到新版页面的升级,而不是苦苦等待2周的应用市场发版,对于开发者来说可以通过这样的形式,在发现线上问题或者需要对新版页面数据进行收集时,及时做出相应的调整。还能在下次大版本冻结更新的期间,为开发者提供模块测试空间

插件开发——开发迭代丝滑感

        对于Axix的插件开发来说,最大的优势是快速测试的能力,每个Module都可以作为一个独立APK进行快速测试,并且插件还可以打包成一个tiny-module.jar文件,这个文件相较于原本的aar模块包整整降低了50%,

Axix的Module包为什么这么小

        主要涉及的缩包内容包含resouce.arsc, Manifest文件,R.txt,proguard.txt……

        为什么可以去删掉这些东西,不会对我们的应用造成影响吗?我们一步一步分析。

        首先针对资源打包文件(R.txt,resouce.arsc),我们先将Compose例外,在模块化应用来说,维护一个干净统一的resource内容对于resouce.arsc资源文件来说是十分重要的——举一个简单例子,如果ModuleA 和 ModuleB 都拥有相同的new_dialog.xml 或者 card.png,但是两个程序员在开发过程中没有进行交流,导致最终集成打包时出现了xml和png命名冲突,png文件可以通过网络加载的方式防止出现相似问题。

        但是xml文件的处理方式,我们从技术上可以通过原生实现view页面方式,一个一个addview,这样可以实现,但是对于程序员太不友好了……虽然目前市面上有相应的可视化android组件搭建工具,但是不管是从学习成本上,还是技术迭代上都有一定的缺陷。其实摆在我们面前的只有两种方式。

        第一是对每个xml进行技术列表细分,通过依赖脚本的方式在集成前提示开发者对当前的xml文件进行冲突处理。

        第二是直接通过一个整体资源Module管理所有模块的资源文件,这样对资源管理模块需要很强的管理能力。

        对于Axix来说,将两种方案进行一定的思考,最终决定在首先建议开发者对于简单layout直接使用view的创建形式实现这样就可以实现tinyModule策略,打包体积平均减少40%,对于复杂xml页面提供插件打包模式makePluginApk实现了最小资源+代码包,代码减少为20%。

        Proguard更简单了,直接统一在Host工程的proguard里面写就行,不用针对每个模块进行处理。

Axix 如何开发一个新的模块

        直接将Axix基础代码fork下来,切换到develop。

git clone https://github.com/xxxd86/Axix.git -b develop

        首先在这个基础项目下面创建一个基础页面Module,如master分支的plugin-render-advanced模块就是一个简单的例子,下面我将从简易模块的设计,到本地测试,到publish到Maven做完整的介绍。

创建一个新的Module

        直接使用Android Studio创建一个与app同级的功能module,这里举例plugin-render-advanced,如以下代码所示创建一个继承PluginActivity的PostEnhancedActivity 

package com.redwolf.plugin_render_advanced

import android.os.Bundle
import android.widget.TextView
import com.redwolf.plugin_api.core.PluginActivity

class PostEnhancedActivity : PluginActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val tv = TextView(hostActivity)
        tv.text = "Hello from Plugin: render-advanced (Kotlin, no-MVI)!"
        hostActivity.setContentView(tv)
    }
}

测试阶段

        dependency {implementation(project(":plugin-render-advanced"))}

测试阶段分为两个阶段,本地加载阶段以及jar(apk)加载测试阶段

本地加载阶段

        这一阶段不涉及任何class文件加载过程,直接通过反射目标测试Activity,开发者只需要在测试app里面的Manifest里面注册代理类PluginProxyActivity即可,当然develop分支已经默认注册。

        <activity
            android:name="com.redwolf.plugin_api.core.PluginProxyActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"
            android:exported="false"
            android:launchMode="singleTask"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode|screenLayout|smallestScreenSize"/>

在加载类时直接使用以下本地加载

    object DemoHostLocal {
        fun run(ctx: Context) {
            val intent = PluginProxyActivity.createIntent(
                ctx = ctx,
                moduleName = HOST_LOCAL_MODULE, // 特殊值
                targetActivityClass = "com.redwolf.axix.LocalHelloActivity",
                version = null,
                remoteUrl = null,
                sha256 = null,
                certSha256 = null,
                pluginStrategy = PluginStrategy.LOCAL_ONLY,
                themeResId = 0,
                useFragmentFactory = true,
                networkPolicy = NetworkPolicy.OFF
            )
            ctx.startActivity(intent)
        }
    }

jar(apk)加载测试阶段

        使用Axix打包工具使用示例如./gradlew :plugin-render-advanced:makePluginApk ,详情工具可见打包脚本

发布阶段

        这里开发者可以直接使用打包完成的包,或者是通过修改上传脚本,将内容上传到Maven仓库里面

Axix在什么场景里面使用

1. 多种二级页开发,需要快速迭代场景。如搜索二级页,筛选二级页

2. 灰度测试阶段,上新页面模块

        

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐