• 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;
    }

    }
      

      

  • 相关阅读:
    WebService的学习
    什么是事物
    数组和链表的区别
    JDK6和JDK7中的substring()方法
    为什么存储密码字符数组比字符串更合适?
    java中Queue简介
    java中队列Queue的使用
    HashMap、Hashtable、TreeMap的区别
    笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
    笔试算法题(35):最长递增子序列 & 判定一个字符串是否可由另一个字符串旋转得到
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/7152001.html
Copyright © 2020-2023  润新知