Android 将application改造成library的方法

有时候我们要把一个app的核心代码作为一个公共的库,用在公司的各种不同的app中,最笨的方式可能就是把当前的代码copy一份,然后在此基础上做业务修改,但是为了更好的拓展和保持原有业务不变,可以将application改造成library,library编译后的产物.aar可以发布到仓库供多个项目使用,下面我们就说一下简单的改造


一般我们改造分为四个步骤


  1. 打开app目录下 build.gradle 文件,注意不是项目全局的build.gradle,我发现好多人对这个区分不开,大概是没有学习过gralde的项目管理基础吧
  2. 找到defaultConfig 删除 applicationId 。只有 Android 应用才能定义 applicationId ,不然编译会报错的
  3. 在文件的顶部(一般都是第一行)将 apply plugin: 'com.android.application' 修改为 apply plugin: 'com.android.library'
  4. 保存文件,然后依次点击 File > Sync Project with Gradle Files。大功告成。模块的整个结构仍然相同,但是现在它会作为 Android library运行,编译现在也会创建 AAR 文件,而不是 APK。如果您想要编译 AAR 文件,请在 Project 窗口中选择要编译的库模块,然后依次点击 Build >Make Module my-library-module或者用gradle生成aar

特殊注意事项
  • 在将将application改成library后,如果涉及到ViewonClick 事件多分支选择的,不能使用 switch (view.getId()){...} 作为逻辑处理,必须使用if--else if---else的形式,不然编译会报错

将库添加为依赖项


方法一、图形界面操作
  • 添加已编译的 AAR(或 JAR)文件到项目(库必须已编译):
    a. 依次点击 File > New > New Module
    b. 点击 Import .JAR/.AAR Package,然后点击 Next
    c. 输入已编译的 AAR 或 JAR 文件的路劲位置,然后点击 Finish
  • library Module 导入到您的项目(库源代码会成为项目的一部分):
    a. 依次点击 File > New > Import Module
    b. 输入库模块目录的位置,然后点击 Finish
方法二、Gradle脚本导入(个人喜欢这个)
  • 添加已编译的 AAR(或 JAR)文件到项目(库必须已编译):
    a、一般都是将生成的AAR(或 JAR)放到 libs目录下 ,如:lib/my-library-module-release.aar
    b、在gradle的dependencies{...}节点下配置
 android{
     ...
    productFlavors {
        pro { ... }
        other{...}
    }
    configurations {
        proDebugImplementation
        proReleaseImplementation
    } 
   }

dependencies {
  //一般的只需要这样一行配置就可以使用
  implementation (name: 'my-library-module-release', ext: 'aar')
  //特殊情况下可以用configurations 里面定义的配置不同环境的依赖,二选一
  proDebugImplementation (name: 'my-library-module-debug', ext: 'aar')  //比如开发环境下
  proReleaseImplementation (name: 'my-library-module-release', ext: 'aar') //正式发布环境
}

我们也可以在app目录下创建一个专门存放aar文件的目录,如aars

  • 这样我们需要在gradle中通过以下脚本进行指定该目录才能使用
 repositories {
  flatDir { dirs 'aars' } 
 }
 dependencies {
    //一行代码将aars目录下的aar文件都依赖进项目中
   implementation fileTree(dir: 'aars', include: ['*.aar'])
 }

如果是jar包就直接 implementation fileTree(dir: 'libs', include: ['*.jar']) ,这行配置可以引入libs下所有的jar包,当然你也可以引入个别的jarimplementation file('libs/my-lib-module-release.jar');

  • library Module 导入到您的项目(库源代码会成为项目的一部分):
    a. 确保 my-library-module和 app在同一级目录
    b. 然后在 settings.gradle 中进行配置 include ':app', ':my-library-module'
    c. 打开app的 build.gradle 文件,然后添加dependencies
    d.点击 Sync Project with Gradle Files
 dependencies {implementation project(":my-library-module") }

以上为基本用法,要是有定制化的变体,可以使用 buildVariantName+Implementation的形式,而不是 implementation。例如,如果只想在“pro”产品中包含此库,其他项目中用不到这个库里面的内容,避免影响打包的编译速度

   android{
     ...
    productFlavors {
        pro { ... }
        other{...}
    }
   }
    dependencies {
        proImplementation project(":my-library-module")
    }  

将库添加为依赖项后在打包的时候经常会出现资源合并冲突

1、资源id经可能用该库为前缀或者后缀,有一定特色的命名,避免在values.xml合并的时候报错
2、AndroidManifest.xml合并的时候也会报错,比如android:name,android:icon,android:label,android:theme 等属性冲突,可以在应用的AndroidManifest.xmlapplication节点加入以下代码解决,多个属性之间用逗号隔开

<application tools:replace="android:theme,android:label,android:allowBackup,android:icon">

查看AndroidManifest.xml报错日志可以参考 Android studio各种gradle报错解决方案汇总

学习更多的合并冲突请看官方文档 合并多个清单文件


最后建议大家学习一下gralde 基础语法,弄清楚projecttast的;不要只知道在 dependencies {...}加入依赖,结果gradle一报错自己就慌了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值