[deprecated]gradle flavor

6
Flavor 逻辑: Flavor 不分维度只根据机型来判断维度的时候 Flavor Debug(buildType) Release(buildType) MX3 MX3Debug MX3Release MX3 MX3Debug MX3Release M75 M75Debug M75Release M75 M75Debug M75Release 这样就可以根据机型的不同,在不同的 flavor 目录下,放置不同的 res 资源,java 代码, AndroidManifest 文件等 Flavor 手机型号(Model) 签名平台(Fingerprint) 两个维度的时候 Model (flavor dimen) Fingerprint (flavor dimen) Debug(buildType) Release(buildType) MX3 eng MX3EngDebug MX3EngRelease MX3 prd MX3PrdDebug MX3PrdRelease M75 eng M75EngDebug M75EngRelease M75 prd M75PrdDebug M75PrdRelease 这样可以做的事情更多,可以根据编译时用的签名平台不同,来处理不同平台需要的不同的 第三方 access_key, token, meta-data, 等等东西(具体教程以后再补) 在以上两个维度的前提下,加入 ABI 维度 Model (flavor di…) Fingerprint (flavor dimen) ABI (flavor dimen) Debug(buildType) Release(buildType) MX3 eng arm MX3EngArmDebug MX3EngArmRelease MX3 eng x86 MX3EngX86Debug MX3EngX86Release MX3 prd arm MX3PrdArmDebug MX3PrdArmRelease MX3 prd x86 MX3PrdX86Debug MX3PrdX86Release M75 eng arm M75EngArmDebug M75EngArmRelease M75 eng x86 M75EngX86Debug M75EngX86Release M75 prd arm M75PrdArmDebug M75PrdArmRelease M75 prd x86 M75PrdX86Debug M75PrdX86Release 加入 ABI 维度之后,对于使用了 NDK 混合开发的,可以根据处理器的不同打包不同的 so 件到 apk,可以针对不同架构的处理器,进行不同的优化(NDK 编译虽然官方还未正式添加进 去,但是自己稍微折腾一下 gradle 脚本,也可以编译了) 右边的 buildType(含有 debug release),理论上也可以看成一个 flavor 维度 未来要扩展的话(比如可穿戴设备适配,车载适配等), flavor 可以方便的再添加维度,而不 影响已存的工程。

Upload: jween-lau

Post on 11-Apr-2017

164 views

Category:

Mobile


2 download

TRANSCRIPT

Page 1: [DEPRECATED]Gradle flavor

Flavor 逻辑:

Flavor 不分维度只根据机型来判断维度的时候

Flavor Debug(buildType) Release(buildType)

MX3 MX3Debug MX3Release

MX3 MX3Debug MX3Release

M75 M75Debug M75Release

M75 M75Debug M75Release

这样就可以根据机型的不同,在不同的 flavor 目录下,放置不同的 res 资源,java 代码,

AndroidManifest 文件等

Flavor 分 手机型号(Model) 签名平台(Fingerprint) 两个维度的时候

Model

(flavor dimen)

Fingerprint

(flavor dimen)

Debug(buildType) Release(buildType)

MX3 eng MX3EngDebug MX3EngRelease

MX3 prd MX3PrdDebug MX3PrdRelease

M75 eng M75EngDebug M75EngRelease

M75 prd M75PrdDebug M75PrdRelease

这样可以做的事情更多,可以根据编译时用的签名平台不同,来处理不同平台需要的不同的

第三方 access_key, token, meta-data, 等等东西(具体教程以后再补)

在以上两个维度的前提下,加入 ABI 维度

Model

(flavor di…)

Fingerprint

(flavor dimen)

ABI

(flavor dimen)

Debug(buildType) Release(buildType)

MX3 eng arm MX3EngArmDebug MX3EngArmRelease

MX3 eng x86 MX3EngX86Debug MX3EngX86Release

MX3 prd arm MX3PrdArmDebug MX3PrdArmRelease

MX3 prd x86 MX3PrdX86Debug MX3PrdX86Release

M75 eng arm M75EngArmDebug M75EngArmRelease

M75 eng x86 M75EngX86Debug M75EngX86Release

M75 prd arm M75PrdArmDebug M75PrdArmRelease

M75 prd x86 M75PrdX86Debug M75PrdX86Release

加入 ABI 维度之后,对于使用了 NDK 混合开发的,可以根据处理器的不同打包不同的 so 文

件到 apk,可以针对不同架构的处理器,进行不同的优化(NDK 编译虽然官方还未正式添加进

去,但是自己稍微折腾一下 gradle 脚本,也可以编译了)

右边的 buildType(含有 debug 和 release),理论上也可以看成一个 flavor 维度

未来要扩展的话(比如可穿戴设备适配,车载适配等),flavor 可以方便的再添加维度,而不

影响已存的工程。

Page 2: [DEPRECATED]Gradle flavor

Flavor 使用:

--针对 Android Studio Gradle 工程结构

以上是默认的 Android Studio Application 工程目录结构

