作为一名搬运工,应该懂得避免重复创建轮子。

配置keystore密码信息

通常在app/build.gradle中我们会使用以下方式配置:

signingConfigs {
release {
storeFile file("myapp.keystore")
storePassword "mystorepassword"
keyAlias "mykeyAlias"
keyPassword "mykeypassword"
}

但这种方法不是特别好,因为如果你把代码分享到github,你的密码就泄露了。

推荐的做法应该是在Androd项目中gradle.properties(如果没有则手动创建一个)文件中创建以下变量,这个文件是不会被版本控制系统提交的,所以不用担心密码泄露。

KEYSTORE_PASSWORD=mystorepassword
KEY_PASSWORD=mykeypassword

那么在app/build.gradle中的配置就应该是

signingConfigs {
release {
try {
storeFile file("myapp.keystore")
storePassword KEYSTORE_PASSWORD
keyAlias "mykeyAlias"
keyPassword KEY_PASSWORD
}
catch (ex) {
throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
}
}

这里在打包的时候,如果没有在gradle.properties配置相关变量,那么就会在messages窗口中提示

Error:(16, 0) You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.

包引用尽可能使用dependency而不是直接导入jar包

dependencies {
compile 'com.squareup.retrofit2:retrofit:2.1.0'
}

以下方式也是不推荐使用的

dependencies {
compile 'com.squareup.retrofit2:retrofit:2.1.0+'
}

这种方式每次编译时都会去联网检测最新的包,影响性能,还可能会下载跟你不符合需求的jar包。

为release版本和debug版本指定不同的包名

同一个应用而不同的包名可以同时安装在同一个手机里面。

可以参考以下配置

android {
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}

release {
// ...
}
}
}

分别为包名和版本号加上debugDEBUG后缀。

如果想要在版本号添加时间信息,有利于区分,可以这样处理:

1、首先在app/build.gralde中定义一个buildTime()函数

//定义build 时间
def buildTime() {
Date date = new Date()
String build = date.format("yyMMddHHmm", TimeZone.getDefault())
return build

2、然后再修改versionNameSuffix参数

buildTypes {
debug {
//配置这包名后缀下可以同时安装release包和debug包
applicationIdSuffix ".debug"
//配置versionName后缀
versionNameSuffix '_' + (buildTime()) + '-DEBUG'
...
}
release {
...
}
}

在debug包中定义了版本号

开发调试工具

Stetho

Stetho是facebook开源的Android调试工具,可以使用Chrome开发工具来对Android应用进行调试、抓包、查看Sqlite数据库等功能。可以在debug版本中集成Stetho,方便开发调试。

集成Stetho也是非常简单,只需要在app/build.gradle中配置

dependencies {
compile 'com.facebook.stetho:stetho:1.4.1'
}

然后在Application里面初始化Stetho

public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
}
}

这样就配置好了,AS连接手机跑起来后。打开Chrome,在地址栏输入

chrome://inspect/#devices 

这时候就看到手机调试的信息

查看设备

查看sqlite数据库

View Hierarchy

调试网络

目前Steho支持okhttp网络库,同样的在gradle里面配置

dependencies {
compile 'com.facebook.stetho:stetho:1.4.1'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
compile 'com.facebook.stetho:stetho-urlconnection:1.4.1'
}

对OkHttp2.x版本

OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());

对OkHttp3.x版本

new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.build(); 

对于其他网络需要修改Stetho现在还没有支持,如果是HttpURLConnection,可以使用StethoURLConnectionManager来集成,详情可以参考Steho官网。

网络抓包

LeakCanary

LeakCanary可以在应用运行时检测应用是否有OOM风险的一个工具库。同样的可只在debug版本中集成。

app/build.gradle

dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}

Application

public class ExampleApplication extends Application {

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}

这样就配置好了。连接手机AS跑完后就会在手机桌面上生成一个LeakCanary图标,点击进入可以方便查看变量在内存中的引用链。如果LeakCanary检测到有内存泄露,也会发送一个通知栏消息来提醒。

AS常用插件

很多App都会使用UI注解框架来初始化UI控件其中最有名的估计就是ButterKnife了。

class ExampleActivity extends Activity {
@BindView(R.id.user) EditText username;
@BindView(R.id.pass) EditText password;

@BindString(R.string.login_error) String loginErrorMessage;

@OnClick(R.id.submit) void submit() {
// TODO call server...
}

@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}

但是经常写@BindView也是一件令人枯燥和烦恼的事情。

Android Butterknife Zelezny

这个插件可以极大的解放程序猿的双手,提高搬砖效率。

安装好插件后,把光标定位到layout文件的引用处,例如setContentView(R.layout.simple_activity);R.layout.simple_activity末尾处,按下快捷键command+N(windows是Altt+Insert)将弹出以下对话框。

so easy!


关注我们,可以获取更多

最新文章

  1. 【JUC】JUC线程池框架综述
  2. 第27章 java I/O输入输出流
  3. Android深度探索--HAL与驱动开发----第十章读书笔记
  4. 【HOG】
  5. C#里Attribute属性
  6. Android 使用全局变量传递数据
  7. oracle connect by 和start with
  8. Jquery autocomplete 插件使用
  9. 判断包含字符String.contains
  10. [计算机基础]HTTP协议学习笔记
  11. Java集合框架学习
  12. flutter图片铺满父框
  13. POJ 2418 Hardwood Species 【Trie树】
  14. JVM-即时编译JIT
  15. linux-centos下持续集成工具jenkins部署使用教程
  16. 解题:USACO12FEB Nearby Cows
  17. 类的专有方法(__del__)
  18. centos6.5的软件安装,用户管理等
  19. Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令
  20. 【C】数据类型和打印(print)

热门文章

  1. Web前端三大框架_vue源码笔记
  2. VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法 及添加方法
  3. vim 复制大块内容。 y,p(是单个y,而不是yy)
  4. [HAOI2006]聪明的猴子 题解
  5. 哥们,B/S了解吗?——啥玩意,我是敲代码的
  6. c语言的strcpy函数
  7. IT技术人员的自我修养
  8. AQS原理浅析
  9. Calico 网络通信原理揭秘
  10. python的enumerate lambda isinstance filter函数