在测试和正式构建中使用不同的包名

1
2
3
4
5
6
7
8
9
10
11
12
android {
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}
release {
// ...
}
}
}

强制重新下载依赖库

1
./gradlew --refresh-dependencies

停止运行 gradle 构建进行

1
./gradlew -stop

使用 dryrun 直接运行项目

只需要运行 dryrun REMOTE_GIT_URL

使用一个抽象的 Logger 类

1
https://github.com/imuhao/android-tips-tricks/blob/develop/Logger.java

使用一个代码样式
你应该使用一个标准的代码样式
AOSP Codestyle
Square IntelliJ Codestyle

使用 Android Studio 内置的控制台
Working with Embedded Local Terminal

使用 Android Studoi 中的Memory/Network/CPU Monitor 提升你 App 性能
配置 Android Studio

在 Android Studio 中直接运行一个方法

在build.gradle 中定义一个编译时期的变量

1
2
3
4
5
6
7
8
9
10
android{
defaultConfig {
...
buildConfigField "String", "SERVER_ENDPOINT", '"http://www.myendpoint.com"'
buildConfigField "int", "FOO", "52"
buildConfigField "boolean", "LOG", "false"
...
}
}
在代码中使用它BuildConfig.SERVER_ENDPOINT,BuildConfig.SERVER_ENDPOINT

基于 git 信息,自动的计算版本名和版本号

在你的app 的 build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Version code is calculated as the number of commits from last commit on master
def getVersionCode = { ->
try {
def code = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-list', 'HEAD', '--count'
standardOutput = code
}
return Integer.parseInt(code.toString().trim())
} catch (exception) {
return "1";
}
}
// Version name is Last Tag Name + No. of commits form last Tag + short git sha
def getVersionName = { ->
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--tags', '--dirty'
standardOutput = stdout
}
return stdout.toString().trim()
} catch (exception) {
return "0.0.0.1";
}
}
// Use
android{
defaultConfig {
...
versionCode getVersionCode()
versionName getVersionName()
...
}
}

在 build.gradle中得到一个构建时间的变量

1
2
3
4
5
6
7
8
9
10
11
12
// Get the date of build
def getDateOfBuild = { -> // ISO 8601 time format
return new Date().format("yyyy-MM-dd'T'HH:mm'Z'").toString().trim()
}
// then use it as a variable in BuildConfig
android{
defaultConfig {
...
buildConfigField "String", "DATE_OF_BUILD", "\"${getDateOfBuild()}\""
}
}

使用Bettert Historian
分析 Android 手机的电池状态

使用 Proguard

学习一些像 MVP 这样的架构或代码简洁

Activity 生命周期

根据资源的名称动态的获取资源

1
getResources().getIdentifier(String name, String defType, String defPackage)

解析 html 富文本供 TextView 显示

1
Html.fromHtml()

格式化文件大小显示

1
Formatter.formatFileSize(Context context, long sizeBytes)

调用 View 点击事件

1
view.performClick()

禁止窗口截屏

1
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

拦截 Back 键,使 App 进入后台而不是关闭

1
2
3
4
5
6
@Override
public void onBackPressed() {
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(launcherIntent);
}

缩略图工具类

1
2
3
ThumbnailUtils
createVideoThumbnail(String filePath, int kind)
extractThumbnail(Bitmap source, int width, int height)