main 是默认的(你可以认为是 默认的主 flavor 或者主 buildType,不管开发者自定义了多少 flavor,多

少 buildType,最后都是与 main 里面的合并到一起再打包)

main 下面的 aidl,assets,java,jni,res,resources,rs 这些目录就不多说了

现在,我们只举例使用 flavor 处理 res 这个资源目录的多渠道打包, 脚本如下

android {

// …

flavorGroups 'model', 'fingerprint' // 定义 手机型号, 签名平台 两个 flavor 维度

productFlavors {

// 在手机型号(model)维度中,定义 M75 M76 M71 MX3 MX2 等机型

M75{ flavorGroup 'model' }

M76{ flavorGroup 'model' }

M71{ flavorGroup "model" }

MX3 { flavorGroup 'model' }

MX2 { flavorDimension 'model' }

// 在签名平台(fingerprint)维度中, 定义 eng, user, prd, demo 等平台

eng { flavorGroup 'fingerprint' }

user { flavorGroup 'fingerprint' }

prd { flavorGroup 'fingerprint' }

demo { flavorGroup 'fingerprint' }

}

}

Page 3: [DEPRECATED]Gradle flavor

此时目录结构是这样的

MX3 M75 eng prd 等目录需要我们手动添加, 名字就是刚才用脚本定义的 flavor

每一个 flavor 下的目录结构,与 main 是完全一样的

最后: 只需要把通用的资源文件放在

src/main/res 里面

把 M75 需要用到的 xxxhdpi(640dpi)的所有图片放在

src/M75/res/drawable-xxxhdpi 或者 src/M75/res/drawable-nodpi 里面

把 MX3 需要用到的 440hdpi 放在

src/MX3/res/drawable-nodpi 里面 (drawable-<N>dpi 暂时是不支持的)

以此类推,大功告成

Page 4: [DEPRECATED]Gradle flavor

那么问题来了,M75 M76 M71 用的都是 640dpi, 那这三个手机型号,就要拷贝三次吗?

不用,我们可以重定向各个 flavor 需要的资源路径,

如图,创建 densities 目录, 里面放置 3 种分辨率的 drawable 文件夹

然后在 android.sourceSets 中,对各个机型的 flavor 的 res.srcDirs 重定向,或者添加相对应的路

android {

sourceSets {

MX3 {

res.srcDirs = res.srcDirs << 'densities/440dpi'

}

MX2 {

res.srcDirs = res.srcDirs << 'densities/xhdpi'

}

M71 {

res.srcDirs = res.srcDirs << 'densities/xxxhdpi'

}

M75 {

res.srcDirs = res.srcDirs << 'densities/xxxhdpi'

}

M76 {

res.srcDirs = res.srcDirs << 'densities/xxxhdpi'

}

}

}

至此,单独打包适配了所有机型

Page 5: [DEPRECATED]Gradle flavor

--针对 Eclipse 工程结构

Eclipse 工程结构,转成 android studio 的 gradle 工程结构的时候,仅仅是在脚本中对 android

各种资源代码的位置进行的重定向

重定向部分脚本如下(使用 Eclipse 的工具转化过来的会自动生成以下脚本)

android {

sourceSets {

main {

manifest.srcFile 'AndroidManifest.xml'

java.srcDirs = ['src']

resources.srcDirs = ['src']

aidl.srcDirs = ['src']

renderscript.srcDirs = ['src']

res.srcDirs = ['res']

assets.srcDirs = ['assets']

}

instrumentTest.setRoot('tests')

debug.setRoot('build-types/debug')

release.setRoot('build-types/release')

}

只需要多重定向一点点东西

android {

sourceSets {

// …..…

M75.setRoot('flavors/models/M75')

M76.setRoot('flavors/models/M76')

M71.setRoot('flavors/models/M71')

MX2.setRoot('flavors/models/MX2')

MX3.setRoot('flavors/models/MX3')

eng.setRoot('flavors/fingerprints/eng')

user.setRoot('flavors/fingerprints/user')

prd.setRoot('flavors/fingerprints/prd')

demo.setRoot('flavors/fingerprints/demo')

}

}

至此, 适配完毕

Page 6: [DEPRECATED]Gradle flavor

eclipse 工程建议统一使用以下结构

android {

sourceSets {

// …..…

MX3 { res.srcDirs = res.srcDirs << 'densities/440dpi' }

MX2 { res.srcDirs = res.srcDirs << 'densities/xhdpi' }

M71 { res.srcDirs = res.srcDirs << 'densities/xxxhdpi' }

M75 { res.srcDirs = res.srcDirs << 'densities/xxxhdpi' }

M76 { res.srcDirs = res.srcDirs << 'densities/xxxhdpi' }

}

}

所有 buildType 全部放到 build-types 目录下

所有 flavor 全部放到 flavors 目录下

如果有维度, 则放到相应维度下

比如

flavors/models/MX3

flavors/fingerprints/eng

flavors/abi/arm

这样, 出了问题, 也是统一的好找毛病