cctanfujun / android-tips-tricks-cn
- среда, 15 марта 2017 г. в 03:18:47
震惊!这么多的安卓开发Tips
一些很不错的Android开发技巧,这个项目翻译自 android-tips-tricks 去掉了一些我认为不重要的,对我使用过的东东做了评价,同时翻译了一些自己没有注意到的知识点的文章。
欢迎协作
###了解你的工具
####Android Studio
使用快捷键
使用更有效率的插件
快捷键提示插件 -- 试用了一下,就是你点击的时候有些按钮会出来提示框告诉你这个的快捷键是什么以及你使用的次数,还不错,目的就是让你进行键盘流操作。
提供 Action 转换大小写什么的,感觉想不起来用。
Add Sort Lines action in Edit menu to sort selected lines or whole file if selection is empty.
静态代码审查工具
也是个代码审查工具,检查可能出现的bug
代码风格管理的插件
增加了例如卸载,重启App的功能
这个玩意挺NB的输入个大概就能帮你写代码。其中的bind view 挺好用的。
Dagger的可视化辅助工具
可以调试JVM的一些细节,讲真我用的不多
在 Android Studio 中使用 Live Templateso
newInstance
- 在Fragment中生成 newInstance
方法Toast
- 生成 Toast.makeText(context, "", Toast.LENGTH_SHORT).show();
fbc
- 生成 findViewByIdconst
- 定义一个 android style int 常量logd
- 生成 Log.d(TAG, "");
logm
- Log 当前方法名称和参数logr
- Log 当前方法结果logt
- 当前类生成 log tagpsf
- public static finalsout
- 打印一个字符串到 System.outsoutm
- 打印当前类名和方法到 System.outsoutp
- 打印方法参数和返回值到 System.outvisible
- 设置 view VISIBLEgone
- 设置 view GONEnoInstance
- private 构造方法Comprehensive list of all Live Templates in Android Studio 这个库有很多的自定义模版
Android Studio 的自动完成
Android Studio/IntelliJ 可以帮你自动完成一些代码
<expr>.null
转换成 if(<expr> == null)
<expr>.notnull
转换成 if(<expr> != null)
<expr>.var
转换成 T name = <expr>
<expr>.field
会自动生成一个全局变量 field = <expr>
<ArrayExpr>.for
转换成 for(T item : <Arrayexpr>)
<ArrayExpr>.fori
转换成 for(int i = 0; i < <Arrayexpr>.length; i++)
<ArrayExpr>.forr
转换成 for(int i = <Arrayexpr>.length - 1; i > 0 ; i--)
完整的转换列表参见 Settings → Editor → Postfix Templates
使用黑色主题
虽然是个人爱好,反正我觉得使用白色主题好瞎眼啊
别使用小字体
给你的 Android Studio 选择一个合适的字体,作者推荐使用Menlo font 反正我觉得mac的字体就挺好的,在linux上开发已经觉得不顺眼了.
使用一个 code style
你应该使用一个标准的编码风格,它可以是:
表示在编码风格这一块自己确实有待规范^^
使用 Memory/Network/CPU Monitor 检测你的 code/app
这个可以看下,文章提到的我是早就配置过了
####模拟器
####***Vysor***
简单说就是显示你连上的真机,也就在你做演示的时候有些用处,而且我一连上手机就自己跳出来,各位自己使用评价吧!
####***DeskDock***
不但能展示还可以控制你的Android设备.免费版本 可以使用电脑鼠标, 收费版本 可以使用电脑键盘. 你可以手不离开键盘进行测试.
###编码时候的更优选择
HttpUrlConnect 有一些bug quite some bugs. Okhttp 优雅的解决了他们. [Reference Link]
aar
[Stackoverflow Ref] dependencies {
compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
}
repositories{
flatDir{
dirs 'libs'
}
}
这个不错,不过我没找到一个命令参数表,就只关注我想要关注的 log
使用版本控制系统(VCS) 例如 Git
使用 ClassyShark
可以分析Android Apk很不错
Facebook 出品,非常不错的工具,可以在 Chrome 中看到网络请求,调试数据库和SharePreference,和 Okhttp搭配使用更好,我配合urlconnection使用不生效,原因不明。
使用"bugreport"分析耗电
总是使用固定的版本号 例如 "24.2.0"
版本依赖时候避免使用 +
这篇文章可以看一下,作者说在一些设备上 Timer 不工作但是原因不明,作者说的使用 Handler 替代 Timer 确实是对的,我们商店有一段时间anr很多,后来发现和Timer相关。
使用 Vectors 替代 PNG
如果你 确实 要用png, 可以使用 TinyPNG 压缩.
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
...
}
}
}
shrinkResources 是把你没用到的文件用一个很小的文件替换,我觉得要是你发现了那个文件确实没啥用,你还是删除了吧。
adb shell am kill
Gradle memory >= Dex memory + 1Gb
defaultConfig {
...
ndk {
abiFilters "armeabi", "armeabi-v7a", "mips", "x86"
}
}
//Split into platform dependent APK
splits {
abi {
enable true
reset()
include 'armeabi', 'armeabi-v7a', 'mips', 'x86' //select ABIs to build APKs for
universalApk false //generate an additional APK that contains all the ABIs
}
}
// map for the version code
project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'mips': 5, 'x86': 8]
// Rename with proper versioning
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) *
1000000 +
android.defaultConfig.versionCode
}
}
学习一些架构例如 MVP 或者 Clean架构
尝试理解 TDD (测试驱动开发)
强制重新下载 dependencies
./gradlew --refresh-dependencies
gradle 中跳过某个task
下面的例子是跳过 javaDoc
这个任务
./gradlew clean build -x javaDoc
为每个子项目的脚本配置同名 gradle 构建文件
settings.gradle 中设置
rootProject.children.each{
it.buildFileName = it.name + '.gradle'
}
记住 DRY
DRY = Do not Repeat Yourself
一开始我们也是按照层去分包的,很坑爹。按照功能分可能你不是很好区分在哪个功能中,不过也比你按照层区分要好找很多。
android {
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}
release {
// ...
}
}
}
build.gradle 中使用自定义任务
Android使用Gradle构建,这实际上可以很容易做些自动化的东西。实用的 Gradle 脚本
给你的Android项目使用合适的 .gitignore, Check it here
使用 Android Studio 2.3 加速 gradle 构建+
切换到 gradle 3.3
执行下面的代码升级你的 gradle wrapper
./gradlew wrapper --gradle-version 3.3 --distribution-type all
全局 gradle.properties
如下设置
android.enableBuildCache=true
这个命令我测试了,不好使啊!直接改wrapper里面引用就行。
停止 gradle 构建进程
./gradlew -stop
开启 gradle 自动下载sdk
全局gradle.properties
如下设置
android.builder.sdkDownload=true
实验性功能 [Bug Ref]
jcenter()
和 mavenCentral()
不用同时依赖`
JCenter 是 MavenCentral 的超集. [参考]
这样清除 gradle 缓存
~/.gradle/caches/
删除 cache
文件夹给你的 adb 设置别名 [Ref Link]
以下的 Aliases 可以被添加到 ~/.bashrc
或者 ~/.zshrc
,看起来不错
Alias | Usage |
---|---|
alias screenshot="adb exec-out screencap -p > screen-$(date -j "+%s").png" |
screenshot |
alias startintent="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell am start $1" |
startintent https://twitter.com/nisrulz |
alias apkinstall="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X install -r $1" |
apkinstall ~/Desktop/DemoApp.apk |
alias rmapp="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X uninstall $1" |
rmapp com.example.demoapp |
alias clearapp="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell pm clear $1" |
clearapp com.example.demoapp |
设置含有 //STOPSHIP
时候编译失败 [Ref Link]
启用这个功能 //STOPSHIP
失败功能, build.gradle
如下设置
android {
...
lintOptions {
abortOnError true
fatal 'StopShip'
}
}
//STOPSHIP
注释也会导致编译失败。
在 Android Studio
Preferences
>Editor
>Code Style
>Inspections
, 可以控制这个功能
使用 adb install -g
安装并授予manifest中的全部权限 [More Info]
使用 alfi
查找一个库的依赖
Gradle, Please 的命令行版本.
+ 执行
```bash
alfi name_of_library
```
+ 复制结果
+ 粘贴到 build.gradle
使用 dryrun
直接测试一个库
dryrun REMOTE_GIT_URL
表示还得下各种gradle版本,也就那么回事,不见得多快。
控制台直接输入单元测试结果 [Ref Link]
控制台输出单元测试结果小技巧.
android {
...
testOptions.unitTests.all {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
outputs.upToDateWhen { false }
showStandardStreams = true
}
}
}
离线模式编译更快 [Ref Link]
--offline
总是从cache运行, 离线模式不会访问网络.没有缓存会编译失败.
给你的Debug加速:
./gradlew assembleDevelopDebug --offline
给你的单元测试加速:
./gradlew test --offline
使用一个抽象 Logger 类
如果你想自动初始化你的库 Content Provider [Read how Firebase does it - Ref Link]
译文自动初始化你的库
"android:extractNativeLibs:false"
在 <application>
减小包体积 [Ref Link]这个属性是6.0开始的属性,告诉系统你不用把apk解压缩出来了,但是so不能被压缩,so 需要zipalign对齐,这个步骤不是自动的,我觉得慎用。
选择执行一个特定方法 [Ref Link]
你收到过Google Play 违反政策的邮件吗? 别担心给你的app生成隐私策略 [Ref ink]
###*** UI/UX 相关***
移动
排版
图标
水波纹
其他
###Tips 关于 Kotlin
Java 转 Kotlin 的 Cheatsheet.
###其他资源
关注 podcasts
这两个最为著名。
Android 专家的采访短视频。
关注 CodePath Android Cliffnotes
有关于各种主题的完整的 Android 资源,并且实时更新。
关注新的 Android 开发库
[Android Arsenal](https://android-arsenal.com/) - 和 Android 开发者相关的工具、库、app
关注 android example apps + Android Examples - 简单的 Android 例子。 + Google Samples - google 提供的多种 Android 例子 + Google Android Codelabs
Twitter上进行关注
Twitter 创建列表
Android开发视频
书签中加入这些网站
使用免费的 mockable api
订阅这些内容
ADB/Fastboot Tools made avaialble as a separate package by google, download latest version for
其他的一些优秀的开发工具
优秀的 android libraries
StorIO - SQLiteDatabase 和 ContentResolver 的优雅封装
Retrofit - Square 出品 NB 网络库
Picasso - 优秀的图片加载库
LeakCanary - 内存泄露检查工具
AndroidViewAnimations - 可爱的动画合集
Calligraphy - 最简单的自定义字体使用方法