美文网首页
安卓模块化开发浅谈

安卓模块化开发浅谈

作者: 奋斗小青年Jerome | 来源:发表于2017-10-18 14:43 被阅读48次
    模块化开发适合于大型项目中多人协同开发,每个人独立开发某个模块,单独测试,单独维护,最终以library或者aar或者module的形式被应用层module依赖
    image.png

    这是一张模块化开发的分层图片

    module.png

    命名建议:
    1.底层:Library
    2.中间层:Module + 业务或功能名字
    3.上层:App + 项目名字
    建议分层进行

    • 底层:包含基础库和底层库

      • 基础库:
        包含所有模块需要的依赖库,以及一些工具类,比如封装了的常用网络请求,封装图片处理fresco,数据库相关等,还包含所有模块需要的依赖库;
      • 底层库:
        主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。例如:游戏引擎cocos2d
    • 中间层

      • 首先、分模块肯定要按照功能分,独立的一个功能,不能杂。比如、更新、登录、分享、播放,都可以。
      • 其次、我采取aar的形式作为模块的最小单位,为什么是aar不是jar,更不是library,因为jar不能带资源只能带java代码,library的话太容易被修改了,aar的好处是能带资源并且是编译好的,不能被修改。保证了模块的版本不会在被别人调用的时候随意修改,如果想修改就要联系做aar的人,让他去升级aar的版本。
        用android studio,打aar用maven;aar其实就是依赖,只不过之前的依赖都是存到了maven远程库里,自己用的话可以自己建和私有的maven库,太蛮烦的话可以直接用本地的aar文件做依赖。
    • 上层
      将所有的业务模块聚合在一起,加上配置,形成主应用,一个模块化做的好的应用,主应用应该很简单,并且非常的稳定。

    模块化开发最容易出现的就是依赖冲突,以下是解决依赖冲突的一些建议

    1.例如上面的项目,moduleA和moduleB都被app层依赖,而moduleA和moduleB都有如下资源

    <resources>
        ...
        <string name="confim">点击确认</string>
        ...
    </resources>
    

    app层中引用

    // app模块
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:text="@string/confim"
        />
    

    此时如果编译app,则app就会报资源名称冲突

    解决办法比较容易,每个子模块给资源名添加前缀,具体做法是在每个子模块的build.gradle文件的android块内添加一行代码:resourcePrefix “资源名前缀”:

    // moduleA模块的build.gradle文件
    ...
    android {
    
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
    
        resourcePrefix "module_A"
    
        ...
    
    }
    ...
    // moduleB模块的build.gradle文件
    ...
    android {
    
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
    
        resourcePrefix "module_B"
    
        ...
    
    }
    ...
    

    此时还不行,还需要我们手动去改一下资源名称,给前面加上前缀

    // moduleA模块
    <resources>
        ...
        <string name="moduleA">confim</string>
        ...
    </resources>
    
    // moduleB模块
    <resources>
        ...
        <string name="moduleB">confim</string>
        ...
    </resources>
    

    2.重复依赖

    Error:Module 'qsp_release:libLive:unspecified' depends on one or more Android Libraries but is a jar
    

    1.方法一:
    通过gradle配置
    dependencies { provided fileTree(dir: 'libs', include: ['*.jar'])}
    2.方式二:
    右键module选择open module setting,选择要修改的module名,切换到dependencies页面,将要修改的jar的scope修改provided模式。

    相关文章

      网友评论

          本文标题:安卓模块化开发浅谈

          本文链接:https://www.haomeiwen.com/subject/mtteuxtx.html