从ant到gradle

来源:互联网 发布:smart 改装轮毂数据 编辑:程序博客网 时间:2024/04/25 01:20

从ant到gradle


本人前段时间完成了打包工具从ant到gradle的过度,本文主要阐述在迁移过程中项目遇到的一些坑以及解决方案,并不会详细阐述整个过程(一般除非使用了插件话等,否则参考下边的关于gradle的文章足以)。

关于gradle

关于gradle本文不做讨论 可以参考:http://blog.csdn.net/innost/article/details/48228651

项目背景

我们的项目使用了插件机制。主要分为壳和插件 lib等都是打包到壳中,插件只要求编译的时候可以成功,最后打dex的时候不需要包含进去。

为什么切换到gradle

之前的ant也是作者写的,先说说当初为什么选择ant,在一开始ant和gradle抉择的时候,由于存在上述项目背景,所以面临一个问题:部分lib在某些场景下我们要求只compile而不会参与dx。当时觉得gradle不能明确的在打包过程中修改这些所以选择了ant(provided关键字来解决,限于当时作者水平有限和对gradle的陌生,选择了ant)然后再ant的使用过程中发现了以下缺陷:
1. 由于插件机制eclipse无法调试(idea 和 AS可以)
2. 切换到idea 和 as后 每次有改动需要手动调用ant的编译命令
3. 一套ant的编译配置 一套as配置 导致在ide查看代码的时候有一些error,实际用ant编译没有
4. 由于不是增量编译 每一次改动都要重新编译
5. 由于lib工程被多个插件引用 会出现重复编译的问题(导致编译时间长)

由于存在以上问题,导致开发效率下降 加上gradle是官方支持,所以我们最后准备切换到gradle。

问题汇总

1.解决部分lib在某些场景下我们要求只compile而不会参与dx

解决方案:使用provided关键字

2.项目分为2种 一种是lib 一种是application 在application中不能使用provided修饰module

解决方案:gradle在1.0.0之后就不允许在application中用provided修饰module,当然你可以通过修改gradle的版本为1.0.0来解决(强烈不推荐)。我的解决方法是,新建一个空的module起名叫libmanager,这个module下使用provided 修饰所有其它的module,然后再application中用compile来修饰libmanager, 而module在编译成功后copy到一个指定的目录下,然后在application中用compile/provided(根据是否需要打包到dex决定)修饰这个目录

3.选择合适的时机将module的jar包copy到指定目录

解决方案:我选在build.gradle的头部添加一个公共的方法 ,在util.gradle中 我通过tasks.whenTaskAdd {}来找到对应合适的task在task之后添加copy操作(我选择了bundleRelease作为合适的时机,可以查看task的执行顺序来选定你的task)

4.通过上述添加一个空的libmanager来管理modules 然后依赖指定的目录的方式在编译的时候提示找不到module中的类

解决方案:经过跟踪发现在指定目录下生成了jar包,那么又为什么找不到这个jar包中的类呢?我推测gradle在编译的时候先config 将需要的jar包识别出来(是具体的文件 而非目录),这个时候目录下是没有module的jar包的,然后接着处理依赖关系,编译了module并copy到指定目录,但是项目之前识别出的jar包并不包含新生成的。 然后我在目录下建立了一个空的jar包,然后就通过了。
后续考虑在编译开始之前先扫描jar包是否存在,如果不存在则生成一个空的jar包文件即可解决这个问题。

5.
Error:Execution failed for task ':host_main:processDebugManifest'.   Manifest merger failed : Attribute   application@allowBackup value=(false) from AndroidManifest.xml:127:7-34 is also   present at [Codes:libmanager:unspecified] AndroidManifest.xml:12:9-35 value=  (true). Suggestion: add 'tools:replace="android:allowBackup"' to    element at AndroidManifest.xml:126:3-577:17 to override.

解决方案:

xmlns:tools="http://schemas.android.com/tools"
tools:replace="name,icon,label,theme,allowBackup"

6. libpng warning: iCCP: Not recognizing known sRGB profile that has been edited

解决方案:方法1:重新要一个图片
方法2:
http://blog.sinzy.net/ifyr/entry/23230
下载ImageMagic执行for /f "tokens=" %i in ('dir/s/b .png') do convert "%i" -strip "%i"

7.AAPT err(Facade for 1562757590): libpng error: Read Error

解决方案:有图片格式不对,有的图片是png格式但是后缀名是.jpg 写脚本扫描(python3.0)

def get_all_file(picdir, piclist):    for file_name in os.listdir(picdir):        new_path = os.path.join(picdir, file_name)        if os.path.isdir(new_path):            get_all_file(new_path, piclist)        else:             piclist.append(new_path)    return piclistif __name__ == '__main__':    allFile = []    get_all_file(rootPath, allFile)    for file in allFile:        if imghdr.what(file) == "png" and not file.endswith(".png"):            print(file)

8.Error: In Gradle projects, always use http://schemas.android.com/apk/res-auto for custom attributes [ResAuto] xmlns:app=”http://schemas.android.com/apk/res/com.fxiaoke.plugin.crm”

解决方案:只识别aotu 修改为xmlns:app="http://schemas.android.com/apk/res-auto

目前gradle遗留问题

1.cpu占用率高,低功耗i5跑起来吃力(自定义插件修改打包过程认为减少不必要的部分, 升级cpu)
2.tasks.whenTaskAdd {} 感觉不太优雅 后续看是否可以替换成android.applicationVariants.all
3.进一步优化打包流程 缩短打包时间

1 0