Android学习系列(42)--Android Studio实战技巧
使用android studio开发项目的一些问题,功能和技巧。
1. 环境
Mac OSX 10.9.5 + Android Studio 0.8.9
2. gradle项目加载超慢
这是因为gradle官方下载地址特别慢导致,解决方案有2个:
VPN,干净利索。
[推荐VPN](http://a.wy002.com/34750)
拷贝一个gradle的已下载的压缩包到gradle目录的wrapper路径下,然后关闭Android Studio在打开,它会自动识别并解压好。
第二种方案,具体以Mac为例子,Android Studio 0.8.9默认使用的gradle版本还是gradle-1.12。
下载gradle-1.12-all.zip,放到~/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo,这个2apkk7d25miauqf1pdjp1bm0uo是随机生成的标识码,各人可能不一样。
效果图。
gradle-1.12-all.zip我上传了一个到百度云盘。
[下载gradle-1.12-all.zip](http://pan.baidu.com/s/1i3zeQUh)
linux的gradle的目录和mac上一样,Windows是在你的用户目录下。
3. Android Studio添加引用第三方Library
右键Module - Open Module Settings - Dependencies, 找到"+"按钮,选择Library dependency,弹出对话框,
选中support-annotations,
它会在Module下的build.gradle中的dependencies添加一行:
compile 'com.android.support:support-annotations:20.0.0'
4. 默认编译的应用版本选择
当你点击那个右三角运行按钮的时候,它默认是会运行debug版本,其实这里可以调整为默认编译release版本,当然这点上可能对你不是很重要。
但是当你定义了各种版本,并且想区别开发,这就很有用了。
在左下角 - Build Variants - 选择默认版本。
5. 显示行号
Setings - Editor - Appearance - 勾选Show line numbers
6. 快捷键
这个网上有很多资料,而且在设置里面可以选择自己习惯的Keymap,比如eclipse,这里点到为止。
列举几个参考链接:
http://www.developerphil.com/android-studio-tips-of-the-day-roundup-1/
http://www.developerphil.com/android-studio-tips-of-the-day-roundup-2/
7. 插件
Settings - Plugins - Browser repositories - 弹出对话框 - 选中某一插件 - 右边Install plugin。
比如,安装.gigignore support,提示需要重启,重启后查看.gitigore由之前的黑白变的有高亮效果了,还有其他功能,在插件介绍中都有详细说明。
关于一些好的插件的推荐,可以单开一篇博客了,在此不赘述。
8. 多版本编译
原理
采用动态替换渠道字符串的方式,生成各渠道的AndroidManifest.xml文件并打包。
说明:参考自友盟umeng-muti-channel-build-tool/Gradle,并实际项目验证OK。
关键代码
//替换AndroidManifest.xml的REPLACE_KEY字符串为渠道名称
android.applicationVariants.all{ variant ->
variant.processManifest.doLast{
//v1.11之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
//${buildDir}是指build文件夹
//${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
//下面的路径是类似这样:build/intermediates/manifests/GooglePlay/release/AndroidManifest.xml
def manifestFile = "${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml"
//将字符串REPLACE_KEY替换成flavor的名字
def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("REPLACE_KEY", "${variant.productFlavors[0].name}")
new File(manifestFile).write(updatedContent, 'UTF-8')
//将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
variant.processResources.manifestFile = file("${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml")
}
}
具体步骤
- AndroidManifest.xml中添加渠道meta
<application
android:label="@string/app_name">
<meta-data android:name="APP_PID" android:value="default" />
<activity
android:name="com.jayfeng.xxx"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
- 完整的build.gradle
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion '19.1'
defaultConfig {
applicationId 'com.jayfeng.app.test'
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName 'V1.0'
}
signingConfigs {
myConfig {
storeFile file("xxxxxx.keystore")
storePassword "xxxxxxx"
keyAlias "xxxxx"
keyPassword "xxxxxx"
}
}
buildTypes {
release {
signingConfig signingConfigs.myConfig
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
"default" {}
google {}
"91" {}
hiapk {}
gfan {}
goapk {}
appChina {}
mumayi {}
eoe {}
nduo {}
feiliu {}
crossmo {}
huawei {}
QQ {}
"3G" {}
"360" {}
baidu {}
sohu {}
"163" {}
UC {}
dangle {}
samsung {}
mmw {}
xiaomi {}
lenovo {}
nearme {}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':mblog')
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
//替换AndroidManifest.xml的default字符串为渠道名称
android.applicationVariants.all{ variant ->
variant.processManifest.doLast{
//之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
//${buildDir}是指build文件夹
//${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
//下面的路径是类似这样:build/manifests/GooglePlay/release/AndroidManifest.xml
def manifestFile = "${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml"
//将字符串default替换成flavor的名字
def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("default", "${variant.productFlavors[0].name}")
new File(manifestFile).write(updatedContent, 'UTF-8')
//将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
variant.processResources.manifestFile = file("${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml")
}
}
9. 小结
Android Studio作为新的开发工具,需要不断的探索才能更好的使用,才能发挥出它远胜eclipse的强大!
Android学习系列(42)--Android Studio实战技巧的更多相关文章
- Android学习系列(38)--Android源码下载和编译
前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...
- 【转】Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- Android学习系列(40)--Android主题和样式之系统篇(下)
11)Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> & ...
- Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- Android学习系列(41)--Android Studio简单使用
1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-g ...
- Android学习系列(7)--App轮询服务器消息
这篇文章是android开发人员的必备知识. 1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务. 其中需要注意轮询的频率 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- Android学习系列(23)--App主界面实现
在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...
- Android学习系列(17)--App列表之圆角ListView(续)
http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)- ...
随机推荐
- FZU 2165 v11(最小重复覆盖)+ codeforces 417D Cunning Gena
告诉你若干个(<=100)武器的花费以及武器能消灭的怪物编号,问消灭所有怪物(<=100)的最小花费...当然每个武器可以无限次使用,不然这题就太水了╮(╯▽╰)╭ 这题当时比赛的时候连题 ...
- C# 总复习
1.循环语句 四要素:初始条件.循环条件.循环体.状态改变 循环的最后一句:循环条件不再满足 2. ++ --int a = 5; //在赋值语句中,后++需要,先进性赋值,然后进行+1运算 ...
- EF的各种删除方法
//2.1检查 id 是否存在 //2.2执行删除 Models.Student stu = new Models.Student() { Id = id }; //db.Students.Attac ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- linux下U盘文件只读的解决办法
. 在终端运行如下命令 tail -f /var/log/syslog . 插入有只读文件系统故障的U盘 . 观察命令行输出 输出局部如下: Jul :: cslouis-pc kernel: [15 ...
- 关于内存管理/set/get方法
MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...
- NYOJ题目822画图
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAAHzCAIAAABgzHaKAAAgAElEQVR4nO3dPVLjzBoG0LsJ514IsR
- 1.1-java创建包和类的方法
1.new-package-命名方法com打头.中间名称.后台要创建的class 2.创建class- new-class 选择一下主方法 代码示例 编译完保存一下就能输出信息,一直没有保存才 ...
- Hibernate中一对多和多对一关系
1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...
- 【PHP绘图技术&&验证码绘制】
PHP绘图是比较简单的事情,基本绘图如直线.圆.矩形.弧线.填充矩形.填充扇形.非中文字的打印.中文文字的打印在在下面的代码中会纤细讲解. 需要支持中文的字体,可以到windows自带的字体库中找,并 ...