Android编程-项目中用到的gradle分sdk的实例

本文为网络转载文章。文章内观点不代表本博客立场。本转载仅用于技术学习与交流。

1、 场景

项目里有一个功能,集成了第三方的sdk,项目很小,所以相关sdk及代码没有抽离成module。这个功能找了两个供应商,两个厂商的sdk不兼容,所以需要对不同供应商的设备分别打包。决定使用gradle对项目代码和sdk进行分flavor打包。

2、 首先对lib分flavor

修改gradle.build中的flavor配置。项目本身有一个环境维度的flovar “env”,对应测试环境flavor “xxTest”和“xx”,现在需要添加多一个维度”sdk”,对应两家供应商”one”,”two”。由于考虑到代码里面会有根据厂商不同做一些选择处理的逻辑,所以在里面又增加了”SDK”常量定义。

apply plugin: 'com.android.application'android {    flavorDimensions "env","sdk"    productFlavors {        subwayTest {            buildConfigField "String","SERVER_IP","\"a.com\""            buildConfigField "String","COMMON_SERVER_PORT","\"8080""            dimension "env"        }        subway {            buildConfigField "String","SERVER_IP","\"b.com\""            buildConfigField "String","COMMON_SERVER_PORT","\"8080""            dimension "env"        }        one {            buildConfigField "String", "SDK","\"one\""            dimension "sdk"        }        two {            buildConfigField "String", "SDK","\"two\""            dimension "sdk"        }    }...}
修改依赖中lib的写法。第三方sdk有许多 so文件,也有jar,我这里简单粗暴的把lib整个复制成两份,把其中对应的不同的jar包换掉,这样配gradle就不用一个文件一个文件写了。我也试过把libs里面放so,只把jar分开,但是跑不起来,所以就把so文件都copy了。以后可以再研究一下。
repositories {    flatDir {        dirs 'libs'    }}sourceSets.main.jniLibs.srcDirs = ['libs']
dependencies {    oneImplementation fileTree(include: ['*.jar'], dir: 'onelibs')    twoImplementation fileTree(include: ['*.jar'], dir: 'twolibs')//  implementation fileTree(include: ['*.jar'], dir: 'libs')...}

修改文件目录

前:

后:

3、 对代码部分分包

添加flavor文件夹与main平级,如下。

把有区别的代码按原来的包结构拷到对应两个flavor下面,main下面就不要再留同样的文件。AndroidManifest.xml也拷进去,可以分别进行配置。如果资源文件也有区别,可以在/java平级建。

为了防止入口activity创建多个实例,需要修改各个flavor里面的AndroidManifest.xml,把入口activity标签里多加一个属性

tools:node=”replace”

原文链接:https://my.oschina.net/u/268088/blog/4317407

关注我获取更多知识或者投稿

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/android编程-项目中用到的gradle分sdk的实例/

此条目发表在Android分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。