[Gradle] Gradle 构建 android 应用常见问题解决指南
转载地址:http://www.cnblogs.com/youxilua/p/3348162.html
1: 使用最新的gradle android插件
以前我们写的时候会这么写
dependencies {
    classpath 'com.android.tools.build:gradle:0.5.0'
}
不过,由于android gradle 插件的开发还是很活跃的,而且目前而言,可能还存在一些我们不知道的坑,但是,别人踩过,后边,官方修复,为了不踩坑,我建议android gradle 始终保持最新版本,写法如下:
dependencies {
    classpath 'com.android.tools.build:gradle:0.5+'
}
2: 由于代码编码与编译环境编码不一致,导致构建失败
有时候,我们的代码使用utf-8 保存的,但是,进行gradle build 的环境是gbk这类的,这时候会包如下错误:
    15: 错误: 编码GBK的不可映射字符
         * 鍑虹幇涓枃璇锋敞鎰?
这个时候我们就需要手动的设置编译时编码类型.
tasks.withType(Compile) {
    options.encoding = "UTF-8"
}
apply plugin: 'android'
android {}
3: android support v4 重复引用问题
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/Activ
ityCompatHoneycomb;
at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:12
3)
at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
at com.android.dx.command.dexer.Main.processClass(Main.java:490)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
at com.android.dx.command.dexer.Main.access$400(Main.java:67)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpen
er.java:245)
出现这个问题的原因一般是由于我们这样的写法导致:
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}
某个相同的jar包,被复制到了build目录导致重复编译使编译时失败,
由于这个问题android support v4 出现的比较多,所以同类型的都归类为v4 问题吧.
要避免这个问题,我们尽量少使用依赖某个目录下所有包,毕竟android项目不想java web项目动不动就有好几十jar 包依赖.要修复这个v4,原理很简单,可以使用依赖maven的写法.
dependencies {
    compile 'com.android.support:support-v4:13.0.0'
}
4: 打包后缺少*.so文件
用指定依赖包的方式打包,我们会发现,最终打包后的jar没有了*.so文件,这个时候,我们需要自定义一个tasks,写如下:
task copyNativeLibs(type: Copy) {
    from(new File('libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}
这样,在编译时,就会自动把libs目录下的**/*.so 文件复制到apk里面了.
5: 构建多渠道包
在最新版本的gradle 0.5.7 中,构建多渠道包比之前简单多了,在以前,你需要这么写:
android {
    buildTypes {
         hiapk {
             packageNameSuffix ".hiapk"
         }
         playstore {
             packageNameSuffix ".playstore"
        }
     }
    sourceSets {
        hiapk {
            manifest.srcFile 'hiapk/AndroidManifest.xml'
        }
        playstore {
            manifest.srcFile 'hiapk/AndroidManifest.xml'
        }
    }
}
要替换某个类型的文件需要自己手动写,渠道多了,这代码量是可想而知的多,在0.5.7中,进行了一个约定规则,构建,渠道包你只需
android {
    buildTypes {
         hiapk {
             packageNameSuffix ".hiapk"
         }
         playstore {
             packageNameSuffix ".playstore"
        }
     }
    sourceSets {
         hiapk.setRoot('build-types/hiapk')
         playstore.setRoot('build-types/playstore')
    }
}
在项目的根目录下创建一个build-types的目录,在创建对应渠道的子目录,然后把一些,诸如要替换AndroidManifest.xml,里面友盟渠道号什么的,直接把xml复制进去就行,gradle在构建项目的时候,会自动的优先使用build-types下目录文件的目录,诸如,根据不同渠道,不同国家换个程序图标什么的,都只要放到目录下即可.
[Gradle] Gradle 构建 android 应用常见问题解决指南的更多相关文章
- Gradle 构建 android 应用常见问题解决指南
		前言 android gradle 插件已经发展到0.5.7,同时gradle 本身也到了1.8,相比两个月前,android gradle 更快,更完善,也更好用了,为了让各位androider 早 ... 
- Android Studio常见问题解决
		1.Error:Execution failed for task ':XXXX:processDebugManifest'. > Manifest merger failed with mul ... 
- eclipse开发android程序常见问题解决办法
		1:R.java不自动更新或不见,gen文件夹里没生成文件. 解决办法: 这个一般是xml文件中有错误,如有英文大写,属性值错误等,解决了就会好. 如果错都排除了还没有生成或更新,那么可以点击proj ... 
- 用Gradle 构建android程序
		前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ... 
- 使用Gradle构建Android应用内测版本
		在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本.本文通过使用gradle来构 ... 
- Gradle的构建过程都不会?带你全面了解Android如何自定义Gradle 插件
		目前 Android 工程的默认构建工具为 Gradle,我们在构建 APK 的时候往往会执行 ./gradlew assembleDebug 这样的命令.. 那么这个命令到底代表着什么含义呢?命令的 ... 
- Android开发:《Gradle Recipes for Android》阅读笔记1.3
		想命令行执行gradle的构建,可以通过提供的gradle wrapper或者安装gradle. 构建android项目不需要安装gradle,因为android studio已经包含gradle.& ... 
- gradle构建android项目详解
		1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ... 
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
		[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ... 
随机推荐
- Lunix含Ubuntu使用总结
			错误 鼠标闪烁解决 系统设置->显示—>未知显示器->关闭->应用->选择当前配置 提示sudo: unable to resolve host ,亦即无法解析主机. 原 ... 
- Solr本地服务器搭建及查询
			0.安装solr之前,确保已安装好java8, java -version 查看是否安装 1.新建本地目录solr1 并 解压两个压缩包文件 .tar.gz .tgz tomcat7 2.将CATA ... 
- zookeeper的简单使用
			前言 最近项目中要使用基于zookeeper的集中配置管理系统,而对于zookeeper仅在当初使用阿里开源分布式服务调用框架dubbo时简单的了解一下.本 文的主要目的,调用zkclient (ma ... 
- loadrunner可用许可证
			global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGIweb-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGBglobal-10 ... 
- 【C#】字段总结
			前沿: 字段(field)是一种数据成员,其中容纳了一个值类型的实例或者一个引用类型的引用. 正文: CLR支持类型(静态)字段和实例(非静态)字段.对于类型字段,用于容纳字段数据的动态内存是在类型对 ... 
- centos7-硬盘坏道检测
			#检测坏道命令,结果输出到 /home/badblocks.log badblock -s -v -o /home/badblocks.log /dev/sdb1 [注]:硬盘损坏程度不同,block ... 
- dp 加搜索 百练1088 滑雪
			描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长的 ... 
- 我的sublime text3 配置文件设置
			{ "ignored_packages": [ "Vintage" ], //vim模式 "line_padding_bottom": 2, ... 
- java 继承 String类
			韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha String 类 是 final修饰 , 是不能 继承的. 
- codevs 2173 忠诚
			2173 忠诚 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 老管家是一个聪明能干的人.他为财主工作了整整10年,财 ... 
