Android Studio module + gradle的巧妙运用

来源:互联网 发布:云短信软件 编辑:程序博客网 时间:2024/06/05 08:39

目标:用一个工程的代码打包五个app,并实现更新一个功能时使所有工程内的app同步更新

先上结果图:
改前
更改前的项目结构
改后
更改后的项目结构
**

1:写这篇博客的原因

**
由于项目中集成了个推推送sdk,导致近日google发邮件通知由于违反隐私协议将会下架公司的几个app。

个推sdk也进行了修改,发布了所谓的谷歌专版…
个推谷歌专版
这个问题好解决,替换jar跟so就行

问题在于几个子版本app都是由拷贝母版本的工程文件修改软件图标,启动画面制作完成的。代码重复,资源重复。导致即使是替换一个jar包这样的小更新都需要打开5.6个工程进行替换、打包。
几个弊端:
1:维护困难
app中如果出现bug需要修改,则需要现在母版本上面改好,然后将修改的地方重新在子版本上同步进行修改。有时一个小问题(如上面所说的更新jar包,我需要打开五六个工程替换)当一个技术活变成了繁琐活之后,就得做点改变了

2:不方便扩展

3 多次复制工程文件,内存占用太多
电脑256G固态硬盘,放系统放软件放工程文件,内存吃紧…

由于在此期间同时也在做IOS,看了公司IOS的工程代码,发现XCode上的工程,有个叫“target”的东西

一个工程内可以创建多个target,每个target可以选择引用的文件、资源以及配置文件,由此来实现代码的复用以及资源文件的区分。
XCode target介绍

打个比方,我需要修改一下app的服务器地址
用Android 这边的写法就是打开5、6个工程,将工程内写上服务器地址的字符串的地方修改成最新的服务器
而在IOS这边,由于写着服务器地址的文件是5、6个app共同引用的,所以我只需要修改一处地方,而后将服务器地址修改完成直接打包就可以完成服务器地址的更新

2 Android studio module+gradle实现类似xcode target功能

废话说完了,开始进入正题
首先要明白一点,Android studio的构建方式是module+gradle构建脚本来完成的,且一个module对应一个gradle脚本

module内则放置java代码,资源文件
gradle内保存的信息有appid(软件包名、app唯一标识符),在Android studio创建module的时候会自动生成一个build.gradle脚本

这么一说思路就有了,两个module,一个放置主要的逻辑代码跟必要的资源文件,另一个放置appIcon跟launchImage并引用前一个module,如此一来就能完美实现我之前的需求:代码复用,资源区分开来

1在工程上新建module
这里写图片描述
2选择phone&tablet Module
这里写图片描述
3接下来选择不添加activity
这里写图片描述

创建完后工程结构就变成了这样
这里写图片描述

此时自动生成一个build.gradle脚本,module内自动生成manifest文件,java、res文件夹

删除java文件夹下的androidTest和test包,并于build.gradle内删除创建module时自动生成的引用(一般来说就是一个Androidtest框架和appcompat包) 此时我们注释掉它

这里写图片描述

还有defaultConfig配置内的这句

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

要实现引用,需要在childapp的build.gradle内添加

compile project (':app')//注意,此处为冒号+源码module名

美滋滋 此时sync gradle 进度条转着转着发现出问题了

因为此时工程引用的源码module是一个application
这里写图片描述
而作为引用module,需要将结尾的application改为library
这里写图片描述
继续编译,继续出错
这里写图片描述
一眼就看明白,library工程不能设置appid 所以注释掉原有的appid
这里写图片描述

注意:子module的gradle脚本内的minSdkVersion不可低于源码gradle脚本内的MinSdkVersion
更改时注意检查,最好将其一致,否则会编译报错

同步gradle,大功告成

阅读全文
1 0
原创粉丝点击