AndroidStudio用法总结
环境搭建:有as安装版本和绿色版本;下载:http://androiddevtools.cn ps:如果你从eclipse转as开发工具上,建议用as安装版本。因为考虑到 as时刻升级要求默认升级sdk,避免相互干扰,导致ADT插件匹配不上;gradle配置安装后,设置相应的path现教程为as1.2版本安装版本:
配置环境:
安装时可能碰到的情况:第一次安装后启动后可以会出现一直在加载的界面;
这是在检查你的 Android SDK 。有人会在这里卡上很长时间,很大的原因就是:网络连接有问题。可以通过配置 hosts 的方式来解决。如果检查需要更新,则会让你安装,从而会有后面 讲解3 - 讲解6 。如果想跳过这一步,可以进行如下操作:在Android Studio安装目录下的 bin 目录下,找到 idea.properties 文件,在文件最后追加 disable.android.first.run=true 。
这样设置后,可以自己手动配置sdk和jdk的路径位置;
Android Studio创建项目
·
修改sdk的目录配置到as安装版本设置的sdk位置路径:(防止跟eclipse的SDK路径冲突)
设置项目的编码格式:
像在eclipse一样如果你选择了用到Actionbar,默认的它会给你应用一个v7包,方法一:自己手动导入v7包放入到项目的libs中;
方法二:让as编译是,自动去找到;
切换到project中配置,
编译项目:用的配置gradle;(配置自己的GRADLE_HOME,防止编译时下下载Gradle,编译速度慢,没有生成一个标准,不方便后面管理配)
删除项目:1:先移除model;
从as的记录中删除。选中项目,直接按住delete键
Android Studio导入项目
1:导入eclipse项目;(Android Studio默认使用 Gradle 构建项目, Eclipse 默认使用Ant构建项目。建议Android Studio导入项目时,使用 Gradle 构建项目。)方式一:直接导入 Eclipse 项目
当你看到这个界面,就表示导入成功了。项目使用 Ant 构建,并不是Android Studio 默认的 Gradle 。
经编译发现问题,lib_v4包重复;去掉一个重新编译;
这样的导入项目的方式,就会生成的apk,在这样的目录中;
回到之前项目目录中,发现多了。此时这个项目同时支持Eclipse和As开发,都是用Ant编译脚本;
方式 二:使用 Gradle 编译项目本方法有一个缺点就是,一次只能导入一个 Eclipse 项目。对于那些只使用到了官方系列的支持包的 Eclipse 项目来说,会方面很多,而且同时兼容 Eclipse 文件目录结构。
Android Studio识别出你的项目是一个 Eclipse Android 项目,它将重新使用 Gradle 构建项目。Android Studio会完整复制项目文件到一个新的目录中,你需要设置这个新目录的地址。
Replace jars with dependencies,when possible :将 Ant 的 jar 依赖关系使用 dependencies 重构。Replace library sources with dependencies,when possible :将 Ant 的 library 项目的依赖关系使用 dependencies 重构。Create Gradle-style(cameCase) module names :使用 Gradle 的样式构建Android Studio的 Module名称。
方式 三:直接导入 Generate Gradle build files 项目
切入到项目中查看生成多的文件:我们可以发现:在工作空间目录下,多出了 gradle 文件夹和 build.gradle 、 build.gradle 、 gradlew 、 gradlew.bat 、 settings.gradle 文件;在 e-demo 目录下多出了 build.gradle 文件; 在 appcompat_v7 目录下多出了 build.gradle 文件。这些文件和文件夹都和 Gradle 有关系,用于构建项目。这些文件以及文件夹的作用,我们以后再说。
由于 Eclipse 的 ADT 插件已经很久没有更新了,自动生成的 Gradle 编译设置已经跟不上Android Studio的更新速度,所以我们需要手动修改一些内容。(一定要记住这里的配置)
1:打开工作空间目录下的 gradle --> wrapper --> gradle-wrapper.properties 。修改一下内容: distributionUrl=http\://services.gradle.org/distributions/gradle-a.b.c-all.zip --> distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip2:打开工作空间目录下的 build.gradle 文件。修改以下内容:classpath ‘com.android.tools.build:gradle:0.x.+‘ --> classpath ‘com.android.tools.build:gradle:1.1.0‘
之所以这么设置,是因为: Eclipse 导出的 Gradle 设置已经不是Android Studio 1.2 所支持的 Gradle 已经 Gradle 插件版本,需要手动更为支持的版本。否则轻则必须不能离线导入项目,重则项目导入失败。
导入到as中:此时会弹出一个框,让你选择文件夹,这个时候需要注意的就是,你需要选择原来的 Eclipse 的工作空间目录,而不是 TestAndBuild 目录。
对应SDK编译的配置设置;
可以在这里查看刚才配置的信息;
配置设置gradle加载本地的(推荐设置)
此处有一些比较重要的设置需要讲解一下。Gradle project :此处通常显示的路径并不是你的 Eclipse 的工作空间的目录,而是 Eclipse 的工作空间的目录中的 gradle 路径。你需要手动删除后面的 gradle ,否则项目导入,你是看不到你的代码的,只能看到 gradle 目录下的内容。Create directories for empty content roots automatically :不是很明白它的作用,一般默认即可。Use default gradle wrapper(recommended) 和 Use local gradle disribution :这两个是让你设置使用的 Gradle 。默认会勾选 Use default gradle wrapper(recommended) ,我们需要手动勾选 Use local gradle disribution 。Gradle home :勾选 Use local gradle disribution 后此项编程可编辑状态,默认的此处的地址为Android Studio安装目录中的 Gradle 路径地址。此处可能会有一些错误的警告,提示内容为: Gradle location is incorrect 。而你的这个目录下,确实是有 Gradle 的。产生这个问题的原因,很可能是因为 Gradle home 选项中,路径中的斜杠为 / 而不是 ** 。你需要点击左右的文件选择按钮,重新选择到Android Studio安装目录中的 **Gradle ,问题即可解决。Offline work :设置 Gradle 使用离线的方式导入项目。你可以勾选也可以不勾选。如果你有进行【设置的两步骤下】的操作,你则可以勾选,以离线的方式进行编译。测试这个已经配置成gradle编译的项目,所在的项目即可用于as开发也可以用于eclipse开发;2:导入Android Studio项目;
导入已经是AdnroidStudio项目;如github上的项目;(如本地有代码的话,建议还是配置下gradle版本和插件,设置成自己电脑本地的,那样方便以后编译快)如:
3:其他导入方式;导入一个项目除了在Android Studio起始页进行导入之外,你也可以在Android Studio主页中进行导入。File --> Import Project 或者 File --> Import Module 。
Android Studio 常用功能介绍
Android Studio 的基本用法
这个界面,显示了我们使用 Android Studio时经常接触到的功能面板。1:Project 面板。用于浏览项目文件。 Project 面板会显示当前的所有的 module 。 android application module 会显示一个手机图标(下图中的 app );android library module 会显示一个书架图标(下图中的 android-lib );java library module 会显示一个咖啡图标(下图中的 java-lib )。2:Build Variants 面板。用于设置当前项目的 Build Variants ( Gradle 知识)。所有的 Module 默认都会有 release 和 debug 两种选项。当你添加了 BuildTypes 和 productFlavors ,这里将出现更多的选项( Gradle 知识)。默认情况下, release 和 debug 的区别并不是很明显;针对于代码来说,是没有区别的。3:Android 面板。功能类似于 Eclipse 中的 Logcat ,但是比其多了一些常用功能,例如:截图,查看系统信息等。4:编辑区。用于编辑文件。5:Gradle 面板。Gradle 任务列表,双击可执行 Gradle 任务。常用任务: build 、 clean 、 assemble 、 assembleRelease 、 assembleDebug 、 lint 。常用按钮
编译右侧 module 列表中显示的 module 。
- 当前 project 的 module 列表。
- 运行左侧 module 列表中显示的 module 。
- debug 左侧 module 列表中显示的 module 。
- attach debugger to Android process 。
- 设置。
- 项目属性。
- 使用 Gradle 编译 project 。
- 虚拟机。
- SDK Manager 。
- DDMS 。
.gradle 文件简单介绍(官方文档: http://tools.android.com/tech-docs/new-build-system )
一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识;
{@projectName}\build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
/**
* Groovy 的基本语法
*/
/**
* .gradle 文件简单介绍
一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个 settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识,请看这里。{@projectName}\build.gradle
默认的 project 目录下的 build.gradle 文件内容如上。
buildscript :用于设置驱动构建过程的代码。
jcenter():声明使用 maven 仓库。在老版本中,此处为 mavenCentral()。
mavenCentral() :表示依赖从 Central Maven 2 仓库中获取。
jcenter() :表示依赖从 Bintary’s JCenter Maven 仓库中获取。
3. **mavenLocal()** :表示依赖从本地的Maven仓库中获取。
dependencies :声明了使用 Android Studio gradle 插件版本。一般升级AS或者导入从Eclipse中生成的项目时需要修改下面gradle版本。具体的版本对应关系,请点击。
allprojects:设置每一个 module 的构建过程。在此例中,设置了每一个 module 使用 maven 仓库依赖。
*/
/**
* maven远程库列表
*远程库 地址 镜像
central http://repo1.maven.org/maven2/ http://uk.maven.org/maven2
apache https://repository.apache.org/content/groups/public/
appfuse http://oss.sonatype.org/content/repositories/appfuse-snapshots/
Codehaus Snapshots http://nexus.codehaus.org/snapshots/
Dynamic Jasper http://archiva.fdvs.com.ar/repository/public1/
exoplatform http://repository.exoplatform.org/content/groups/public/
java.net https://maven.java.net/content/groups/public/
JBoss releases https://repository.jboss.org/nexus/content/repositories/releases/
jenkins ci http://maven.jenkins-ci.org/content/repositories/releases/
netbeans http://bits.netbeans.org/maven2/
SpringSource http://repo.springsource.org/release/
*/
/**
* 在深圳,默认的maven源可能无法访问,可以通过以下的方式设置其他的maven源。当然,你也可以设置依赖本地库。
maven {url "http://xx.xxx.xxx/xxx"}
开源中国的源地址为:
http://maven.oschina.net/content/groups/public/
开源中国的thirdparty源地址为:
http://maven.oschina.net/content/repositories/thirdparty/
一个项目可以有好几个库。 Gradle 会根据依赖定义的顺序在各个库里寻找它们。在第一个库里找到就不会再在第二个库里进行寻找。
*/
buildscript {
repositories {
jcenter()
}
// 本例运行环境为 1.0 版本的 Android Studio、2.2.1 版本的 Gradle 、1.0.0 版本的 Gradle Plugin 。
/**
* 本系列内容包含以下部分:
Gradle Hello World
讲解一个 Gradle 项目中,基础文件以及文件内容。
Gradle Eclipse Compatible
讲解对 Eclipse 项目的兼容。讲解 Gradle Plugin 中 sourceSets 元素。
Gradle Library Projects
讲解 Gradle 依赖。包含 .jar 依赖, Library project 依赖, Maven 依赖。
Gradle Build Configs
讲解 APK 打包时的签名设置。
Gradle Build Variants
讲解 Gradle Plugin 中 buildTypes 、 productFlavors 元素。
*/
// dependencies :声明了使用 Android Studio gradle 插件版本 1.1后加入了Junit功能;
dependencies {
classpath ‘com.android.tools.build:gradle:1.0.0‘
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
/**
* 常见使用方法
包依赖(aar)
使用aar时可以分为两种情况
① aar位于本地目录
首先在 android 的参数闭包中添加调用方法 repositories
repositories {
flatDir {
dirs ‘libs‘
}
}
然后在 dependencies 的参数闭包中添加
compile name: ‘volley‘, ext: ‘aar‘
② aar位于远程仓库
这里以maven为例,当然也可以使用其他类型的仓库,例如 Ivy。
只需要在jar包引用方式后面添加一个@aar就可以了
compile ‘com.alibaba:fastjson:latest.integration@aar‘
包依赖(jar)
compile group: ‘com.alibaba‘, module: ‘fastjson‘, version: ‘latest.integration‘
可以简写成
compile ‘com.alibaba:fastjson:latest.integration‘
latest.integration可以替换成具体的版本号,这里是获取服务器上的最新版本。
去掉重复依赖
compile ‘com.alibaba.fastjson.latest.integration‘ {
exclude module: ‘annotations‘, group: ‘com.google.android‘
}
*/
/**
* 下面以9GAG为例来讲解下命令行Gradle编译的过程。
1、切换到9GAG项目的根目录,执行 ./gradlew -v 来查看下项目所用的Gradle版本
如果你是第一次执行会去下载Gradle,这个过程如果不FQ非常慢,建议FQ
紧接着下载成功会看到如下信息:
------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------
Build time: 2014-11-24 09:45:35 UTC
Build number: none
Revision: 6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a
Groovy: 2.3.6
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.7.0_60 (Oracle Corporation 24.60-b09)
OS: Mac OS X 10.9.5 x86_64
2、接着执行 ./gradlew clean
执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:
:app:clean UP-TO-DATE
:extras:ShimmerAndroid:clean UP-TO-DATE
BUILD SUCCESSFUL
3、最后执行 ./gradlew build
这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功了
BUILD SUCCESSFUL
Total time: 31.456 secs
紧接着在 9GAG/app/build/outputs/apk 目录下会看到类似于app-debug-unaligned.apk, app-release-unsigned.apk等,看名字应该能理解意思,unaligned代表没有进行zip优化的,unsigned代表没有签名的。然后就可以直接安装apk查看运行效果了。
命令行执行Gradle脚本
在Android工程根目录下会自动生成一个shell脚本 - gradlew,执行之前记得加上x属性 - chomod +x gradlew
gradle脚本中包含了很多 【task】,可以通过task名来指定需要执行的task。
./gradlew build
./gradlew assemble
./gradlew assembleInnderDebug
理解了gradle wrapper的概念,下面一些常用命令也就容易理解了。
./gradlew -v 版本号
./gradlew clean 清除9GAG/app目录下的build文件夹
./gradlew build 检查依赖并编译打包
*/
/**
* 总结
不得不说,Gradle实在太好用了!虽然 Gradle 可以与 Ant 或 maven 配合使用,但是其简洁和功能性远远超过其他两个。
我现在开发的项目普遍使用的是 maven,不知道什么原因,
使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决办法就是把依赖包下载的本地。
*/
{@projectName}\settings.gradle
{@moduleName}\build.gradle
/**
* {@moduleName}\build.gradle
* 默认的 module 目录下的 build.gradle 文件内容如上。
apply plugin: ‘com.android.application‘:
表示使用 com.android.application 插件。也就是表示,这是一个 android application module 。 com.android.library 表示,这是一个 android library module 。
android:
配置所有android构建过程需要的参数。
compileSdkVersion:
用于编译的 SDK 版本。
buildToolsVersion:
用于 Gradle 编译项目的工具版本。
defaultConfig:
Android 项目默认设置。
applicationId:应用程序包名。
minSdkVersion:最低支持 Android 版本。
targetSdkVersion:目标版本。实际上应为测试环境下测试机的 Android 版本。
versionCode:版本号。
5. **versionName**:版本名称。
buildTypes:
编译类型。默认有两个: release 和 debug 。我们可以在此处添加自己的 buildTypes ,可在 Build Variants 面板看到(见 讲解1 )。
minifyEnabled:
是否使用混淆。在老版本中为 runProguard ,新版本之所换名称,是因为新版本支持去掉没使用到的资源文件,而 runProguard 这个名称已不合适了。
2. **proguardFiles**:
使用的混淆文件,可以使用多个混淆文件。此例中,使用了 **SDK** 中的 **proguard-android.txt** 文件以及当前 **module** 目录下的 **proguard-rules.pro** 文件。
dependencies:
用于配制引用的依赖。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]):
引用当前 module 目录下的 libs 文件夹中的所有 .jar 文件。
2. **compile ‘com.android.support:appcompat-v7:21.0.3‘**:
引用 **21.0.3**版本的 **appcompat-v7** (也就是常用的 **v7** library 项目)。
ps:在 **Eclipse** 中,使用 **android support** ,需要在 SDK 中下载 **Android Support Library** 。在 Android Studio中,使用 **android support** ,需要在 SDK 中下载 **Android Support Repository** ,且项目中使用的版本不能大于 SDK 中的版本。
*/
apply plugin: ‘com.android.application‘
android {
compileSdkVersion 21
// buildToolsVersion "21.1.2"
buildToolsVersion "22.0.1"
/*加入.so:*/
// (1)老版本,好像是指0.5以前的,具体不太记得了,方法如下:
// (注意:代码中的‘:MyProject‘一定要换成你的项目名字哦)
// task copyNativeLibs(type: Copy) {
// from(new File(project(‘:Direct-Load-apk‘).buildDir, ‘native-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.PackageApplicationTask) { pkgTask ->
// pkgTask.jniDir new File(buildDir, ‘native-libs‘)
// }
// (2)新版本,具体版本号忘记了,反正如果你下载的是最新的那么自带就是最新的编译器。
// 移除lint检查的error
// lintOptions {
// abortOnError false
// }
/**
* 使用 Java7
*/
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_7
// targetCompatibility JavaVersion.VERSION_1_7
// }
/**
* 这个配置应用用在从Eclipse导入的项目
*/
// sourceSets {
// main {
// jniLibs.srcDirs = [‘libs‘]
// manifest.srcFile ‘AndroidManifest.xml‘
// java.srcDirs = [‘src‘]
// resources.srcDirs = [‘src‘]
// aidl.srcDirs = [‘src‘]
// renderscript.srcDirs = [‘src‘]
// res.srcDirs = [‘res‘]
// assets.srcDirs = [‘assets‘]
// }
//
// // Move the tests to tests/java, tests/res, etc...
// instrumentTest.setRoot(‘tests‘)
//
// // Move the build types to build-types/<type>
// // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// // This moves them out of them default location under src/<type>/... which would
// // conflict with src/ being used by the main source set.
// // Adding new build types or product flavors should be accompanied
// // by a similar customization.
// debug.setRoot(‘build-types/debug‘)
// release.setRoot(‘build-types/release‘)
// }
/**
* 现在碰到的问题是如何触发这个事件打包
* signingConfigs 元素用于设置签名文件信息。在本例中,我们使用了 app/keystore 文件为 release 分支进行签名。
* 默认使用 SDK 中的 debug.keystore 为 debug 分支进行签名。
*/
signingConfigs {
release {
storeFile file(‘keystore‘)
storePassword ‘helloworld‘
keyAlias ‘Android Release Key‘
keyPassword ‘helloworld‘
}
}
defaultConfig {
applicationId "com.zsy.testasbuild"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
/**
* Gradle Build Variants
本例用于讲解如何使用 Gradle 利用一份代码生成多种 APK 。
本例中, app 文件夹中,除了默认会生成的 main 目录以及 androidTest 目录之外,我额外添加了6个目录,
分别是: release 、 debug 、 buildtypesnochange 、 playstore 、 amazonstore 、 productflavorsnochange 。
同时,我们在 app/build.gradle 中将这 6 个文件夹分不到 buildTypes 和 productFlavors 中。
设置所有的 buildTypes 的 zipAlignEnabled 为 false 目的是为了只生成 unaligned 的 APK ,用于只产生 9 个 APK 。
因为 unaligned 的 APK 是编译 aligned 的 APK的中间产物,会影响我们最终编译出的 APK 的个数。
为 release 和 buildtypesnochange 设置签名是为了方便安装到设备中。
观察 Android Studio 中 Build Variants 面板,发现 app 的选项列表已经不是默认的 release 和 debug 了
这些列表是一个 productFlavors 和一个 buildTypes 组装的结果。
在 Android Studio 的 Gradle Plugin 中,每一个 APK 均是由一个 buildTypes 和一个 productFlavors 组装而成。
在默认的情况下, buildTypes 有 release 和 debug 两个分支; productFlavors 没有。
每一个 module/src 都有一个名称为 main 的文件夹。这个文件夹属于 buildTypes 和 productFlavors 基础,
buildTypes 和 productFlavors 都可以访问和修改 main 文件夹中的内容。
现在发现还是gradle编译不过;(不知道如何原因)
我们通过 gradle build 命令,可以生成 9 种不同的 APK ,
*/
buildTypes {
// 我们可以在 buildTypes 中对 APK 的一些信息可以设置,例如本例中将 debug 分支下 APK 包名在默认的包名后追加 .debug ,从而最终包名为 cc.bb.aa.gradle_build_configs.debug:
/**
* debug 类型的 APK 的名称为 Debug;release 类型的 APK 的名称为 Release;
* buildtypesnochange 类型的 APK 的名称为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 名称(分别对应 Play 、 Amazon 、 Gradle-Build-Variants 。
* buildtypesnochange 和 productflavorsnochange 中没有设置 appname ,则使用了 main 中的 appname)。
debug 类型的 APK 的图标为 D;release 类型的 APK 的图标为 R;
buildtypesnochange 类型的 APK 的图标为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 图标(分别对应图标 P 、 A 、Android 默认图标。
buildtypesnochange 和 productflavorsnochange 中均没有设置 ic_launcher.png ,则使用了 main 中的 ic_launcher.png)。
在类 MainActivity 中,有这么一段代码:
TextView textView = (TextView) findViewById(R.id.textview);
textView.append("\nappName = " + getString(R.string.app_name));
textView.append("\nBuildTypesName = " + BuildTypesUtils.getBuildTypesName());
textView.append("\nProductFlavorsName = " + ProductFlavorsUtils.getProductFlavorsName());
textView.append("\npackageName = " + getPackageName());
实际上,在 main 文件夹中,并没有定义 BuildTypesUtils 类和 ProductFlavorsUtils 类( BuildTypesUtils 类定义在 release 、 debug 、 buildtypesnochange 中;
ProductFlavorsUtils 类定义在 playstore 、 amazonstore 、 productflavorsnochange 中),但是我们可以使用这些类。
当你在 Android Studio 的 Build Variants 面板中切换当前选择的 Build Variants ,你会发现在 Project 面板中,
对应的两个文件夹的 java 和 res 文件夹的图标会发生变化(显示为资源文件夹图标的样式),而 main 文件夹中的这两个文件夹一直表现为资源文件夹图标的样式。
你在 Build Variants 面板切换 Build Variants ,实际上是在更改当前编译的分支。当你选择了一个 Build Variants 后,
Android Studio 会编译改 Build Variants 对应的 buildTypes 和 productFlavors 中的类以及资源文件,重新组装,形成新的 App 。
所谓的重新组装,简单理解起来就是,将当前的 Build Variants 对应的 buildTypes 文件夹中的内容、当前的 Build Variants 对应的 productFlavors 对应的文件夹中的内容、 main 文件夹中的内容合并到一起,形成一个并集。
合并规则:
图片、音频、 XML 类型的 Drawable 等资源文件,将会进行文件级的覆盖(本例中的 ic_launcher.png)。
字符串、颜色值、整型等资源以及 AndroidManifest.xml ,将会进行元素级的覆盖(本例中的 appname 、 hello_world)。
代码资源,同一个类, buildTypes 、 productFlavors 、 main 中只能存在一次,否则会有类重复的错误(这就是为什么本例中没有在 main 中定义 BuildTypesUtils 类和 ProductFlavorsUtils 类)。
覆盖等级为:buildTypes > productFlavors > main (这就是为什么 release 类型的 APK 的名称都是 Release ;
debug 类型的 APK 的名称都是 Debug ; buildtypesnochange 类型的 APK 的名称需要根据 productFlavors 来确定)。
*/
debug {
applicationIdSuffix ".debug"
zipAlignEnabled false
}
release {
// 是否进行混淆
// minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
applicationIdSuffix ‘.release‘
signingConfig signingConfigs.release
zipAlignEnabled true
}
/**
* Gradle进行方便的多渠道打包;assemble还可以和productFlavors结合使用,具体在下一篇多渠道打包进一步解释
*/
// buildtypesnochange {
// signingConfig signingConfigs.release
// zipAlignEnabled false
// }
// 移除lint检查的error
lintOptions {
abortOnError false
}
}
productFlavors {
playstore {
applicationId ‘com.zsy.testasbuild.playstore‘
// applicationName "playstore"
}
amazonstore {
applicationId ‘com.zsy.testasbuild.amazonstore‘
// applicationName "amazonstore"
}
productflavorsnochange {
}
}
}
/**
* Gradle Library Projects
Gradle 项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的 Gradle 项目。
*/
dependencies {
// Remote artifacts(远程文件)compile ‘com.android.support:appcompat-v7:21.0.2‘
/**
* 引用 21.0.2 版本的 appcompat-v7 。
在 Android Studio中,使用 android support ,需要在 SDK 中下载 Android Support Repository ,且项目中使用的版本不能大于 SDK 中的版本。
当你的 SDK 中已经下载指定版本的 Android Support Repository ,即使没有联网,你也是可以在 Android Studio 中依赖对应的文件。
如果你的 SDK 没有下载指定版本的 Android Support Repository ,即使你现在连着网,也会出错。
*/
compile ‘com.android.support:appcompat-v7:22.1.1‘
// compile ‘com.android.support:support-v4:21.0.2‘
// compile ‘com.android.support:support-v4:21.+‘
// Local packages(本地包)
// 引用 libs 目录下的所有的 .jar 文件。如果你指向引用 libs 目录下中一个指定的 jar ,你可以这么设置:
// 引用libs文件夹下除xx.jar以外所有的jar。
// compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// compile files(‘libs/xx.jar‘)
compile fileTree(include: [‘*.jar‘], dir: ‘libs‘)
// compile ‘com.android.support:appcompat-v7:21.0.3‘
// compile ‘com.jakewharton:butterknife:6.0.0‘
// compile ‘com.nhaarman.listviewanimations:lib-core:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar‘
// compile ‘com.umeng.analytics:analytics:latest.integration‘
// compile ‘com.github.gabrielemariotti.changeloglib:library:1.5.2‘
// compile ‘com.hannesdorfmann.smoothprogressbar:library:1.0.0‘
// compile ‘com.github.castorflex.smoothprogressbar:library-circular:1.0.0‘
// 引用 lib 工程。
// compile project(‘:app‘)
// 编译extras目录下的ShimmerAndroid模块
// compile project(‘:extras:ShimmerAndroid‘)
// Java 在做 Unit Test 的时候,最常用的便是 JUnit 了,所以我们需要加入 JUnit 的依赖。在 {@projectName}/{@moduleName}/build.gradle 中添加 JUnit 的 Maven 依赖。
// testCompile 意思为,test模式下依赖某一个库,该库不会在我们正式发布时打包到我们的程序中,作用和 debugCompile 类似。
// testCompile ‘junit:junit:4.12‘
}
/**
* if this project form eclipse export ;
* Gradle Eclipse Compatible
当你的项目从 Eclipse 中使用 Generate Gradle build files 导出的时候。为了兼容 Eclipse 的文件结构, Gradle 对资源文件目录、代码文件目录等目录进行了设置。
默认的,导出项目中没有 {@projectName}/settings.gradle 文件,而且 {@projectName}/build.gradle 和 {@moduleName}/build.gradle 文件进行了合并。合并后的文件内容如下:
buildscript {repositories {mavenCentral()}dependencies {classpath ‘com.android.tools.build:gradle:1.0.0‘}}apply plugin: ‘android‘
dependencies {compile fileTree(dir: ‘libs‘, include: ‘*.jar‘)}android {compileSdkVersion 21
buildToolsVersion "21.1.2"
sourceSets {main {manifest.srcFile ‘AndroidManifest.xml‘
java.srcDirs = [‘src‘]
resources.srcDirs = [‘src‘]
aidl.srcDirs = [‘src‘]
renderscript.srcDirs = [‘src‘]
res.srcDirs = [‘res‘]
assets.srcDirs = [‘assets‘]}// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot(‘tests‘)
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot(‘build-types/debug‘)
release.setRoot(‘build-types/release‘)}}和默认的 Android Studio {@moduleName}/build.gradle 文件相比, sourceSets 算是最大的区别了。 sourceSets 用于设置文件目录。
main 元素表示默认的主干,出了 main 之外,默认的会有 release 和 debug 分支。如果 release 和 debug 分支中有些文件所在的目录不在默认目录同时也不再 main 所设置的目录,你可以在对应的分支中进行设置。
*/
/**
* ps:补充内容
关于依赖更多的补充内容如下:
* dependencies {// 引入 jar 包。
// 引用某一个特定的jar。
compile files(‘libs/xx.jar‘)
// 引用libs文件夹下除xx.jar以外所有的jar。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// so包在0.8版本的Android Studio中的目录更改为@{ModuleName}/src/main/jniLibs。且可以不用在此处配置so了。
// 从 maven 库中引入。
//compile ‘com.github.chrisbanes.actionbarpulltorefresh:extra-abc:0.9.2‘
// 引用 lib 工程。
compile project(‘:moduleName‘)
// 引用users-library。users-library作用是,在编译时使用,但是jar不会打包到apk中,由Android或Android上安装的服务提供需要的内容。
// 使用场景:
// 1. 使用Android的framework-classes.jar中的一些隐藏的API。
// 2. Google的服务框架或者其他服务框架。需要在AndroidMainFest.xml中配合uses-library使用。
provided files(‘libs/xx.jar‘)
provided ‘aaa:bbb:x.x.x‘
// 在测试环境下引用依赖。
// 引用jar文件。
androidTestCompile files(‘libs/xx.jar‘)
// 引用Maven。
androidTestCompile ‘junit:junit:4.11‘
// 在baidu productFlavors分支下引用依赖。
// 引用jar文件。
baiduCompile files(‘libs/xx.jar‘)
// 引用Maven。
baiduCompile ‘aaa:bbb:x.x.x‘
// 在release buildTypes分支下引用依赖。
// 引用jar文件。
releaseCompile files(‘libs/xx.jar‘)
// 引用Maven。
releaseCompile ‘aaa:bbb:x.x.x‘}*/
版本控制
当你在 Android Studio中创建了一个项目之后,默认是没有版本控制的。如果你想对项目进行版本控制,可以这么设置。
VCS --> Enable Version Control Integration 。
如果你想取消某一个项目的版本控制,你可以在设置页面中设置。
Version Control 右侧列表中,选择目标 module ,在点击右侧的减号即可。
如果你想从版本服务器中迁出项目,你可以这么设置。
VCS --> Checkout from Version Control ,选择服务器的版本控制工具,填写地址即可迁出。
在 Android Studio 起始页面也可以进行迁出。
点击 Checkout from Version Control,选择服务器的版本控制工具,填写地址即可迁出。
设置控制git和svn提交提示信息:
git(github版本控制)ignore文件提交设置:
SVN版本控制:跟Git和SVN(一定要配置跟系统一样的.exe那样在项目才能同时操作,两不误)
发现svn没有配置svn工具exe;这样就会出现as的插件和在项目目录中单独用TortoiseSVN不能同时用;
如下:(ps:这里一定要不要选择升级工作副本,要不然会出现不能同步svn,和配置svn同步提交代码等各种问题)
所以得修改一下配置:己独立安装带有 command line 功能的 SVN 客户端,我使用的是TortoiseSVN,据说 1.7 之后开始支持 command line 模式,我现在用的是 1.8.11 版本如图,安装时必须自定义选择 command line 否则不会安装的
Use Command Line Client 选择浏览到你本地安装 TortoiseSVN 的 svn.exe 文件路径,(注意输入框最右侧有个浏览的按钮,有可能没显示出来,拉伸窗口即可见)
配置好后重新下载svn项目代码:(记住这里一定要选择1.8版本到后面才有效,记住这里的1.8不是JDK的版本配置而是SVN自己版本配置)
发现此时都已经配置上的svn管理:
由于SVN的忽略用开放工具不好设置(ps:git有插件很好管理),所以我们得通过 TortoiseSVN 来添加忽略;
AS常用插件安装配置:下载不了直接用浏览器下载后,再本地更新:
离线安装插件:(安装完后,重启as)
常用配置安装的插件:
个人禁用了一下插件:CVS Integration : CVS 版本控制系统,用不到。Google Cloud Tools For Android Studio : Google云 用不到。Google Login : Google账号登录,`Google Cloud Tools For Android Studio** 插件需用,用不到。hg4idea : Mercurial 版本控制系统,用不到。
你可以在 Browse repositories 页面中,搜索插件并安装。我个人额外安装的插件:.gitignore support : Git 版本控制系统中 .gitignore 文件管理插件。
常碰到的问题:1:不能自动实现方法; 在类头部按下,Alt+Enter键,按提示加入;
2:和包名引入; 在方法按下,Alt+Enter键,按提示加入;
3:as编译器中间有一根线; 方法一:直接设置不要显示;
方法二:设置线显示的间距远一点;
4:如何折叠代码 5:设置编译器代码自动换行 6:关闭打开Project树的快捷键 Alt+1
7: 找方法的父类,方面集成 8: Android Studio代码自动提示无效(not available in Power Save mode)不生效的原因是因为你AS设置成了省电模式,设置成省电模式了的话,AS会禁掉一些辅助功能,达到省电的目的。所以代码自动提示也被禁掉了。要修改回来的话,通过File选项,然后倒数第二项:Power Save Mode前面的勾点掉就可以了 9:查找那里用过这个类或方法; 10:显示代码的行号; 方法一:临时设置;
方法二:全局设置;
11:设置快捷键格式样式;
12:设置样式:
如果自己不喜欢这种样式。可以自己配置样式;如配置保护色背景(个人还是喜欢Darcula);设置background的色值为(199, 237, 204)
13:设置开发工具退出弹出框:
14:自动保存配置设置:15:设置字体大小:
16:配置插件:
17:设置项目编码格式: 18:规范代码格式化配置:
19:设置默认web浏览器:
20:看出缩进是 tab 缩进还是空格缩进。建议使用空格缩进。
21:检查更新Android Studio支持自动检查更新。之前尚未发布正式版时,一周有时会有几次更新。你可以设置检查的类型,用以控制更新类型。Settings --> Updates 。勾选 Check for updates in channel ,即开通了自动检查更新。你可以禁用自动检查更新。右侧的列表,是更新通道。Stable Channel : 正式版本通道,只会获取最新的正式版本。Beta Channel : 测试版本通道,只会获取最新的测试版本。Dev Channel : 开发发布通道,只会获取最新的开发版本。Canary Channel : 预览发布通道,只会获取最新的预览版本。
以上4个通道中, Stable Channel 最稳定,问题相对较少, Canary Channel 能获得最新版本,问题相对较多。
22:自动导入当你从其他地方复制了一段代码到Android Studio中,默认的Android Studio不会自动导入这段代码中使用到的类的引用。你可以这么设置。Settings --> Editor --> Auto Import ,勾选 Add unambiguous improts on the fly 。23、成员变量前缀。
如果你命名成员变量习惯前面加一个m的前缀,但是生成getter和setter的时候,又不希望方法名中有这个m,可以如下设置。File->Settings->Code Style->Java,然后在右边面板中选择Code Generation标签,Naming,Field这一行,对应的Name prefix中加上m.24、方法排序。如果你总是调整自己写的方法,以使互相调用或功能相关的方法能靠近,可以这样设置。如第23条的步骤,在标签中选择Arrangment,勾住Keep dependent methods together,后面可以自己选择是按广度排序还是按深度排序。25、新文件的注释模板。File->Settings,搜索comment,找到File and Code Templates,右边面板,Templates->Class,然后修改编辑框里的内容。下面是接口(Interface)的注释模板。我的注释模板如下:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
/** * @author: samy(hongfeiliuxing@gmail.com) * @datetime: ${YEAR}-${MONTH}-${DAY}${HOUR}:${MINUTE}:${SECOND} * @datetime: ${DATE} ${TIME}
*/ public class ${NAME} { } 你也可以在Include标签中,备份一下原来的File Header,然后修改它。
# coding = utf-8
‘‘‘
* @dec:Python model
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: 2015-05-21 23:38
‘‘‘
# coding = utf-8
‘‘‘
* @dec:
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
‘‘‘
多渠道打包
8.4.1配置渠道
以友盟统计为例;
第一步 在AndroidManifest.xml里配置PlaceHolder:
第二步 在build.gradle设置productFlavors
以上两步即可。当然也有可视化的方法。
8.4.2打包
打包也有两种方式,命令行,和可视化界面的。
首先看命令行,在project的根目录下打开命令行。第一次运行的时候,可能会下载一些库文件。当全部打包完的时候,就在module的build文件下生成了相应的apk文件。
下面看可视化的方法。
全部选中。Finish。
区别:目前发现有个区别,不知道是不是我操作的问题,命令行打包的apk,是没有证书的,是需要重新签名的。而可视化的操作,是有证书的。
调试功能先编译好要调试的程序。
1.设置断点
选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。
2.开启调试会话
点击红色箭头指向的小虫子,开始进入调试。
IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。
3.单步调试
3.1 step over
点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)
3.2 step into
点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:
在自定义方法发f1()处设置断点,执行调试
点击
3.3 Force step into
该按钮在调试的时候能进入任何方法。
3.4 step out
如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
3.5 Drop frame
点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。
4. 高级调试
4.1 跨断点调试
设置多个断点,开启调试。
想移动到下一个断点,点击如下图:
程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。
4.2 查看断点
点击箭头指向的按钮,可以查看你曾经设置过的断点并可设置断点的一些属性。
箭头1指向的是你曾经设置过的断点,箭头2可以设置条件断点(满足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
4.3 设置变量值
调试开始后,在红箭头指向的区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能可以更加快速的检测你的条件语句和循环语句。
padding: 0px;">
安装时可能碰到的情况:第一次安装后启动后可以会出现一直在加载的界面;
这是在检查你的 Android SDK 。有人会在这里卡上很长时间,很大的原因就是:网络连接有问题。可以通过配置 hosts 的方式来解决。如果检查需要更新,则会让你安装,从而会有后面 讲解3 - 讲解6 。如果想跳过这一步,可以进行如下操作:在Android Studio安装目录下的 bin 目录下,找到 idea.properties 文件,在文件最后追加 disable.android.first.run=true 。
这样设置后,可以自己手动配置sdk和jdk的路径位置;
Android Studio创建项目
·
修改sdk的目录配置到as安装版本设置的sdk位置路径:(防止跟eclipse的SDK路径冲突)
设置项目的编码格式:
像在eclipse一样如果你选择了用到Actionbar,默认的它会给你应用一个v7包,方法一:自己手动导入v7包放入到项目的libs中;
方法二:让as编译是,自动去找到;
切换到project中配置,
编译项目:用的配置gradle;(配置自己的GRADLE_HOME,防止编译时下下载Gradle,编译速度慢,没有生成一个标准,不方便后面管理配)
删除项目:1:先移除model;
从as的记录中删除。选中项目,直接按住delete键
Android Studio导入项目
1:导入eclipse项目;(Android Studio默认使用 Gradle 构建项目, Eclipse 默认使用Ant构建项目。建议Android Studio导入项目时,使用 Gradle 构建项目。)方式一:直接导入 Eclipse 项目
当你看到这个界面,就表示导入成功了。项目使用 Ant 构建,并不是Android Studio 默认的 Gradle 。
经编译发现问题,lib_v4包重复;去掉一个重新编译;
这样的导入项目的方式,就会生成的apk,在这样的目录中;
回到之前项目目录中,发现多了。此时这个项目同时支持Eclipse和As开发,都是用Ant编译脚本;
方式 二:使用 Gradle 编译项目本方法有一个缺点就是,一次只能导入一个 Eclipse 项目。对于那些只使用到了官方系列的支持包的 Eclipse 项目来说,会方面很多,而且同时兼容 Eclipse 文件目录结构。
Android Studio识别出你的项目是一个 Eclipse Android 项目,它将重新使用 Gradle 构建项目。Android Studio会完整复制项目文件到一个新的目录中,你需要设置这个新目录的地址。
Replace jars with dependencies,when possible :将 Ant 的 jar 依赖关系使用 dependencies 重构。Replace library sources with dependencies,when possible :将 Ant 的 library 项目的依赖关系使用 dependencies 重构。Create Gradle-style(cameCase) module names :使用 Gradle 的样式构建Android Studio的 Module名称。
方式 三:直接导入 Generate Gradle build files 项目
切入到项目中查看生成多的文件:我们可以发现:在工作空间目录下,多出了 gradle 文件夹和 build.gradle 、 build.gradle 、 gradlew 、 gradlew.bat 、 settings.gradle 文件;在 e-demo 目录下多出了 build.gradle 文件; 在 appcompat_v7 目录下多出了 build.gradle 文件。这些文件和文件夹都和 Gradle 有关系,用于构建项目。这些文件以及文件夹的作用,我们以后再说。
由于 Eclipse 的 ADT 插件已经很久没有更新了,自动生成的 Gradle 编译设置已经跟不上Android Studio的更新速度,所以我们需要手动修改一些内容。(一定要记住这里的配置)
1:打开工作空间目录下的 gradle --> wrapper --> gradle-wrapper.properties 。修改一下内容: distributionUrl=http\://services.gradle.org/distributions/gradle-a.b.c-all.zip --> distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip2:打开工作空间目录下的 build.gradle 文件。修改以下内容:classpath ‘com.android.tools.build:gradle:0.x.+‘ --> classpath ‘com.android.tools.build:gradle:1.1.0‘
之所以这么设置,是因为: Eclipse 导出的 Gradle 设置已经不是Android Studio 1.2 所支持的 Gradle 已经 Gradle 插件版本,需要手动更为支持的版本。否则轻则必须不能离线导入项目,重则项目导入失败。
导入到as中:此时会弹出一个框,让你选择文件夹,这个时候需要注意的就是,你需要选择原来的 Eclipse 的工作空间目录,而不是 TestAndBuild 目录。
对应SDK编译的配置设置;
可以在这里查看刚才配置的信息;
配置设置gradle加载本地的(推荐设置)
此处有一些比较重要的设置需要讲解一下。Gradle project :此处通常显示的路径并不是你的 Eclipse 的工作空间的目录,而是 Eclipse 的工作空间的目录中的 gradle 路径。你需要手动删除后面的 gradle ,否则项目导入,你是看不到你的代码的,只能看到 gradle 目录下的内容。Create directories for empty content roots automatically :不是很明白它的作用,一般默认即可。Use default gradle wrapper(recommended) 和 Use local gradle disribution :这两个是让你设置使用的 Gradle 。默认会勾选 Use default gradle wrapper(recommended) ,我们需要手动勾选 Use local gradle disribution 。Gradle home :勾选 Use local gradle disribution 后此项编程可编辑状态,默认的此处的地址为Android Studio安装目录中的 Gradle 路径地址。此处可能会有一些错误的警告,提示内容为: Gradle location is incorrect 。而你的这个目录下,确实是有 Gradle 的。产生这个问题的原因,很可能是因为 Gradle home 选项中,路径中的斜杠为 / 而不是 ** 。你需要点击左右的文件选择按钮,重新选择到Android Studio安装目录中的 **Gradle ,问题即可解决。Offline work :设置 Gradle 使用离线的方式导入项目。你可以勾选也可以不勾选。如果你有进行【设置的两步骤下】的操作,你则可以勾选,以离线的方式进行编译。测试这个已经配置成gradle编译的项目,所在的项目即可用于as开发也可以用于eclipse开发;2:导入Android Studio项目;
导入已经是AdnroidStudio项目;如github上的项目;(如本地有代码的话,建议还是配置下gradle版本和插件,设置成自己电脑本地的,那样方便以后编译快)如:
3:其他导入方式;导入一个项目除了在Android Studio起始页进行导入之外,你也可以在Android Studio主页中进行导入。File --> Import Project 或者 File --> Import Module 。
Android Studio 常用功能介绍
Android Studio 的基本用法
这个界面,显示了我们使用 Android Studio时经常接触到的功能面板。1:Project 面板。用于浏览项目文件。 Project 面板会显示当前的所有的 module 。 android application module 会显示一个手机图标(下图中的 app );android library module 会显示一个书架图标(下图中的 android-lib );java library module 会显示一个咖啡图标(下图中的 java-lib )。2:Build Variants 面板。用于设置当前项目的 Build Variants ( Gradle 知识)。所有的 Module 默认都会有 release 和 debug 两种选项。当你添加了 BuildTypes 和 productFlavors ,这里将出现更多的选项( Gradle 知识)。默认情况下, release 和 debug 的区别并不是很明显;针对于代码来说,是没有区别的。3:Android 面板。功能类似于 Eclipse 中的 Logcat ,但是比其多了一些常用功能,例如:截图,查看系统信息等。4:编辑区。用于编辑文件。5:Gradle 面板。Gradle 任务列表,双击可执行 Gradle 任务。常用任务: build 、 clean 、 assemble 、 assembleRelease 、 assembleDebug 、 lint 。常用按钮
编译右侧 module 列表中显示的 module 。
- 当前 project 的 module 列表。
- 运行左侧 module 列表中显示的 module 。
- debug 左侧 module 列表中显示的 module 。
- attach debugger to Android process 。
- 设置。
- 项目属性。
- 使用 Gradle 编译 project 。
- 虚拟机。
- SDK Manager 。
- DDMS 。
.gradle 文件简单介绍(官方文档: http://tools.android.com/tech-docs/new-build-system )
一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识;
{@projectName}\build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
/**
* Groovy 的基本语法
*/
/**
* .gradle 文件简单介绍
一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个 settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识,请看这里。{@projectName}\build.gradle
默认的 project 目录下的 build.gradle 文件内容如上。
buildscript :用于设置驱动构建过程的代码。
jcenter():声明使用 maven 仓库。在老版本中,此处为 mavenCentral()。
mavenCentral() :表示依赖从 Central Maven 2 仓库中获取。
jcenter() :表示依赖从 Bintary’s JCenter Maven 仓库中获取。
3. **mavenLocal()** :表示依赖从本地的Maven仓库中获取。
dependencies :声明了使用 Android Studio gradle 插件版本。一般升级AS或者导入从Eclipse中生成的项目时需要修改下面gradle版本。具体的版本对应关系,请点击。
allprojects:设置每一个 module 的构建过程。在此例中,设置了每一个 module 使用 maven 仓库依赖。
*/
/**
* maven远程库列表
*远程库 地址 镜像
central http://repo1.maven.org/maven2/ http://uk.maven.org/maven2
apache https://repository.apache.org/content/groups/public/
appfuse http://oss.sonatype.org/content/repositories/appfuse-snapshots/
Codehaus Snapshots http://nexus.codehaus.org/snapshots/
Dynamic Jasper http://archiva.fdvs.com.ar/repository/public1/
exoplatform http://repository.exoplatform.org/content/groups/public/
java.net https://maven.java.net/content/groups/public/
JBoss releases https://repository.jboss.org/nexus/content/repositories/releases/
jenkins ci http://maven.jenkins-ci.org/content/repositories/releases/
netbeans http://bits.netbeans.org/maven2/
SpringSource http://repo.springsource.org/release/
*/
/**
* 在深圳,默认的maven源可能无法访问,可以通过以下的方式设置其他的maven源。当然,你也可以设置依赖本地库。
maven {url "http://xx.xxx.xxx/xxx"}
开源中国的源地址为:
http://maven.oschina.net/content/groups/public/
开源中国的thirdparty源地址为:
http://maven.oschina.net/content/repositories/thirdparty/
一个项目可以有好几个库。 Gradle 会根据依赖定义的顺序在各个库里寻找它们。在第一个库里找到就不会再在第二个库里进行寻找。
*/
buildscript {
repositories {
jcenter()
}
// 本例运行环境为 1.0 版本的 Android Studio、2.2.1 版本的 Gradle 、1.0.0 版本的 Gradle Plugin 。
/**
* 本系列内容包含以下部分:
Gradle Hello World
讲解一个 Gradle 项目中,基础文件以及文件内容。
Gradle Eclipse Compatible
讲解对 Eclipse 项目的兼容。讲解 Gradle Plugin 中 sourceSets 元素。
Gradle Library Projects
讲解 Gradle 依赖。包含 .jar 依赖, Library project 依赖, Maven 依赖。
Gradle Build Configs
讲解 APK 打包时的签名设置。
Gradle Build Variants
讲解 Gradle Plugin 中 buildTypes 、 productFlavors 元素。
*/
// dependencies :声明了使用 Android Studio gradle 插件版本 1.1后加入了Junit功能;
dependencies {
classpath ‘com.android.tools.build:gradle:1.0.0‘
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
/**
* 常见使用方法
包依赖(aar)
使用aar时可以分为两种情况
① aar位于本地目录
首先在 android 的参数闭包中添加调用方法 repositories
repositories {
flatDir {
dirs ‘libs‘
}
}
然后在 dependencies 的参数闭包中添加
compile name: ‘volley‘, ext: ‘aar‘
② aar位于远程仓库
这里以maven为例,当然也可以使用其他类型的仓库,例如 Ivy。
只需要在jar包引用方式后面添加一个@aar就可以了
compile ‘com.alibaba:fastjson:latest.integration@aar‘
包依赖(jar)
compile group: ‘com.alibaba‘, module: ‘fastjson‘, version: ‘latest.integration‘
可以简写成
compile ‘com.alibaba:fastjson:latest.integration‘
latest.integration可以替换成具体的版本号,这里是获取服务器上的最新版本。
去掉重复依赖
compile ‘com.alibaba.fastjson.latest.integration‘ {
exclude module: ‘annotations‘, group: ‘com.google.android‘
}
*/
/**
* 下面以9GAG为例来讲解下命令行Gradle编译的过程。
1、切换到9GAG项目的根目录,执行 ./gradlew -v 来查看下项目所用的Gradle版本
如果你是第一次执行会去下载Gradle,这个过程如果不FQ非常慢,建议FQ
紧接着下载成功会看到如下信息:
------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------
Build time: 2014-11-24 09:45:35 UTC
Build number: none
Revision: 6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a
Groovy: 2.3.6
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.7.0_60 (Oracle Corporation 24.60-b09)
OS: Mac OS X 10.9.5 x86_64
2、接着执行 ./gradlew clean
执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:
:app:clean UP-TO-DATE
:extras:ShimmerAndroid:clean UP-TO-DATE
BUILD SUCCESSFUL
3、最后执行 ./gradlew build
这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功了
BUILD SUCCESSFUL
Total time: 31.456 secs
紧接着在 9GAG/app/build/outputs/apk 目录下会看到类似于app-debug-unaligned.apk, app-release-unsigned.apk等,看名字应该能理解意思,unaligned代表没有进行zip优化的,unsigned代表没有签名的。然后就可以直接安装apk查看运行效果了。
命令行执行Gradle脚本
在Android工程根目录下会自动生成一个shell脚本 - gradlew,执行之前记得加上x属性 - chomod +x gradlew
gradle脚本中包含了很多 【task】,可以通过task名来指定需要执行的task。
./gradlew build
./gradlew assemble
./gradlew assembleInnderDebug
理解了gradle wrapper的概念,下面一些常用命令也就容易理解了。
./gradlew -v 版本号
./gradlew clean 清除9GAG/app目录下的build文件夹
./gradlew build 检查依赖并编译打包
*/
/**
* 总结
不得不说,Gradle实在太好用了!虽然 Gradle 可以与 Ant 或 maven 配合使用,但是其简洁和功能性远远超过其他两个。
我现在开发的项目普遍使用的是 maven,不知道什么原因,
使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决办法就是把依赖包下载的本地。
*/
{@projectName}\settings.gradle
{@moduleName}\build.gradle
/**
* {@moduleName}\build.gradle
* 默认的 module 目录下的 build.gradle 文件内容如上。
apply plugin: ‘com.android.application‘:
表示使用 com.android.application 插件。也就是表示,这是一个 android application module 。 com.android.library 表示,这是一个 android library module 。
android:
配置所有android构建过程需要的参数。
compileSdkVersion:
用于编译的 SDK 版本。
buildToolsVersion:
用于 Gradle 编译项目的工具版本。
defaultConfig:
Android 项目默认设置。
applicationId:应用程序包名。
minSdkVersion:最低支持 Android 版本。
targetSdkVersion:目标版本。实际上应为测试环境下测试机的 Android 版本。
versionCode:版本号。
5. **versionName**:版本名称。
buildTypes:
编译类型。默认有两个: release 和 debug 。我们可以在此处添加自己的 buildTypes ,可在 Build Variants 面板看到(见 讲解1 )。
minifyEnabled:
是否使用混淆。在老版本中为 runProguard ,新版本之所换名称,是因为新版本支持去掉没使用到的资源文件,而 runProguard 这个名称已不合适了。
2. **proguardFiles**:
使用的混淆文件,可以使用多个混淆文件。此例中,使用了 **SDK** 中的 **proguard-android.txt** 文件以及当前 **module** 目录下的 **proguard-rules.pro** 文件。
dependencies:
用于配制引用的依赖。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]):
引用当前 module 目录下的 libs 文件夹中的所有 .jar 文件。
2. **compile ‘com.android.support:appcompat-v7:21.0.3‘**:
引用 **21.0.3**版本的 **appcompat-v7** (也就是常用的 **v7** library 项目)。
ps:在 **Eclipse** 中,使用 **android support** ,需要在 SDK 中下载 **Android Support Library** 。在 Android Studio中,使用 **android support** ,需要在 SDK 中下载 **Android Support Repository** ,且项目中使用的版本不能大于 SDK 中的版本。
*/
apply plugin: ‘com.android.application‘
android {
compileSdkVersion 21
// buildToolsVersion "21.1.2"
buildToolsVersion "22.0.1"
/*加入.so:*/
// (1)老版本,好像是指0.5以前的,具体不太记得了,方法如下:
// (注意:代码中的‘:MyProject‘一定要换成你的项目名字哦)
// task copyNativeLibs(type: Copy) {
// from(new File(project(‘:Direct-Load-apk‘).buildDir, ‘native-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.PackageApplicationTask) { pkgTask ->
// pkgTask.jniDir new File(buildDir, ‘native-libs‘)
// }
// (2)新版本,具体版本号忘记了,反正如果你下载的是最新的那么自带就是最新的编译器。
// 移除lint检查的error
// lintOptions {
// abortOnError false
// }
/**
* 使用 Java7
*/
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_7
// targetCompatibility JavaVersion.VERSION_1_7
// }
/**
* 这个配置应用用在从Eclipse导入的项目
*/
// sourceSets {
// main {
// jniLibs.srcDirs = [‘libs‘]
// manifest.srcFile ‘AndroidManifest.xml‘
// java.srcDirs = [‘src‘]
// resources.srcDirs = [‘src‘]
// aidl.srcDirs = [‘src‘]
// renderscript.srcDirs = [‘src‘]
// res.srcDirs = [‘res‘]
// assets.srcDirs = [‘assets‘]
// }
//
// // Move the tests to tests/java, tests/res, etc...
// instrumentTest.setRoot(‘tests‘)
//
// // Move the build types to build-types/<type>
// // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// // This moves them out of them default location under src/<type>/... which would
// // conflict with src/ being used by the main source set.
// // Adding new build types or product flavors should be accompanied
// // by a similar customization.
// debug.setRoot(‘build-types/debug‘)
// release.setRoot(‘build-types/release‘)
// }
/**
* 现在碰到的问题是如何触发这个事件打包
* signingConfigs 元素用于设置签名文件信息。在本例中,我们使用了 app/keystore 文件为 release 分支进行签名。
* 默认使用 SDK 中的 debug.keystore 为 debug 分支进行签名。
*/
signingConfigs {
release {
storeFile file(‘keystore‘)
storePassword ‘helloworld‘
keyAlias ‘Android Release Key‘
keyPassword ‘helloworld‘
}
}
defaultConfig {
applicationId "com.zsy.testasbuild"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
/**
* Gradle Build Variants
本例用于讲解如何使用 Gradle 利用一份代码生成多种 APK 。
本例中, app 文件夹中,除了默认会生成的 main 目录以及 androidTest 目录之外,我额外添加了6个目录,
分别是: release 、 debug 、 buildtypesnochange 、 playstore 、 amazonstore 、 productflavorsnochange 。
同时,我们在 app/build.gradle 中将这 6 个文件夹分不到 buildTypes 和 productFlavors 中。
设置所有的 buildTypes 的 zipAlignEnabled 为 false 目的是为了只生成 unaligned 的 APK ,用于只产生 9 个 APK 。
因为 unaligned 的 APK 是编译 aligned 的 APK的中间产物,会影响我们最终编译出的 APK 的个数。
为 release 和 buildtypesnochange 设置签名是为了方便安装到设备中。
观察 Android Studio 中 Build Variants 面板,发现 app 的选项列表已经不是默认的 release 和 debug 了
这些列表是一个 productFlavors 和一个 buildTypes 组装的结果。
在 Android Studio 的 Gradle Plugin 中,每一个 APK 均是由一个 buildTypes 和一个 productFlavors 组装而成。
在默认的情况下, buildTypes 有 release 和 debug 两个分支; productFlavors 没有。
每一个 module/src 都有一个名称为 main 的文件夹。这个文件夹属于 buildTypes 和 productFlavors 基础,
buildTypes 和 productFlavors 都可以访问和修改 main 文件夹中的内容。
现在发现还是gradle编译不过;(不知道如何原因)
我们通过 gradle build 命令,可以生成 9 种不同的 APK ,
*/
buildTypes {
// 我们可以在 buildTypes 中对 APK 的一些信息可以设置,例如本例中将 debug 分支下 APK 包名在默认的包名后追加 .debug ,从而最终包名为 cc.bb.aa.gradle_build_configs.debug:
/**
* debug 类型的 APK 的名称为 Debug;release 类型的 APK 的名称为 Release;
* buildtypesnochange 类型的 APK 的名称为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 名称(分别对应 Play 、 Amazon 、 Gradle-Build-Variants 。
* buildtypesnochange 和 productflavorsnochange 中没有设置 appname ,则使用了 main 中的 appname)。
debug 类型的 APK 的图标为 D;release 类型的 APK 的图标为 R;
buildtypesnochange 类型的 APK 的图标为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 图标(分别对应图标 P 、 A 、Android 默认图标。
buildtypesnochange 和 productflavorsnochange 中均没有设置 ic_launcher.png ,则使用了 main 中的 ic_launcher.png)。
在类 MainActivity 中,有这么一段代码:
TextView textView = (TextView) findViewById(R.id.textview);
textView.append("\nappName = " + getString(R.string.app_name));
textView.append("\nBuildTypesName = " + BuildTypesUtils.getBuildTypesName());
textView.append("\nProductFlavorsName = " + ProductFlavorsUtils.getProductFlavorsName());
textView.append("\npackageName = " + getPackageName());
实际上,在 main 文件夹中,并没有定义 BuildTypesUtils 类和 ProductFlavorsUtils 类( BuildTypesUtils 类定义在 release 、 debug 、 buildtypesnochange 中;
ProductFlavorsUtils 类定义在 playstore 、 amazonstore 、 productflavorsnochange 中),但是我们可以使用这些类。
当你在 Android Studio 的 Build Variants 面板中切换当前选择的 Build Variants ,你会发现在 Project 面板中,
对应的两个文件夹的 java 和 res 文件夹的图标会发生变化(显示为资源文件夹图标的样式),而 main 文件夹中的这两个文件夹一直表现为资源文件夹图标的样式。
你在 Build Variants 面板切换 Build Variants ,实际上是在更改当前编译的分支。当你选择了一个 Build Variants 后,
Android Studio 会编译改 Build Variants 对应的 buildTypes 和 productFlavors 中的类以及资源文件,重新组装,形成新的 App 。
所谓的重新组装,简单理解起来就是,将当前的 Build Variants 对应的 buildTypes 文件夹中的内容、当前的 Build Variants 对应的 productFlavors 对应的文件夹中的内容、 main 文件夹中的内容合并到一起,形成一个并集。
合并规则:
图片、音频、 XML 类型的 Drawable 等资源文件,将会进行文件级的覆盖(本例中的 ic_launcher.png)。
字符串、颜色值、整型等资源以及 AndroidManifest.xml ,将会进行元素级的覆盖(本例中的 appname 、 hello_world)。
代码资源,同一个类, buildTypes 、 productFlavors 、 main 中只能存在一次,否则会有类重复的错误(这就是为什么本例中没有在 main 中定义 BuildTypesUtils 类和 ProductFlavorsUtils 类)。
覆盖等级为:buildTypes > productFlavors > main (这就是为什么 release 类型的 APK 的名称都是 Release ;
debug 类型的 APK 的名称都是 Debug ; buildtypesnochange 类型的 APK 的名称需要根据 productFlavors 来确定)。
*/
debug {
applicationIdSuffix ".debug"
zipAlignEnabled false
}
release {
// 是否进行混淆
// minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
applicationIdSuffix ‘.release‘
signingConfig signingConfigs.release
zipAlignEnabled true
}
/**
* Gradle进行方便的多渠道打包;assemble还可以和productFlavors结合使用,具体在下一篇多渠道打包进一步解释
*/
// buildtypesnochange {
// signingConfig signingConfigs.release
// zipAlignEnabled false
// }
// 移除lint检查的error
lintOptions {
abortOnError false
}
}
productFlavors {
playstore {
applicationId ‘com.zsy.testasbuild.playstore‘
// applicationName "playstore"
}
amazonstore {
applicationId ‘com.zsy.testasbuild.amazonstore‘
// applicationName "amazonstore"
}
productflavorsnochange {
}
}
}
/**
* Gradle Library Projects
Gradle 项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的 Gradle 项目。
*/
dependencies {
// Remote artifacts(远程文件)compile ‘com.android.support:appcompat-v7:21.0.2‘
/**
* 引用 21.0.2 版本的 appcompat-v7 。
在 Android Studio中,使用 android support ,需要在 SDK 中下载 Android Support Repository ,且项目中使用的版本不能大于 SDK 中的版本。
当你的 SDK 中已经下载指定版本的 Android Support Repository ,即使没有联网,你也是可以在 Android Studio 中依赖对应的文件。
如果你的 SDK 没有下载指定版本的 Android Support Repository ,即使你现在连着网,也会出错。
*/
compile ‘com.android.support:appcompat-v7:22.1.1‘
// compile ‘com.android.support:support-v4:21.0.2‘
// compile ‘com.android.support:support-v4:21.+‘
// Local packages(本地包)
// 引用 libs 目录下的所有的 .jar 文件。如果你指向引用 libs 目录下中一个指定的 jar ,你可以这么设置:
// 引用libs文件夹下除xx.jar以外所有的jar。
// compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// compile files(‘libs/xx.jar‘)
compile fileTree(include: [‘*.jar‘], dir: ‘libs‘)
// compile ‘com.android.support:appcompat-v7:21.0.3‘
// compile ‘com.jakewharton:butterknife:6.0.0‘
// compile ‘com.nhaarman.listviewanimations:lib-core:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar‘
// compile ‘com.umeng.analytics:analytics:latest.integration‘
// compile ‘com.github.gabrielemariotti.changeloglib:library:1.5.2‘
// compile ‘com.hannesdorfmann.smoothprogressbar:library:1.0.0‘
// compile ‘com.github.castorflex.smoothprogressbar:library-circular:1.0.0‘
// 引用 lib 工程。
// compile project(‘:app‘)
// 编译extras目录下的ShimmerAndroid模块
// compile project(‘:extras:ShimmerAndroid‘)
// Java 在做 Unit Test 的时候,最常用的便是 JUnit 了,所以我们需要加入 JUnit 的依赖。在 {@projectName}/{@moduleName}/build.gradle 中添加 JUnit 的 Maven 依赖。
// testCompile 意思为,test模式下依赖某一个库,该库不会在我们正式发布时打包到我们的程序中,作用和 debugCompile 类似。
// testCompile ‘junit:junit:4.12‘
}
/**
* if this project form eclipse export ;
* Gradle Eclipse Compatible
当你的项目从 Eclipse 中使用 Generate Gradle build files 导出的时候。为了兼容 Eclipse 的文件结构, Gradle 对资源文件目录、代码文件目录等目录进行了设置。
默认的,导出项目中没有 {@projectName}/settings.gradle 文件,而且 {@projectName}/build.gradle 和 {@moduleName}/build.gradle 文件进行了合并。合并后的文件内容如下:
buildscript {repositories {mavenCentral()}dependencies {classpath ‘com.android.tools.build:gradle:1.0.0‘}}apply plugin: ‘android‘
dependencies {compile fileTree(dir: ‘libs‘, include: ‘*.jar‘)}android {compileSdkVersion 21
buildToolsVersion "21.1.2"
sourceSets {main {manifest.srcFile ‘AndroidManifest.xml‘
java.srcDirs = [‘src‘]
resources.srcDirs = [‘src‘]
aidl.srcDirs = [‘src‘]
renderscript.srcDirs = [‘src‘]
res.srcDirs = [‘res‘]
assets.srcDirs = [‘assets‘]}// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot(‘tests‘)
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot(‘build-types/debug‘)
release.setRoot(‘build-types/release‘)}}和默认的 Android Studio {@moduleName}/build.gradle 文件相比, sourceSets 算是最大的区别了。 sourceSets 用于设置文件目录。
main 元素表示默认的主干,出了 main 之外,默认的会有 release 和 debug 分支。如果 release 和 debug 分支中有些文件所在的目录不在默认目录同时也不再 main 所设置的目录,你可以在对应的分支中进行设置。
*/
/**
* ps:补充内容
关于依赖更多的补充内容如下:
* dependencies {// 引入 jar 包。
// 引用某一个特定的jar。
compile files(‘libs/xx.jar‘)
// 引用libs文件夹下除xx.jar以外所有的jar。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// so包在0.8版本的Android Studio中的目录更改为@{ModuleName}/src/main/jniLibs。且可以不用在此处配置so了。
// 从 maven 库中引入。
//compile ‘com.github.chrisbanes.actionbarpulltorefresh:extra-abc:0.9.2‘
// 引用 lib 工程。
compile project(‘:moduleName‘)
// 引用users-library。users-library作用是,在编译时使用,但是jar不会打包到apk中,由Android或Android上安装的服务提供需要的内容。
// 使用场景:
// 1. 使用Android的framework-classes.jar中的一些隐藏的API。
// 2. Google的服务框架或者其他服务框架。需要在AndroidMainFest.xml中配合uses-library使用。
provided files(‘libs/xx.jar‘)
provided ‘aaa:bbb:x.x.x‘
// 在测试环境下引用依赖。
// 引用jar文件。
androidTestCompile files(‘libs/xx.jar‘)
// 引用Maven。
androidTestCompile ‘junit:junit:4.11‘
// 在baidu productFlavors分支下引用依赖。
// 引用jar文件。
baiduCompile files(‘libs/xx.jar‘)
// 引用Maven。
baiduCompile ‘aaa:bbb:x.x.x‘
// 在release buildTypes分支下引用依赖。
// 引用jar文件。
releaseCompile files(‘libs/xx.jar‘)
// 引用Maven。
releaseCompile ‘aaa:bbb:x.x.x‘}*/
版本控制
当你在 Android Studio中创建了一个项目之后,默认是没有版本控制的。如果你想对项目进行版本控制,可以这么设置。
VCS --> Enable Version Control Integration 。
如果你想取消某一个项目的版本控制,你可以在设置页面中设置。
Version Control 右侧列表中,选择目标 module ,在点击右侧的减号即可。
如果你想从版本服务器中迁出项目,你可以这么设置。
VCS --> Checkout from Version Control ,选择服务器的版本控制工具,填写地址即可迁出。
在 Android Studio 起始页面也可以进行迁出。
点击 Checkout from Version Control,选择服务器的版本控制工具,填写地址即可迁出。
设置控制git和svn提交提示信息:
git(github版本控制)ignore文件提交设置:
SVN版本控制:跟Git和SVN(一定要配置跟系统一样的.exe那样在项目才能同时操作,两不误)
发现svn没有配置svn工具exe;这样就会出现as的插件和在项目目录中单独用TortoiseSVN不能同时用;
如下:(ps:这里一定要不要选择升级工作副本,要不然会出现不能同步svn,和配置svn同步提交代码等各种问题)
所以得修改一下配置:己独立安装带有 command line 功能的 SVN 客户端,我使用的是TortoiseSVN,据说 1.7 之后开始支持 command line 模式,我现在用的是 1.8.11 版本如图,安装时必须自定义选择 command line 否则不会安装的
Use Command Line Client 选择浏览到你本地安装 TortoiseSVN 的 svn.exe 文件路径,(注意输入框最右侧有个浏览的按钮,有可能没显示出来,拉伸窗口即可见)
配置好后重新下载svn项目代码:(记住这里一定要选择1.8版本到后面才有效,记住这里的1.8不是JDK的版本配置而是SVN自己版本配置)
发现此时都已经配置上的svn管理:
由于SVN的忽略用开放工具不好设置(ps:git有插件很好管理),所以我们得通过 TortoiseSVN 来添加忽略;
AS常用插件安装配置:下载不了直接用浏览器下载后,再本地更新:
离线安装插件:(安装完后,重启as)
常用配置安装的插件:
个人禁用了一下插件:CVS Integration : CVS 版本控制系统,用不到。Google Cloud Tools For Android Studio : Google云 用不到。Google Login : Google账号登录,`Google Cloud Tools For Android Studio** 插件需用,用不到。hg4idea : Mercurial 版本控制系统,用不到。
你可以在 Browse repositories 页面中,搜索插件并安装。我个人额外安装的插件:.gitignore support : Git 版本控制系统中 .gitignore 文件管理插件。
常碰到的问题:1:不能自动实现方法; 在类头部按下,Alt+Enter键,按提示加入;
2:和包名引入; 在方法按下,Alt+Enter键,按提示加入;
3:as编译器中间有一根线; 方法一:直接设置不要显示;
方法二:设置线显示的间距远一点;
4:如何折叠代码 5:设置编译器代码自动换行 6:关闭打开Project树的快捷键 Alt+1
7: 找方法的父类,方面集成 8: Android Studio代码自动提示无效(not available in Power Save mode)不生效的原因是因为你AS设置成了省电模式,设置成省电模式了的话,AS会禁掉一些辅助功能,达到省电的目的。所以代码自动提示也被禁掉了。要修改回来的话,通过File选项,然后倒数第二项:Power Save Mode前面的勾点掉就可以了 9:查找那里用过这个类或方法; 10:显示代码的行号; 方法一:临时设置;
方法二:全局设置;
11:设置快捷键格式样式;
12:设置样式:
如果自己不喜欢这种样式。可以自己配置样式;如配置保护色背景(个人还是喜欢Darcula);设置background的色值为(199, 237, 204)
13:设置开发工具退出弹出框:
14:自动保存配置设置:15:设置字体大小:
16:配置插件:
17:设置项目编码格式: 18:规范代码格式化配置:
19:设置默认web浏览器:
20:看出缩进是 tab 缩进还是空格缩进。建议使用空格缩进。
21:检查更新Android Studio支持自动检查更新。之前尚未发布正式版时,一周有时会有几次更新。你可以设置检查的类型,用以控制更新类型。Settings --> Updates 。勾选 Check for updates in channel ,即开通了自动检查更新。你可以禁用自动检查更新。右侧的列表,是更新通道。Stable Channel : 正式版本通道,只会获取最新的正式版本。Beta Channel : 测试版本通道,只会获取最新的测试版本。Dev Channel : 开发发布通道,只会获取最新的开发版本。Canary Channel : 预览发布通道,只会获取最新的预览版本。
以上4个通道中, Stable Channel 最稳定,问题相对较少, Canary Channel 能获得最新版本,问题相对较多。
22:自动导入当你从其他地方复制了一段代码到Android Studio中,默认的Android Studio不会自动导入这段代码中使用到的类的引用。你可以这么设置。Settings --> Editor --> Auto Import ,勾选 Add unambiguous improts on the fly 。23、成员变量前缀。
如果你命名成员变量习惯前面加一个m的前缀,但是生成getter和setter的时候,又不希望方法名中有这个m,可以如下设置。File->Settings->Code Style->Java,然后在右边面板中选择Code Generation标签,Naming,Field这一行,对应的Name prefix中加上m.24、方法排序。如果你总是调整自己写的方法,以使互相调用或功能相关的方法能靠近,可以这样设置。如第23条的步骤,在标签中选择Arrangment,勾住Keep dependent methods together,后面可以自己选择是按广度排序还是按深度排序。25、新文件的注释模板。File->Settings,搜索comment,找到File and Code Templates,右边面板,Templates->Class,然后修改编辑框里的内容。下面是接口(Interface)的注释模板。我的注释模板如下:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
/** * @author: samy(hongfeiliuxing@gmail.com) * @datetime: ${YEAR}-${MONTH}-${DAY}${HOUR}:${MINUTE}:${SECOND} * @datetime: ${DATE} ${TIME}
*/ public class ${NAME} { } 你也可以在Include标签中,备份一下原来的File Header,然后修改它。
# coding = utf-8
‘‘‘
* @dec:Python model
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: 2015-05-21 23:38
‘‘‘
# coding = utf-8
‘‘‘
* @dec:
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
‘‘‘
多渠道打包
8.4.1配置渠道
以友盟统计为例;
第一步 在AndroidManifest.xml里配置PlaceHolder:
第二步 在build.gradle设置productFlavors
以上两步即可。当然也有可视化的方法。
8.4.2打包
打包也有两种方式,命令行,和可视化界面的。
首先看命令行,在project的根目录下打开命令行。第一次运行的时候,可能会下载一些库文件。当全部打包完的时候,就在module的build文件下生成了相应的apk文件。
下面看可视化的方法。
全部选中。Finish。
区别:目前发现有个区别,不知道是不是我操作的问题,命令行打包的apk,是没有证书的,是需要重新签名的。而可视化的操作,是有证书的。
调试功能先编译好要调试的程序。
1.设置断点
选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。
2.开启调试会话
点击红色箭头指向的小虫子,开始进入调试。
IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。
3.单步调试
3.1 step over
点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)
3.2 step into
点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:
在自定义方法发f1()处设置断点,执行调试
点击
3.3 Force step into
该按钮在调试的时候能进入任何方法。
3.4 step out
如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
3.5 Drop frame
点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。
4. 高级调试
4.1 跨断点调试
设置多个断点,开启调试。
想移动到下一个断点,点击如下图:
程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。
4.2 查看断点
点击箭头指向的按钮,可以查看你曾经设置过的断点并可设置断点的一些属性。
箭头1指向的是你曾经设置过的断点,箭头2可以设置条件断点(满足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
4.3 设置变量值
调试开始后,在红箭头指向的区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能可以更加快速的检测你的条件语句和循环语句。
padding: 0px;">
Android Studio导入项目
方式一:直接导入 Eclipse 项目
- 当前 project 的 module 列表。
- 运行左侧 module 列表中显示的 module 。
- debug 左侧 module 列表中显示的 module 。
- attach debugger to Android process 。
- 设置。
- 项目属性。
- 使用 Gradle 编译 project 。
- 虚拟机。
- SDK Manager 。
- DDMS 。
.gradle 文件简单介绍(官方文档: http://tools.android.com/tech-docs/new-build-system )
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识;
{@projectName}\build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
/**
* Groovy 的基本语法
*/
/**
* .gradle 文件简单介绍
一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个 settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。
本文只是简略的讲解一下默认生成的 .gradle 文件的内容,更多 Gradle Plugin 的知识,请看这里。{@projectName}\build.gradle
默认的 project 目录下的 build.gradle 文件内容如上。
buildscript :用于设置驱动构建过程的代码。
jcenter():声明使用 maven 仓库。在老版本中,此处为 mavenCentral()。
mavenCentral() :表示依赖从 Central Maven 2 仓库中获取。
jcenter() :表示依赖从 Bintary’s JCenter Maven 仓库中获取。
3. **mavenLocal()** :表示依赖从本地的Maven仓库中获取。
dependencies :声明了使用 Android Studio gradle 插件版本。一般升级AS或者导入从Eclipse中生成的项目时需要修改下面gradle版本。具体的版本对应关系,请点击。
allprojects:设置每一个 module 的构建过程。在此例中,设置了每一个 module 使用 maven 仓库依赖。
*/
/**
* maven远程库列表
*远程库 地址 镜像
central http://repo1.maven.org/maven2/ http://uk.maven.org/maven2
apache https://repository.apache.org/content/groups/public/
appfuse http://oss.sonatype.org/content/repositories/appfuse-snapshots/
Codehaus Snapshots http://nexus.codehaus.org/snapshots/
Dynamic Jasper http://archiva.fdvs.com.ar/repository/public1/
exoplatform http://repository.exoplatform.org/content/groups/public/
java.net https://maven.java.net/content/groups/public/
JBoss releases https://repository.jboss.org/nexus/content/repositories/releases/
jenkins ci http://maven.jenkins-ci.org/content/repositories/releases/
netbeans http://bits.netbeans.org/maven2/
SpringSource http://repo.springsource.org/release/
*/
/**
* 在深圳,默认的maven源可能无法访问,可以通过以下的方式设置其他的maven源。当然,你也可以设置依赖本地库。
maven {url "http://xx.xxx.xxx/xxx"}
开源中国的源地址为:
http://maven.oschina.net/content/groups/public/
开源中国的thirdparty源地址为:
http://maven.oschina.net/content/repositories/thirdparty/
一个项目可以有好几个库。 Gradle 会根据依赖定义的顺序在各个库里寻找它们。在第一个库里找到就不会再在第二个库里进行寻找。
*/
buildscript {
repositories {
jcenter()
}
// 本例运行环境为 1.0 版本的 Android Studio、2.2.1 版本的 Gradle 、1.0.0 版本的 Gradle Plugin 。
/**
* 本系列内容包含以下部分:
Gradle Hello World
讲解一个 Gradle 项目中,基础文件以及文件内容。
Gradle Eclipse Compatible
讲解对 Eclipse 项目的兼容。讲解 Gradle Plugin 中 sourceSets 元素。
Gradle Library Projects
讲解 Gradle 依赖。包含 .jar 依赖, Library project 依赖, Maven 依赖。
Gradle Build Configs
讲解 APK 打包时的签名设置。
Gradle Build Variants
讲解 Gradle Plugin 中 buildTypes 、 productFlavors 元素。
*/
// dependencies :声明了使用 Android Studio gradle 插件版本 1.1后加入了Junit功能;
dependencies {
classpath ‘com.android.tools.build:gradle:1.0.0‘
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
/**
* 常见使用方法
包依赖(aar)
使用aar时可以分为两种情况
① aar位于本地目录
首先在 android 的参数闭包中添加调用方法 repositories
repositories {
flatDir {
dirs ‘libs‘
}
}
然后在 dependencies 的参数闭包中添加
compile name: ‘volley‘, ext: ‘aar‘
② aar位于远程仓库
这里以maven为例,当然也可以使用其他类型的仓库,例如 Ivy。
只需要在jar包引用方式后面添加一个@aar就可以了
compile ‘com.alibaba:fastjson:latest.integration@aar‘
包依赖(jar)
compile group: ‘com.alibaba‘, module: ‘fastjson‘, version: ‘latest.integration‘
可以简写成
compile ‘com.alibaba:fastjson:latest.integration‘
latest.integration可以替换成具体的版本号,这里是获取服务器上的最新版本。
去掉重复依赖
compile ‘com.alibaba.fastjson.latest.integration‘ {
exclude module: ‘annotations‘, group: ‘com.google.android‘
}
*/
/**
* 下面以9GAG为例来讲解下命令行Gradle编译的过程。
1、切换到9GAG项目的根目录,执行 ./gradlew -v 来查看下项目所用的Gradle版本
如果你是第一次执行会去下载Gradle,这个过程如果不FQ非常慢,建议FQ
紧接着下载成功会看到如下信息:
------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------
Build time: 2014-11-24 09:45:35 UTC
Build number: none
Revision: 6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a
Groovy: 2.3.6
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.7.0_60 (Oracle Corporation 24.60-b09)
OS: Mac OS X 10.9.5 x86_64
2、接着执行 ./gradlew clean
执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:
:app:clean UP-TO-DATE
:extras:ShimmerAndroid:clean UP-TO-DATE
BUILD SUCCESSFUL
3、最后执行 ./gradlew build
这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功了
BUILD SUCCESSFUL
Total time: 31.456 secs
紧接着在 9GAG/app/build/outputs/apk 目录下会看到类似于app-debug-unaligned.apk, app-release-unsigned.apk等,看名字应该能理解意思,unaligned代表没有进行zip优化的,unsigned代表没有签名的。然后就可以直接安装apk查看运行效果了。
命令行执行Gradle脚本
在Android工程根目录下会自动生成一个shell脚本 - gradlew,执行之前记得加上x属性 - chomod +x gradlew
gradle脚本中包含了很多 【task】,可以通过task名来指定需要执行的task。
./gradlew build
./gradlew assemble
./gradlew assembleInnderDebug
理解了gradle wrapper的概念,下面一些常用命令也就容易理解了。
./gradlew -v 版本号
./gradlew clean 清除9GAG/app目录下的build文件夹
./gradlew build 检查依赖并编译打包
*/
/**
* 总结
不得不说,Gradle实在太好用了!虽然 Gradle 可以与 Ant 或 maven 配合使用,但是其简洁和功能性远远超过其他两个。
我现在开发的项目普遍使用的是 maven,不知道什么原因,
使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决办法就是把依赖包下载的本地。
*/
{@projectName}\settings.gradle
{@moduleName}\build.gradle
/**
* {@moduleName}\build.gradle
* 默认的 module 目录下的 build.gradle 文件内容如上。
apply plugin: ‘com.android.application‘:
表示使用 com.android.application 插件。也就是表示,这是一个 android application module 。 com.android.library 表示,这是一个 android library module 。
android:
配置所有android构建过程需要的参数。
compileSdkVersion:
用于编译的 SDK 版本。
buildToolsVersion:
用于 Gradle 编译项目的工具版本。
defaultConfig:
Android 项目默认设置。
applicationId:应用程序包名。
minSdkVersion:最低支持 Android 版本。
targetSdkVersion:目标版本。实际上应为测试环境下测试机的 Android 版本。
versionCode:版本号。
5. **versionName**:版本名称。
buildTypes:
编译类型。默认有两个: release 和 debug 。我们可以在此处添加自己的 buildTypes ,可在 Build Variants 面板看到(见 讲解1 )。
minifyEnabled:
是否使用混淆。在老版本中为 runProguard ,新版本之所换名称,是因为新版本支持去掉没使用到的资源文件,而 runProguard 这个名称已不合适了。
2. **proguardFiles**:
使用的混淆文件,可以使用多个混淆文件。此例中,使用了 **SDK** 中的 **proguard-android.txt** 文件以及当前 **module** 目录下的 **proguard-rules.pro** 文件。
dependencies:
用于配制引用的依赖。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]):
引用当前 module 目录下的 libs 文件夹中的所有 .jar 文件。
2. **compile ‘com.android.support:appcompat-v7:21.0.3‘**:
引用 **21.0.3**版本的 **appcompat-v7** (也就是常用的 **v7** library 项目)。
ps:在 **Eclipse** 中,使用 **android support** ,需要在 SDK 中下载 **Android Support Library** 。在 Android Studio中,使用 **android support** ,需要在 SDK 中下载 **Android Support Repository** ,且项目中使用的版本不能大于 SDK 中的版本。
*/
apply plugin: ‘com.android.application‘
android {
compileSdkVersion 21
// buildToolsVersion "21.1.2"
buildToolsVersion "22.0.1"
/*加入.so:*/
// (1)老版本,好像是指0.5以前的,具体不太记得了,方法如下:
// (注意:代码中的‘:MyProject‘一定要换成你的项目名字哦)
// task copyNativeLibs(type: Copy) {
// from(new File(project(‘:Direct-Load-apk‘).buildDir, ‘native-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.PackageApplicationTask) { pkgTask ->
// pkgTask.jniDir new File(buildDir, ‘native-libs‘)
// }
// (2)新版本,具体版本号忘记了,反正如果你下载的是最新的那么自带就是最新的编译器。
// 移除lint检查的error
// lintOptions {
// abortOnError false
// }
/**
* 使用 Java7
*/
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_7
// targetCompatibility JavaVersion.VERSION_1_7
// }
/**
* 这个配置应用用在从Eclipse导入的项目
*/
// sourceSets {
// main {
// jniLibs.srcDirs = [‘libs‘]
// manifest.srcFile ‘AndroidManifest.xml‘
// java.srcDirs = [‘src‘]
// resources.srcDirs = [‘src‘]
// aidl.srcDirs = [‘src‘]
// renderscript.srcDirs = [‘src‘]
// res.srcDirs = [‘res‘]
// assets.srcDirs = [‘assets‘]
// }
//
// // Move the tests to tests/java, tests/res, etc...
// instrumentTest.setRoot(‘tests‘)
//
// // Move the build types to build-types/<type>
// // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// // This moves them out of them default location under src/<type>/... which would
// // conflict with src/ being used by the main source set.
// // Adding new build types or product flavors should be accompanied
// // by a similar customization.
// debug.setRoot(‘build-types/debug‘)
// release.setRoot(‘build-types/release‘)
// }
/**
* 现在碰到的问题是如何触发这个事件打包
* signingConfigs 元素用于设置签名文件信息。在本例中,我们使用了 app/keystore 文件为 release 分支进行签名。
* 默认使用 SDK 中的 debug.keystore 为 debug 分支进行签名。
*/
signingConfigs {
release {
storeFile file(‘keystore‘)
storePassword ‘helloworld‘
keyAlias ‘Android Release Key‘
keyPassword ‘helloworld‘
}
}
defaultConfig {
applicationId "com.zsy.testasbuild"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
/**
* Gradle Build Variants
本例用于讲解如何使用 Gradle 利用一份代码生成多种 APK 。
本例中, app 文件夹中,除了默认会生成的 main 目录以及 androidTest 目录之外,我额外添加了6个目录,
分别是: release 、 debug 、 buildtypesnochange 、 playstore 、 amazonstore 、 productflavorsnochange 。
同时,我们在 app/build.gradle 中将这 6 个文件夹分不到 buildTypes 和 productFlavors 中。
设置所有的 buildTypes 的 zipAlignEnabled 为 false 目的是为了只生成 unaligned 的 APK ,用于只产生 9 个 APK 。
因为 unaligned 的 APK 是编译 aligned 的 APK的中间产物,会影响我们最终编译出的 APK 的个数。
为 release 和 buildtypesnochange 设置签名是为了方便安装到设备中。
观察 Android Studio 中 Build Variants 面板,发现 app 的选项列表已经不是默认的 release 和 debug 了
这些列表是一个 productFlavors 和一个 buildTypes 组装的结果。
在 Android Studio 的 Gradle Plugin 中,每一个 APK 均是由一个 buildTypes 和一个 productFlavors 组装而成。
在默认的情况下, buildTypes 有 release 和 debug 两个分支; productFlavors 没有。
每一个 module/src 都有一个名称为 main 的文件夹。这个文件夹属于 buildTypes 和 productFlavors 基础,
buildTypes 和 productFlavors 都可以访问和修改 main 文件夹中的内容。
现在发现还是gradle编译不过;(不知道如何原因)
我们通过 gradle build 命令,可以生成 9 种不同的 APK ,
*/
buildTypes {
// 我们可以在 buildTypes 中对 APK 的一些信息可以设置,例如本例中将 debug 分支下 APK 包名在默认的包名后追加 .debug ,从而最终包名为 cc.bb.aa.gradle_build_configs.debug:
/**
* debug 类型的 APK 的名称为 Debug;release 类型的 APK 的名称为 Release;
* buildtypesnochange 类型的 APK 的名称为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 名称(分别对应 Play 、 Amazon 、 Gradle-Build-Variants 。
* buildtypesnochange 和 productflavorsnochange 中没有设置 appname ,则使用了 main 中的 appname)。
debug 类型的 APK 的图标为 D;release 类型的 APK 的图标为 R;
buildtypesnochange 类型的 APK 的图标为 playstore 、 amazonstore 、 productflavorsnochange 中设置的 apname 图标(分别对应图标 P 、 A 、Android 默认图标。
buildtypesnochange 和 productflavorsnochange 中均没有设置 ic_launcher.png ,则使用了 main 中的 ic_launcher.png)。
在类 MainActivity 中,有这么一段代码:
TextView textView = (TextView) findViewById(R.id.textview);
textView.append("\nappName = " + getString(R.string.app_name));
textView.append("\nBuildTypesName = " + BuildTypesUtils.getBuildTypesName());
textView.append("\nProductFlavorsName = " + ProductFlavorsUtils.getProductFlavorsName());
textView.append("\npackageName = " + getPackageName());
实际上,在 main 文件夹中,并没有定义 BuildTypesUtils 类和 ProductFlavorsUtils 类( BuildTypesUtils 类定义在 release 、 debug 、 buildtypesnochange 中;
ProductFlavorsUtils 类定义在 playstore 、 amazonstore 、 productflavorsnochange 中),但是我们可以使用这些类。
当你在 Android Studio 的 Build Variants 面板中切换当前选择的 Build Variants ,你会发现在 Project 面板中,
对应的两个文件夹的 java 和 res 文件夹的图标会发生变化(显示为资源文件夹图标的样式),而 main 文件夹中的这两个文件夹一直表现为资源文件夹图标的样式。
你在 Build Variants 面板切换 Build Variants ,实际上是在更改当前编译的分支。当你选择了一个 Build Variants 后,
Android Studio 会编译改 Build Variants 对应的 buildTypes 和 productFlavors 中的类以及资源文件,重新组装,形成新的 App 。
所谓的重新组装,简单理解起来就是,将当前的 Build Variants 对应的 buildTypes 文件夹中的内容、当前的 Build Variants 对应的 productFlavors 对应的文件夹中的内容、 main 文件夹中的内容合并到一起,形成一个并集。
合并规则:
图片、音频、 XML 类型的 Drawable 等资源文件,将会进行文件级的覆盖(本例中的 ic_launcher.png)。
字符串、颜色值、整型等资源以及 AndroidManifest.xml ,将会进行元素级的覆盖(本例中的 appname 、 hello_world)。
代码资源,同一个类, buildTypes 、 productFlavors 、 main 中只能存在一次,否则会有类重复的错误(这就是为什么本例中没有在 main 中定义 BuildTypesUtils 类和 ProductFlavorsUtils 类)。
覆盖等级为:buildTypes > productFlavors > main (这就是为什么 release 类型的 APK 的名称都是 Release ;
debug 类型的 APK 的名称都是 Debug ; buildtypesnochange 类型的 APK 的名称需要根据 productFlavors 来确定)。
*/
debug {
applicationIdSuffix ".debug"
zipAlignEnabled false
}
release {
// 是否进行混淆
// minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
applicationIdSuffix ‘.release‘
signingConfig signingConfigs.release
zipAlignEnabled true
}
/**
* Gradle进行方便的多渠道打包;assemble还可以和productFlavors结合使用,具体在下一篇多渠道打包进一步解释
*/
// buildtypesnochange {
// signingConfig signingConfigs.release
// zipAlignEnabled false
// }
// 移除lint检查的error
lintOptions {
abortOnError false
}
}
productFlavors {
playstore {
applicationId ‘com.zsy.testasbuild.playstore‘
// applicationName "playstore"
}
amazonstore {
applicationId ‘com.zsy.testasbuild.amazonstore‘
// applicationName "amazonstore"
}
productflavorsnochange {
}
}
}
/**
* Gradle Library Projects
Gradle 项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的 Gradle 项目。
*/
dependencies {
// Remote artifacts(远程文件)compile ‘com.android.support:appcompat-v7:21.0.2‘
/**
* 引用 21.0.2 版本的 appcompat-v7 。
在 Android Studio中,使用 android support ,需要在 SDK 中下载 Android Support Repository ,且项目中使用的版本不能大于 SDK 中的版本。
当你的 SDK 中已经下载指定版本的 Android Support Repository ,即使没有联网,你也是可以在 Android Studio 中依赖对应的文件。
如果你的 SDK 没有下载指定版本的 Android Support Repository ,即使你现在连着网,也会出错。
*/
compile ‘com.android.support:appcompat-v7:22.1.1‘
// compile ‘com.android.support:support-v4:21.0.2‘
// compile ‘com.android.support:support-v4:21.+‘
// Local packages(本地包)
// 引用 libs 目录下的所有的 .jar 文件。如果你指向引用 libs 目录下中一个指定的 jar ,你可以这么设置:
// 引用libs文件夹下除xx.jar以外所有的jar。
// compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// compile files(‘libs/xx.jar‘)
compile fileTree(include: [‘*.jar‘], dir: ‘libs‘)
// compile ‘com.android.support:appcompat-v7:21.0.3‘
// compile ‘com.jakewharton:butterknife:6.0.0‘
// compile ‘com.nhaarman.listviewanimations:lib-core:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar‘
// compile ‘com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar‘
// compile ‘com.umeng.analytics:analytics:latest.integration‘
// compile ‘com.github.gabrielemariotti.changeloglib:library:1.5.2‘
// compile ‘com.hannesdorfmann.smoothprogressbar:library:1.0.0‘
// compile ‘com.github.castorflex.smoothprogressbar:library-circular:1.0.0‘
// 引用 lib 工程。
// compile project(‘:app‘)
// 编译extras目录下的ShimmerAndroid模块
// compile project(‘:extras:ShimmerAndroid‘)
// Java 在做 Unit Test 的时候,最常用的便是 JUnit 了,所以我们需要加入 JUnit 的依赖。在 {@projectName}/{@moduleName}/build.gradle 中添加 JUnit 的 Maven 依赖。
// testCompile 意思为,test模式下依赖某一个库,该库不会在我们正式发布时打包到我们的程序中,作用和 debugCompile 类似。
// testCompile ‘junit:junit:4.12‘
}
/**
* if this project form eclipse export ;
* Gradle Eclipse Compatible
当你的项目从 Eclipse 中使用 Generate Gradle build files 导出的时候。为了兼容 Eclipse 的文件结构, Gradle 对资源文件目录、代码文件目录等目录进行了设置。
默认的,导出项目中没有 {@projectName}/settings.gradle 文件,而且 {@projectName}/build.gradle 和 {@moduleName}/build.gradle 文件进行了合并。合并后的文件内容如下:
buildscript {repositories {mavenCentral()}dependencies {classpath ‘com.android.tools.build:gradle:1.0.0‘}}apply plugin: ‘android‘
dependencies {compile fileTree(dir: ‘libs‘, include: ‘*.jar‘)}android {compileSdkVersion 21
buildToolsVersion "21.1.2"
sourceSets {main {manifest.srcFile ‘AndroidManifest.xml‘
java.srcDirs = [‘src‘]
resources.srcDirs = [‘src‘]
aidl.srcDirs = [‘src‘]
renderscript.srcDirs = [‘src‘]
res.srcDirs = [‘res‘]
assets.srcDirs = [‘assets‘]}// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot(‘tests‘)
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot(‘build-types/debug‘)
release.setRoot(‘build-types/release‘)}}和默认的 Android Studio {@moduleName}/build.gradle 文件相比, sourceSets 算是最大的区别了。 sourceSets 用于设置文件目录。
main 元素表示默认的主干,出了 main 之外,默认的会有 release 和 debug 分支。如果 release 和 debug 分支中有些文件所在的目录不在默认目录同时也不再 main 所设置的目录,你可以在对应的分支中进行设置。
*/
/**
* ps:补充内容
关于依赖更多的补充内容如下:
* dependencies {// 引入 jar 包。
// 引用某一个特定的jar。
compile files(‘libs/xx.jar‘)
// 引用libs文件夹下除xx.jar以外所有的jar。
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘], exclude: [‘xx.jar‘])
// so包在0.8版本的Android Studio中的目录更改为@{ModuleName}/src/main/jniLibs。且可以不用在此处配置so了。
// 从 maven 库中引入。
//compile ‘com.github.chrisbanes.actionbarpulltorefresh:extra-abc:0.9.2‘
// 引用 lib 工程。
compile project(‘:moduleName‘)
// 引用users-library。users-library作用是,在编译时使用,但是jar不会打包到apk中,由Android或Android上安装的服务提供需要的内容。
// 使用场景:
// 1. 使用Android的framework-classes.jar中的一些隐藏的API。
// 2. Google的服务框架或者其他服务框架。需要在AndroidMainFest.xml中配合uses-library使用。
provided files(‘libs/xx.jar‘)
provided ‘aaa:bbb:x.x.x‘
// 在测试环境下引用依赖。
// 引用jar文件。
androidTestCompile files(‘libs/xx.jar‘)
// 引用Maven。
androidTestCompile ‘junit:junit:4.11‘
// 在baidu productFlavors分支下引用依赖。
// 引用jar文件。
baiduCompile files(‘libs/xx.jar‘)
// 引用Maven。
baiduCompile ‘aaa:bbb:x.x.x‘
// 在release buildTypes分支下引用依赖。
// 引用jar文件。
releaseCompile files(‘libs/xx.jar‘)
// 引用Maven。
releaseCompile ‘aaa:bbb:x.x.x‘}*/
VCS --> Enable Version Control Integration 。
VCS --> Checkout from Version Control ,选择服务器的版本控制工具,填写地址即可迁出。
在 Android Studio 起始页面也可以进行迁出。
点击 Checkout from Version Control,选择服务器的版本控制工具,填写地址即可迁出。
# coding = utf-8
‘‘‘
* @dec:Python model
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: 2015-05-21 23:38
‘‘‘
# coding = utf-8
‘‘‘
* @dec:
* @author: samy(hongfeiliuxing@qq.com)
* @datetime: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
‘‘‘
多渠道打包
8.4.1配置渠道
以友盟统计为例;
第一步 在AndroidManifest.xml里配置PlaceHolder:
第二步 在build.gradle设置productFlavors
以上两步即可。当然也有可视化的方法。
8.4.2打包
打包也有两种方式,命令行,和可视化界面的。
首先看命令行,在project的根目录下打开命令行。第一次运行的时候,可能会下载一些库文件。当全部打包完的时候,就在module的build文件下生成了相应的apk文件。
下面看可视化的方法。
全部选中。Finish。
区别:目前发现有个区别,不知道是不是我操作的问题,命令行打包的apk,是没有证书的,是需要重新签名的。而可视化的操作,是有证书的。
调试功能
先编译好要调试的程序。
1.设置断点
选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。
2.开启调试会话
点击红色箭头指向的小虫子,开始进入调试。
IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。
3.单步调试
3.1 step over
点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)
3.2 step into
点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:
在自定义方法发f1()处设置断点,执行调试
点击
3.3 Force step into
该按钮在调试的时候能进入任何方法。
3.4 step out
如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
3.5 Drop frame
点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。
4. 高级调试
4.1 跨断点调试
设置多个断点,开启调试。
想移动到下一个断点,点击如下图:
程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。
4.2 查看断点
点击箭头指向的按钮,可以查看你曾经设置过的断点并可设置断点的一些属性。
箭头1指向的是你曾经设置过的断点,箭头2可以设置条件断点(满足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
4.3 设置变量值
调试开始后,在红箭头指向的区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能可以更加快速的检测你的条件语句和循环语句。
点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。
4. 高级调试
4.1 跨断点调试
设置多个断点,开启调试。
想移动到下一个断点,点击如下图:
程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。
4.2 查看断点
点击箭头指向的按钮,可以查看你曾经设置过的断点并可设置断点的一些属性。
箭头1指向的是你曾经设置过的断点,箭头2可以设置条件断点(满足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
4.3 设置变量值
调试开始后,在红箭头指向的区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能可以更加快速的检测你的条件语句和循环语句。