主要内容:
- Android Studio的介绍
- AS中个Gradle及Groovy介绍
- AS中的依赖管理
- Maven以及Nexus私库管理依赖
- Gradle对变种代码的管理以及多渠道打包
- eclipse工程迁移至AS
- AS配置NDK工程
- AS的优化配置
1. Android Studio的介绍
1.1 简介
Android Studio 是基于 IntelliJ IDEA 的官方 Android 应用开发集成开发环境 (IDE)。 除了 IntelliJ 强大的代码编辑器和开发者工具,Android Studio 提供了更多可提高 Android 应用构建效率的功能
- 基于 Gradle 的灵活构建系统
- 快速且功能丰富的模拟器(包括视图预览)
- 可针对所有 Android 设备进行开发的统一环境
- Instant Run,可将变更推送到正在运行的应用,无需构建新的 APK
- 可帮助您构建常用应用功能和导入示例代码的代码模板和 GitHub 集成
- 丰富的测试工具和框架
- 可捕捉性能、易用性、版本兼容性以及其他问题的 Lint 工具
- C++ 和 NDK 支持
Android Studio 一个在IDEA(IntelliJ IDEA)基础上开发的针对Android平台的专用开发工具,用来代替Eclipse以及其他平台的的IDE,同时又提供了一系列统一且高效的工程构建工具降低了APP开发难度,提高开发效率
1.2 Android Studio 与 ADT的比较
区别 | ADT | Android Studio |
---|---|---|
平台 | 依附于Eclipse的Android开发插件 | Android开发专用的官方统一平台 |
编译系统 | 基于Ant的编译系统 | 基于Gradle的编译系统 |
功能开发 | 针对Java开发的提示 | 更加智能和方便,视觉更加美观 |
视图布局 | UI预览非实时 | 实时UI预览 |
目录结构 | 基于功能逻辑的工程目录区分工作空间 | 以构建(build)、代码逻辑(src)等划分工程目录,只有project和Modules |
调试 | \ | 5.0以上的 instance run |
NDK开发 | NDK问题多 | 更方便的进行NDK开发以及断点调试 |
稳定后的Android Studio 在SDK以及工具插件的下载上有很大提升,不需要进行FQ就可以进行更新,今年专门针对中国开发者的网站也上线,可以方便的获取到Android以及Android Studio的资料(Google 开发者)
2. AS中个Gradle及Groovy介绍
2.1 为什么使用Gradle
在ADT时代,eclipse的Android的构建时基于Ant的,在Android Studio 中使用的新的构建工具Gradle。Ant中是通过xml定义控制流程的,阅读和书写不方便
Ant/Maven -> Gradle
Apk打包流程:
<ignore_js_op>
Gradle使用了Groovy语言来描述依赖和控制流程,同时继承Ant的流程控制和Maven的依赖管理。使用的Groovy语言是一种运行与JVM的脚本语言,和kotlin类似.
任务task中会有action动作action包含了执行的代码">2.2 Gradle 中最重要的是Project对象以及task。每个项目中至少会有一个Project,build.gradle表示一个Project,在Project中会有很多task任务,task中会有action动作,action包含了执行的代码
2.3 Gradle项目的结构
<ignore_js_op>
项目中是Project和Module来组织的,一个Project中包含了一个或多个Module。Project中会有一个build.gradle文件,同时包含了一个setting.gralde文件,而Module中只会包含一个gradle.build文件。
- setting.gradle: 管理多个Module的情况,定义哪些Module需要加入Project编译过程
- build.gradle: 具体控制编译的流程和项目的依赖以及配置。如果是Project中顶层的build.gradle其中的配置则是全局的,Module中的build.gradle会覆盖顶层的配置
build.gradle中的一些配置:
- 顶层build.gradle 中的buildscript:表示配置编译工具的引用路径(版本)
- 顶层build.gradle allproject:在这个闭包中的配置表示所有的Project对象中都会应用到,但会被子模块覆盖
- 模块中的build.gradle
- apply plugin : gradle插件需要配置为那种类型(’com.android.application’或’com.android.library’)
- android :plugin中提供的关于工程运行的Android环境的配置
- buildTypes :编译类型
- productFlavors : 产品风格
- dependencies : 依赖配置
2.4 Task
在Gradle中代表构建过程中的一系列操作,一个Task中包含了多个Action,Action之间有顺序关系。Task执行构建过程中的特定步骤,它们之间相互依赖就会按顺序执行,没有依赖的会先被执行。
定义一个Task:
<ignore_js_op>
Task中附加Action:
<ignore_js_op>
四个基本的 task
Android 继承他们分别进行了自己的实现:
- assemble:对所有的 buildType 生成 apk 包。
- clean:移除所有的编译输出文件,比如apk
- check:执行lint检测编译。
- build:同时执行assemble和check命令
<ignore_js_op>
在AS中的Gradle project视图中可以看到当前Project中的所有Task,这里我们可以全部执行也可以指定Task执行
由于Gradle使用的是Groovy语言来描述编译过程的,而Groovy支持Java的脚本语言,所有以上的配置都可以找到对应的Java描述。同时Groovy的闭包和简单的定义方式使得Groovy可以作为Java的一种替代,在能够使用Java的地方就可以使用Groovy
( 科关于Groovy的参考)
2.5 Groovy
>
是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的> > 脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
闭包的概念:
由 { } 封闭的结构,可以理解为内部类,同时闭包支持lambda的表达形式,所以可以将代码做到很简化阅读清晰,同时更像一个配置
举例:
// 之前写法
def double(def num) {
num * num
}
// 使用lambda表达式
def double = { num ->
2*num
}
// 简化(只有一个参数的情况),it会默认替代这个参数,同时最后一行表示当前的返回值
{it*it}
在Gradle文件中的体现:
apply plugin: 'com.android.application'
dependencies {
compile files('libs/commons-io-2.4.jar')
}
完整表达:
// 提交一个map集合,里面只有一个对象
project.apply([plugin:'com.android.application'])
project.dependencies({
Dependency function">add('compile files', 'libs/commons-io-2.4.jar');
})
64K问题
64K问题(65536问题)
Delvik虚拟机指令集使用了16位寄存器来存储方法数量,在较大工程中方法数量会超过65536,导致无法保存。
但是在Android 5.0系统以上使用了Android Run Time新的虚拟机,所以在5.0以上系统不会出现64k问题
目前的解决方案
- 开启ProGuard中的清除无用方法的配置
- 使用 Multidex Support Library 进行分包处理(AndroidSutdio自身使用这样的机制)
3. AS中的依赖管理
在Android工程中或者其他工程中,工程之间相互引用是很常见的。Java工程里在Ant时代是通过jar包的方式进行引用的,如果被引用的工程发生改变就必须重新给出一份jar到其他引用的工程,为此后面出现的Maven仓库通过远程引用的方式不在本地使用jar包,而是通过arr方式将引用存放于网络,解决了jar不同步的问题。但是Maven的优势在于管理依赖,而Ant的优势在于控制构建过程,Gradle的出现同时利用了两者的优势,基于Groovy脚本语言同时又可以支持Maven仓库的的引用。
4. Maven以及Nexus私库管理依赖
在Gradle中编译方式有三种类型
1. Compile 编译到apk 中
2. provider 只引用不编译到apk中
3. apk 以apk方式引用
<ignore_js_op>
又有工程引用、arr引用、jar引用、Maven仓库、本地.so库引用等引用方式
// 引用.so库,默认是在src/main/jniLibs下
android{
sourceSets.main{
jniLbs.srcDir('/libs')
}
}
dependencies{
compile library //引用项目时,项目要是 以'com.android.library'配置的模块
compile file
compile '组织group:库名称目:artifact:版本version' 通过Maven仓库引用
compile(name: 'FileSelector-release', ext: 'aar') // 单个项目文件
}
// 多个arr项目时
repositories{
flatDir{
dirs'arrs' // 在项目中建立arrs文件夹存放arrs项目
}
}
如果是引用私库则需要配置仓库位置
repositories {
jcenter()
maven {
// 自己的Maven私库
url "http://192.168.8.110:8081/repository/maven-public/"
}
}
5. Gradle对变种代码的管理以及多渠道打包
App的开发避免不了需要将App打包成Apk文件发布到应用市场,再单一的应用分发的市场中,如IOS只有一个应用分发市场的情况下只用一个发布一个Apk包就可以了,但是在Android平台上各类分发市场以及定义的渠道都会需要有一个Apk包,甚至风格和内容会有大的区别。为了解决这个问题Gradle中内置了BuildType以及productFlavor,甚至自己通过Groovy来批量定义配置
5.1 Build Variant 变种
<ignore_js_op>
BuildType
BuildType是Gradle中表示构建类型的类,其中定义了构建过程中的各种配置,例如 minifyEnabled(开启混淆),proguardFiles(混淆配置),signingConfig(签名配置)productFlavor
productFlavor表示产品的风格,更加具体到了构建的配置了,通过和BuildType进行组合形成了不同的Apk包resValue 会定义到generated.xml以字符串资源的形式保存
// 自动生成string资源
resValue 'string', 'style', 'free'
会自动生成generated资源文件
<ignore_js_op>
- buildConfigField会定义到BuildConfig的java类文件中
//这里添加的类型是在Java文件中的,需要表示成java
buildConfigField 'String','build_style',"\"free\""
自动生成的buildConfig.java
<ignore_js_op>
- 通过manifestPlaceholders 替换Manifest中Meta-Data标志位方式
manifestPlaceholders = ['meta_data_type':"free"]
<ignore_js_op>
5.2 批量打渠道包
App在发布前一般要打特别多的渠道,同时需要按照约定的规则保存到指定位置给后台批量发布到对应应用市场,所以在这种情况下使用自动化工具进行批量生产Apk是必不可少的。
<ignore_js_op>
上面说的BuildType和productFlavor可实现多风格的Apk,但是如果单独进行配置是无法达到成百的渠道的需求的。所以最好的解决办法是利用Groovy控制不同风格的构建。
实现的思路:
过去在使用Ant情况下将渠道id配置在Manifest文件中的meta-data标签下,通过判断渠道id来做区分,因为Manifest文件不会在构建Apk时被编译为.class文件。现在的思路类似,不同的是使用Gradle可以将这样的配置存放到字符资源文件,甚至Gradle自动生成的BuildConfig配置文件中,使得可以向Java一样读取这个属性。
源码的apk">5.3 打不同源码的Apk
在Android工程开发中比较容易出现这样的情况,同样一个App但是在源码上需要区分不同的版本,例如一个是免费版,一个是付费版,框架相同,但是针对不同的版本同一界面有不同的功能,甚至连App的都需要可以同时安装。这种情况在过去需要做复杂的判断,甚至需要重新复制一个工程专门针对版本来修改代码,造成维护困难。在Gradle中使用buildFlavor将源码按照风格配置编译的源码就可以实现,
<ignore_js_op>
5.3.1 配置过程
- 在Build Flavor中配置 free 和 pay两种风格(BuildFlavor中默认有main的风格)
- 在src文件夹下雨main同级建立相同目录结构的包,放入有区别的类文件
多风格apk打包中的不同风格源码的类不能重复,而资源中可以重复到元素一级
使用productFlavor,源码在不同风格中与mian中类名不冲突,但不同风格中的类可相同,且可替换(多版本不同代码)
6. eclipse工程迁移至AS
过去通过ADT——在Eclipse上的Android开发工具插件创建的工程是按照Java工程的方式建立的目录结构,如果需要迁移到AS上时有两种方式,1.使用AS直接导入,结构目录转换为AS结构;2.使用Eclipse到处为Gradle工程,再使用AS导入进一步配置。一般情况开发需要在转换以后同时兼容到Eclipse,所以使用第二种方式进行迁移。
在AS中工程默认是以Gradle工程方式识别源码文件和资源文件,如果导入Eclipse工程,这需要重新配置源码文件和资源文件的文件位置。
<ignore_js_op>
在sourcesets中添加对应BuildFlavor类型的源码和资源等文件集合的位置
7. AS配置NDK工程
Android上的NKD工程再AS中的支持比Eclipse要完整,Gradle有简便的配置方式就可以集成NDK工程
注意:第一次导入工程的时候AS会以默认的gradle版本来首次构建工程,但是很多情况下是旧版本构建,所以通过指定AS的Gradle版本为最新版再次编译则会比较顺利。
- 指定NDK(NDK版本最好用最用最新的)
- 配置NDK插件
使用AS开发NDK的一个优势是可以直接通过AS进行C或C++代码调试(需要LLDB插件)
<ignore_js_op>
相关方法:
ndk {
// 输出模块的名称
moduleName "libmbengine"
abiFilters "armeabi-v7a"
}
jniLibs.srcDir "/libs"
externalNativeBuild {
ndkBuild {
path file("/Android.mk")
}
}
8. AS的优化配置
AS上的Gradle到目前为止已经做了很大的优化,但是在编译工程的时候还是会比较缓慢,但进行适当的配置可以加快构建的过程,充分利用机器的性能。