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

配置keystore密码信息

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

  1. signingConfigs {
  2. release {
  3. storeFile file("myapp.keystore")
  4. storePassword "mystorepassword"
  5. keyAlias "mykeyAlias"
  6. keyPassword "mykeypassword"
  7. }
  8. } 

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

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

  1. KEYSTORE_PASSWORD=mystorepassword
  2. KEY_PASSWORD=mykeypassword

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

  1. signingConfigs {
  2. release {
  3. try {
  4. storeFile file("myapp.keystore")
  5. storePassword KEYSTORE_PASSWORD
  6. keyAlias "mykeyAlias"
  7. keyPassword KEY_PASSWORD
  8. }
  9. catch (ex) {
  10. throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
  11. }
  12. }
  13. } 

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

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

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

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

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

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

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

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

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

可以参考以下配置

  1. android {
  2. buildTypes {
  3. debug {
  4. applicationIdSuffix '.debug'
  5. versionNameSuffix '-DEBUG'
  6. }

  7. release {
  8. // ...
  9. }
  10. }
  11. }

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

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

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

  1. //定义build 时间
  2. def buildTime() {
  3. Date date = new Date()
  4. String build = date.format("yyMMddHHmm", TimeZone.getDefault())
  5. return build
  6. } 

2、然后再修改versionNameSuffix参数

  1. buildTypes {
  2. debug {
  3. //配置这包名后缀下可以同时安装release包和debug包
  4. applicationIdSuffix ".debug"
  5. //配置versionName后缀
  6. versionNameSuffix '_' + (buildTime()) + '-DEBUG'
  7. ...
  8. }
  9. release {
  10. ...
  11. }
  12. }

在debug包中定义了版本号

开发调试工具

Stetho

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

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

  1. dependencies {
  2. compile 'com.facebook.stetho:stetho:1.4.1'
  3. }

然后在Application里面初始化Stetho

  1. public class MyApplication extends Application {
  2. public void onCreate() {
  3. super.onCreate();
  4. Stetho.initializeWithDefaults(this);
  5. }
  6. }

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

  1. chrome://inspect/#devices 

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

查看设备

查看sqlite数据库

View Hierarchy

调试网络

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

  1. dependencies {
  2. compile 'com.facebook.stetho:stetho:1.4.1'
  3. compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
  4. compile 'com.facebook.stetho:stetho-urlconnection:1.4.1'
  5. }

对OkHttp2.x版本

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

对OkHttp3.x版本

  1. new OkHttpClient.Builder()
  2. .addNetworkInterceptor(new StethoInterceptor())
  3. .build(); 

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

网络抓包

LeakCanary

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

app/build.gradle

  1. dependencies {
  2. debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
  3. releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
  4. testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
  5. }

Application

  1. public class ExampleApplication extends Application {

  2. @Override public void onCreate() {
  3. super.onCreate();
  4. if (LeakCanary.isInAnalyzerProcess(this)) {
  5. // This process is dedicated to LeakCanary for heap analysis.
  6. // You should not init your app in this process.
  7. return;
  8. }
  9. LeakCanary.install(this);
  10. // Normal app init code...
  11. }
  12. } 

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

AS常用插件

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

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

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

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

  8. @Override public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.simple_activity);
  11. ButterKnife.bind(this);
  12. // TODO Use fields...
  13. }
  14. }

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

Android Butterknife Zelezny

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

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

so easy!


关注我们,可以获取更多

Android开发实践小结的更多相关文章

  1. Xamarin.Android开发实践(四)

    原文:Xamarin.Android开发实践(四) Xamarin.Android下获取与解析JSON 一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选 ...

  2. Android 开发实践 ViewGroup 实现左右滑出窗口(二)

    接上一篇 <Android 开发实践 ViewGroup 实现左右滑出窗口(一)http://www.cnblogs.com/inkheart0124/p/3532862.html> 源码 ...

  3. Android 开发实践 ViewGroup 实现左右滑出窗口(一)

    利用假期把以前做的东西总结整理一下,先从简单的开始吧.实现的效果是这样的:   做了个截屏动画,比例有点不对了,凑合着看吧. 整个窗口有3部分组成,中间的主界面是个列表,左边的滑出界面是个菜单,右边的 ...

  4. Xamarin.Android开发实践(五)

    原文:Xamarin.Android开发实践(五) 一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来 ...

  5. Xamarin.Android开发实践(三)

    原文:Xamarin.Android开发实践(三) 一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没 ...

  6. Xamarin.Android开发实践(二)

    原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ...

  7. Xamarin.Android开发实践(一)

    原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...

  8. Xamarin.Android开发实践(九)

    Xamarin.Android之ActionBar与菜单 一.选项卡 如今很多应用都会使用碎片以便在同一个活动中能够显示多个不同的视图.在 Android 3.0 以上的版本中,我们已经可以使用Act ...

  9. Android开发实践:Java层与Jni层的数组传递

    转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...

随机推荐

  1. ZIP:ZipFile

    ZipFile: /* 此类用于从 ZIP 文件读取条目 */ ZipFile(File file) :打开供阅读的 ZIP 文件,由指定的 File 对象给出. ZipFile(File file, ...

  2. jenkins +Jmeter 完成分布式性能测试

    1.Jmeter 压测机器配置. 下载Jmeter 版本:https://jmeter.apache.org/download_jmeter.cgi   我下的是5.1.1 将下载后的版本进行解压. ...

  3. Kafka producer拦截器(interceptor)

    Kafka producer拦截器(interceptor) 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制 ...

  4. C#3.0新增功能01 自动实现的属性

    连载目录    [已更新最新开发文章,点击查看详细] 在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁. 它们还允许客户端代码创建对象. 当你声明以 ...

  5. 月薪12k的零基础自学前端必备手册

    随着互联网的深入发展,前端开发工程师一跃成为市场上非常抢手的人才.很多同学,包括以前做UI的.Java的.或者对于IT完全零基础的同学都想学习前端.下图是网上流传甚广的一张前端学习思维导图,很多初学者 ...

  6. jsp数据交互(一).2

    01.什么是JSP内置对象(jsp核心)? Java 内置对象 Java  作用域 解析:jsp内置对象是web容器创建的一组对象.我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以 ...

  7. 【MySQL】Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and ...

    线上遇到这个问题,详细信息如下: SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8mb4_general_ci ...

  8. 【Android】System.exit(0) 退出程序

    许多 Android 应用程序都是连续点击两下返回键时退出程序,代码如下: private long exitTime = 0; @Override public boolean onKeyDown( ...

  9. Java基础之十五 泛型

    第十五章 泛型 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 在面对对象编程语言中,多态算是一种泛化机 ...

  10. .net core(c#)拟合圆测试

    说明 很多时候,我们需要运动物体的转弯半径去描述其机器性能.但在大多数的现实条件下,我们只能够获取到运动物体的 GPS 位置点集,并不能直接得到转弯半径或者圆心位置.为此,我们可以利用拟合圆的方式得到 ...