Android開發只在測試階段添加測試庫並在正式版本自動去掉測試庫的方法

來源:互聯網
上載者:User

標籤:utils   pre   ctc   stat   static   conf   analyzer   ring   except   

在實際的開發中,通常有這樣一個需求,就是測試階段需要添加一些測試庫,正式版本階段就去掉。下面拿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;
}

}
  

  

Android開發只在測試階段添加測試庫並在正式版本自動去掉測試庫的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.