Android开发只在测试阶段添加测试库并在正式版本自动去掉测试库的方法

在实际的开发中,通常有这样一个需求,就是测试阶段需要添加一些测试库,正式版本阶段就去掉。下面拿leakcanary这个库来说明一下具体的实现方法:

  1. 在app下的build.gradle添加 debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.5.1  //重点是debugCompile,表示测试版本编译进去,正式版本不编译进去

  2. 在自定义的Application里面添加如下代码:

    if (BuildConfig.DEBUG) {
      Class<?> leakCanary = ReflectUtils.getReflectClass("com.squareup.leakcanary.LeakCanary");
      Object isInAnalyzerProcess = ReflectUtils.invokeMethod(leakCanary, "isInAnalyzerProcess", new Class[]{Context.class}, this);
      if (!(isInAnalyzerProcess instanceof Boolean && (Boolean) isInAnalyzerProcess)) {
        ReflectUtils.invokeMethod(leakCanary, "install", new Class[]{Application.class}, this);
      }
      //if (!com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(this)) {
        // com.squareup.leakcanary.LeakCanary.install(this);
      //}
    }

  //只有在debug版本阶段才会反射调用,因为只有在debug阶段才会把leakcanary这个库编译进来。

ReflectUtils全部代码如下:

public class ReflectUtils {

public static Object invokeMethod(String clazzName, String methodName, Class<?>[] argsTypes, Object... argsValue) {        return invokeMethod(getReflectClass(clazzName), methodName, argsTypes, argsValue);    }

public static Object invokeMethod(Class clazz, String methodName, Class<?>[] argsTypes, Object... argsValue) {        if (clazz == null) {            LogUtils.d("clazz == null in invokeMethod,clazz:" + clazz + ",methodName:" + methodName);            return null;        }        final Method method = getReflectMethod(clazz, methodName, argsTypes);        if (method == null) {            LogUtils.d("method == null in invokeMethod,clazz:" + clazz + ",methodName:" + methodName);            return null;        }        try {            return method.invoke(Modifier.isStatic(method.getModifiers()) ? null : clazz, argsValue);        } catch (IllegalAccessException e) {            e.printStackTrace();            LogUtils.d("method.invoke IllegalAccessException in invokeMethod,clazz:" + clazz + ",methodName:" + methodName);        } catch (InvocationTargetException e) {            e.printStackTrace();            LogUtils.d("method.invoke InvocationTargetException in invokeMethod,clazz:" + clazz + ",methodName:" + methodName);        }        return null;    }

public static Class<?> getReflectClass(String clazzName) {        try {            return Class.forName(clazzName);        } catch (ClassNotFoundException e) {            e.printStackTrace();            LogUtils.d("Class.forName ClassNotFoundException in getReflectClass,clazzName:" + clazzName);        }        return null;    }

public static Method getReflectMethod(Class clazz, String methodName, Class<?>[] argsTypes) {        try {            //Method method = clazz.getMethod(methodName, argsTypes);  //这行代码只能获取到public方法        Method method = clazz.getDeclaredMethod(methodName, argsTypes);            if (method != null && !Modifier.isPublic(method.getModifiers())) {//非public方法                method.setAccessible(true);            }            return method;        } catch (NoSuchMethodException e) {            e.printStackTrace();            LogUtils.d("clazz.getMethod NoSuchMethodException in getReflectMethod,clazz:" + clazz + ",methodName:" + methodName);        }        return null;    }

}
  

  

时间: 2024-10-31 17:38:34

Android开发只在测试阶段添加测试库并在正式版本自动去掉测试库的方法的相关文章

Android开发之向桌面添加快捷方式

对于一个希望拥有更多用户的应用来说,用户桌面可以说是所有软件的必争之地,如果用户在手机桌面上建立了该软件的快捷方式,用户将会更频繁地使用该软件.因此,所有 Android程序都应该允许用户把软件的快捷方式添加到桌面上. 在程序中把一个软件的快捷方式添加到桌面上,只需要如下三步即可: 1. 创建一个添加快捷方式的Intent该Intent的Action属性值应该为com.android.launcher.action.INSTALLSHORTCUT,. 2. 通过为该Intent加Extra属性来

Android开发,在Fragment中,隐藏或关闭软键盘(虚拟键盘)的方法

网上可以搜到各种方法,实际测试中,我的开发用机中,仅仅下面这个方法有效,记录一下. //隐藏虚拟键盘      public static void HideKeyboard(View v)      {          InputMethodManager imm = ( InputMethodManager ) v.getContext( ).getSystemService( Context.INPUT_METHOD_SERVICE );             if ( imm.isA

Android开发中怎样用多进程、用多进程的好处、多进程的缺陷、解决方法(转)

转自:http://blog.csdn.net/spencer_hale/article/details/54968092 1.怎样用多进程 Android多进程概念:一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名.我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的 资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的. 如何让自己的应用拥有多个进程: 四大组件在AndroidManifest文件中注册的时候,有个属性android:process

Android开发技术周报 Issue#64

教程 AndroidFlux-异步请求和网络 在移动开发中,异步网络操作必不可少,本篇着重介绍在Flux模式中如何处理异步操作的问题,并深入一些细节,比如如何在异步操作时显示异步状态.另外,网络操作仅仅是异步操作的一种,最后扩展ActionCreator的语义来处理更多的业务逻辑. Tricking Android MemoryFile MemoryFile是android在最开始就引入的一套框架,其内部实际上是封装了android特有的内存共享机制Ashmem匿名共享内存,简单来说,Ashme

Android开发App工程结构搭建

本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的.      从艺术的角度看,其实我们是在追求一种美. 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板.      1. 微盘      2. 久忆日记      3.网易新

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

android开发常识(转)

转载于:http://blog.sina.cn/dpool/blog/s/blog_6c234ba90100wj1t.html 如何成为高手?成为一名真正的Android高手必须掌握和遵循的一些准则:1)学会懒惰 aDon't Reinvent the Wheel(不要重复发明轮子). bInventing the Wheel(发明轮子). cDon't Reinvent the Wheel(不要重复发明轮子). “轮子理论”,也即“不要重复发明轮子”,这是西方国家的一句谚语,原话是:Don't

iOS开发和Android开发的相似之处

最近比较闲,以前也有相对安卓了解的想法,所以最近看了点关于安卓的东西,发现只要iOS以后,安卓开发学的也会比较快. 安卓开发教程比较多,开发环境在mac上配置也比较简单,所以无论安装eclipse搞开发还是Android studio都比较容易,无非是JDK+ADT,建议安装个GM安卓模拟器,速度比自带模拟器快多了. 拖控件跟storyboard一样一样的 接下来就是第一步,hello world,使用Android studio后,系统会自动创建一个activity,类似iOS的根视图控制器.

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener