• 腾讯bugly 映射用法


      1 package com.tencent.bugly.agent;
      2 
      3 import android.app.Activity;
      4 import android.content.Context;
      5 import android.os.Handler;
      6 import android.os.Looper;
      7 import android.os.Process;
      8 import android.text.TextUtils;
      9 import android.util.Log;
     10 import java.lang.ref.WeakReference;
     11 import java.lang.reflect.Constructor;
     12 import java.lang.reflect.Field;
     13 import java.lang.reflect.InvocationTargetException;
     14 import java.lang.reflect.Method;
     15 import java.util.Locale;
     16 
     17 public class GameAgent
     18 {
     19   private static final String VERSION = "2.0";
     20   private static final String LOG_TAG = "CrashReport-GameAgent";
     21   private static final int GAME_TYPE_COCOS = 1;
     22   private static final int GAME_TYPE_UNITY = 2;
     23   private static final int LOG_LEVEL_VERBOSE = 0;
     24   private static final int LOG_LEVEL_DEBUG = 1;
     25   private static final int LOG_LEVEL_INFO = 2;
     26   private static final int LOG_LEVEL_WARN = 3;
     27   private static final int LOG_LEVEL_ERROR = 4;
     28   private static final int TYPE_U3D_CRASH = 4;
     29   private static final int TYPE_COCOS2DX_JS_CRASH = 5;
     30   private static final int TYPE_COCOS2DX_LUA_CRASH = 6;
     31   private static final String STRATEGY_CLASS_SUFFIX = "BuglyStrategy";
     32   private static final String OLD_STRATEGY_CLASS_SUFFIX = "crashreport.CrashReport$UserStrategy";
     33   private static final String CRASH_REPORT_CLASS_SUFFIX = "crashreport.CrashReport";
     34   private static final String CLASS_UNITY_PLAYER = "com.unity3d.player.UnityPlayer";
     35   private static final String CLASS_COCOS_ACTIVITY = "org.cocos2dx.lib.Cocos2dxActivity";
     36   private static String sdkPackageName = "com.tencent.bugly";
     37   private static Handler sHandler = null;
     38   private static String sAppVersion = null;
     39   private static String sAppChannel = null;
     40   private static String sUserId = null;
     41   private static boolean sIsDebug = false;
     42   private static int sGameType = 0;
     43   private static WeakReference<Activity> sContext = null;
     44 
     45   public static String getVersion()
     46   {
     47     return "2.0";
     48   }
     49 
     50   public static void printLog(String paramString)
     51   {
     52     if (TextUtils.isEmpty(paramString)) {
     53       return;
     54     }
     55     if (paramString.startsWith("<Log>"))
     56       printLog(2, paramString);
     57     else if (paramString.startsWith("<LogDebug>"))
     58       printLog(1, paramString);
     59     else if (paramString.startsWith("<LogInfo>"))
     60       printLog(2, paramString);
     61     else if (paramString.startsWith("<LogWarning>"))
     62       printLog(3, paramString);
     63     else if (paramString.startsWith("<LogAssert>"))
     64       printLog(3, paramString);
     65     else if (paramString.startsWith("<LogError>"))
     66       printLog(4, paramString);
     67     else if (paramString.startsWith("<LogException>"))
     68       printLog(4, paramString);
     69     else
     70       printLog(0, paramString);
     71   }
     72 
     73   private static void printLog(int paramInt, String paramString)
     74   {
     75     setLog(paramInt, "CrashReport-GameAgent", paramString);
     76   }
     77 
     78   public static Activity getUnityActivity()
     79   {
     80     try
     81     {
     82       Object localObject = Reflection.getStaticField("com.unity3d.player.UnityPlayer", "currentActivity", null);
     83       if ((localObject != null) && ((localObject instanceof Activity)))
     84         return (Activity)localObject;
     85     }
     86     catch (Exception localException) {
     87       Log.w("CrashReport-GameAgent", "Failed to get the current activity from UnityPlayer");
     88       localException.printStackTrace();
     89     }
     90 
     91     return null;
     92   }
     93 
     94   public static Activity getCocosActivity()
     95   {
     96     try
     97     {
     98       Object localObject = Reflection.invokeStaticMethod("org.cocos2dx.lib.Cocos2dxActivity", "getContext", null, new Class[0]);
     99       if ((localObject != null) && ((localObject instanceof Activity)))
    100         return (Activity)localObject;
    101     }
    102     catch (Exception localException) {
    103       Log.w("CrashReport-GameAgent", "Failed to get the current activity from UnityPlayer");
    104       localException.printStackTrace();
    105     }
    106 
    107     return null;
    108   }
    109 
    110   private static Activity getActivity() {
    111     Activity localActivity = null;
    112     if ((sContext != null) && (sContext.get() != null)) {
    113       return (Activity)sContext.get();
    114     }
    115     switch (sGameType) {
    116     case 1:
    117       localActivity = getCocosActivity();
    118       break;
    119     case 2:
    120       localActivity = getUnityActivity();
    121       break;
    122     default:
    123       Log.w("CrashReport-GameAgent", "Game type has not been set.");
    124     }
    125 
    126     return localActivity;
    127   }
    128 
    129   private static Context getApplicationContext() {
    130     Activity localActivity = getActivity();
    131     if (localActivity != null) {
    132       return localActivity.getApplicationContext();
    133     }
    134     return null;
    135   }
    136 
    137   private static void runTaskInUiThread(Runnable paramRunnable) {
    138     Activity localActivity = getActivity();
    139     if (localActivity != null)
    140       localActivity.runOnUiThread(paramRunnable);
    141     else
    142       new Thread(paramRunnable).start();
    143   }
    144 
    145   private static void exitApplication()
    146   {
    147     int i = Process.myPid();
    148     printLog(3, String.format(Locale.US, "Exit application by kill process[%d]", new Object[] { Integer.valueOf(i) }));
    149 
    150     Process.killProcess(i);
    151   }
    152 
    153   private static void delayExit(long paramLong)
    154   {
    155     paramLong = Math.max(0L, paramLong);
    156 
    157     if (sHandler != null) {
    158       sHandler.postDelayed(new Runnable()
    159       {
    160         public void run() {
    161           GameAgent.access$200();
    162         }
    163       }
    164       , paramLong);
    165     }
    166     else
    167     {
    168       try
    169       {
    170         Thread.sleep(paramLong);
    171         exitApplication();
    172       } catch (InterruptedException localInterruptedException) {
    173         localInterruptedException.printStackTrace();
    174       }
    175     }
    176   }
    177 
    178   private static String convertToCanonicalName(String paramString)
    179   {
    180     StringBuilder localStringBuilder = new StringBuilder();
    181     if (sdkPackageName == null) {
    182       sdkPackageName = "com.tencent.bugly";
    183     }
    184     localStringBuilder.append(sdkPackageName);
    185     localStringBuilder.append(".");
    186     localStringBuilder.append(paramString);
    187     return localStringBuilder.toString();
    188   }
    189 
    190   public static void setSdkPackageName(String paramString)
    191   {
    192     if (TextUtils.isEmpty(paramString)) {
    193       return;
    194     }
    195     sdkPackageName = paramString;
    196   }
    197 
    198   public static void setGameType(int paramInt) {
    199     sGameType = paramInt;
    200   }
    201 
    202   public static void setLogEnable(boolean paramBoolean)
    203   {
    204     sIsDebug = paramBoolean;
    205   }
    206 
    207   private static Object newStrategy(Context paramContext, String paramString1, String paramString2, long paramLong)
    208   {
    209     if ((paramContext == null) || ((TextUtils.isEmpty(paramString1)) && (TextUtils.isEmpty(paramString2)))) {
    210       return null;
    211     }
    212     Object localObject = Reflection.newInstance(convertToCanonicalName("crashreport.CrashReport$UserStrategy"), new Object[] { paramContext }, new Class[] { Context.class });
    213 
    214     if (localObject != null) {
    215       try {
    216         Class localClass = Class.forName(convertToCanonicalName("BuglyStrategy"));
    217         Method localMethod1 = localClass.getDeclaredMethod("setAppChannel", new Class[] { String.class });
    218         localMethod1.invoke(localObject, new Object[] { paramString1 });
    219 
    220         Method localMethod2 = localClass.getDeclaredMethod("setAppVersion", new Class[] { String.class });
    221         localMethod2.invoke(localObject, new Object[] { paramString2 });
    222 
    223         Method localMethod3 = localClass.getDeclaredMethod("setAppReportDelay", new Class[] { Long.TYPE });
    224         localMethod3.invoke(localObject, new Object[] { Long.valueOf(paramLong) });
    225 
    226         return localObject;
    227       } catch (NoSuchMethodException localNoSuchMethodException) {
    228         localNoSuchMethodException.printStackTrace();
    229       } catch (IllegalAccessException localIllegalAccessException) {
    230         localIllegalAccessException.printStackTrace();
    231       } catch (IllegalArgumentException localIllegalArgumentException) {
    232         localIllegalArgumentException.printStackTrace();
    233       } catch (InvocationTargetException localInvocationTargetException) {
    234         localInvocationTargetException.printStackTrace();
    235       } catch (Exception localException) {
    236         localException.printStackTrace();
    237       }
    238     }
    239     return null;
    240   }
    241 
    242   public static void initCrashReport(String paramString, boolean paramBoolean) {
    243     setLogEnable(paramBoolean);
    244     initCrashReport(paramString, sAppChannel, sAppVersion, sUserId, 0L);
    245   }
    246 
    247   private static void initCrashReport(final String paramString1, String paramString2, String paramString3, final String paramString4, long paramLong)
    248   {
    249     final Context localContext = getApplicationContext();
    250     if (localContext == null) {
    251       printLog(4, "Context is null. bugly initialize terminated.");
    252       return;
    253     }
    254     if (TextUtils.isEmpty(paramString1)) {
    255       printLog(4, "Please input appid when initCrashReport.");
    256       return;
    257     }
    258     sHandler = new Handler(Looper.getMainLooper());
    259     Object localObject = newStrategy(localContext, paramString2, paramString3, paramLong);
    260     runTaskInUiThread(new Runnable()
    261     {
    262       public void run()
    263       {
    264         int i = 0;
    265         boolean bool = GameAgent.sIsDebug;
    266         if (this.val$strategy != null) {
    267           Class localClass = null;
    268           try {
    269             localClass = Class.forName(GameAgent.convertToCanonicalName("crashreport.CrashReport$UserStrategy"));
    270           } catch (ClassNotFoundException localClassNotFoundException) {
    271             localClassNotFoundException.printStackTrace();
    272           } catch (Exception localException) {
    273             localException.printStackTrace();
    274           }
    275           if (localClass != null) {
    276             GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "initCrashReport", new Object[] { localContext, paramString1, Boolean.valueOf(bool), this.val$strategy }, new Class[] { Context.class, String.class, Boolean.TYPE, localClass });
    277 
    278             i = 1;
    279           }
    280         }
    281 
    282         if (i == 0) {
    283           GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "initCrashReport", new Object[] { localContext, paramString1, Boolean.valueOf(bool) }, new Class[] { Context.class, String.class, Boolean.TYPE });
    284         }
    285 
    286         GameAgent.setUserId(paramString4);
    287       }
    288     });
    289   }
    290 
    291   public static void setAppVersion(String paramString)
    292   {
    293     if (TextUtils.isEmpty(paramString)) {
    294       return;
    295     }
    296     sAppVersion = paramString;
    297     runTaskInUiThread(new Runnable()
    298     {
    299       public void run() {
    300         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "setAppVersion", new Object[] { GameAgent.access$600(), this.val$version }, new Class[] { Context.class, String.class });
    301       }
    302     });
    303   }
    304 
    305   public static void setAppChannel(String paramString)
    306   {
    307     if (TextUtils.isEmpty(paramString)) {
    308       return;
    309     }
    310     sAppChannel = paramString;
    311     runTaskInUiThread(new Runnable()
    312     {
    313       public void run() {
    314         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "setAppChannel", new Object[] { GameAgent.access$600(), this.val$channel }, new Class[] { Context.class, String.class });
    315       }
    316     });
    317   }
    318 
    319   public static void setUserId(String paramString)
    320   {
    321     if (TextUtils.isEmpty(paramString)) {
    322       return;
    323     }
    324     sUserId = paramString;
    325     runTaskInUiThread(new Runnable()
    326     {
    327       public void run() {
    328         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "setUserId", new Object[] { GameAgent.access$600(), this.val$userId }, new Class[] { Context.class, String.class });
    329       }
    330     });
    331   }
    332 
    333   public static void setUserSceneTag(int paramInt)
    334   {
    335     runTaskInUiThread(new Runnable()
    336     {
    337       public void run() {
    338         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "setUserSceneTag", new Object[] { GameAgent.access$600(), Integer.valueOf(this.val$sceneId) }, new Class[] { Context.class, Integer.TYPE });
    339       }
    340     });
    341   }
    342 
    343   public static void putUserData(String paramString1, final String paramString2)
    344   {
    345     if ((TextUtils.isEmpty(paramString1)) || (TextUtils.isEmpty(paramString2))) {
    346       return;
    347     }
    348     runTaskInUiThread(new Runnable()
    349     {
    350       public void run() {
    351         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "putUserData", new Object[] { GameAgent.access$600(), this.val$key, paramString2 }, new Class[] { Context.class, String.class, String.class });
    352       }
    353     });
    354   }
    355 
    356   public static void removeUserData(String paramString)
    357   {
    358     if (TextUtils.isEmpty(paramString)) {
    359       return;
    360     }
    361     runTaskInUiThread(new Runnable()
    362     {
    363       public void run() {
    364         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "removeUserData", new Object[] { GameAgent.access$600(), this.val$key }, new Class[] { Context.class, String.class });
    365       }
    366     });
    367   }
    368 
    369   public static void setSdkConfig(String paramString1, final String paramString2)
    370   {
    371     if ((TextUtils.isEmpty(paramString1)) || (TextUtils.isEmpty(paramString2))) {
    372       return;
    373     }
    374     runTaskInUiThread(new Runnable()
    375     {
    376       public void run() {
    377         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.CrashReport"), "putSdkData", new Object[] { GameAgent.access$600(), "SDK_" + this.val$key, paramString2 }, new Class[] { Context.class, String.class, String.class });
    378       }
    379     });
    380   }
    381 
    382   public static void setLog(int paramInt, final String paramString1, final String paramString2)
    383   {
    384     if (TextUtils.isEmpty(paramString1))
    385       return;
    386     String str;
    387     switch (paramInt) {
    388     case 0:
    389       str = "v";
    390       break;
    391     case 1:
    392       str = "d";
    393       break;
    394     case 2:
    395       str = "i";
    396       break;
    397     case 3:
    398       str = "w";
    399       break;
    400     case 4:
    401       str = "e";
    402       break;
    403     default:
    404       str = null;
    405     }
    406 
    407     if (str != null)
    408       runTaskInUiThread(new Runnable()
    409       {
    410         public void run() {
    411           GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.BuglyLog"), this.val$method, new Object[] { paramString1, paramString2 }, new Class[] { String.class, String.class });
    412         }
    413       });
    414   }
    415 
    416   private static void postCocosException(int paramInt, String paramString1, final String paramString2, String paramString3, final boolean paramBoolean)
    417   {
    418     try
    419     {
    420       if (paramString3.startsWith("stack traceback")) {
    421         paramString3 = paramString3.substring(paramString3.indexOf("
    ") + 1, paramString3.length()).trim();
    422       }
    423 
    424       int i = paramString3.indexOf("
    ");
    425       if (i > 0) {
    426         paramString3 = paramString3.substring(i + 1, paramString3.length());
    427       }
    428 
    429       i = paramString3.indexOf("
    ");
    430       str2 = paramString3;
    431       if (i > 0) {
    432         str2 = paramString3.substring(0, i);
    433       }
    434 
    435       int j = str2.indexOf("]:");
    436       if ((paramString1 == null) || (paramString1.length() == 0)) {
    437         if (j != -1)
    438           paramString1 = str2.substring(0, j + 1);
    439         else
    440           paramString1 = paramString2;
    441       }
    442     }
    443     catch (Throwable localThrowable)
    444     {
    445       if ((paramString1 == null) || (paramString1.length() == 0)) {
    446         paramString1 = paramString2;
    447       }
    448     }
    449     final String str1 = paramString1;
    450     final String str2 = paramString3;
    451     runTaskInUiThread(new Runnable()
    452     {
    453       public void run() {
    454         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.inner.InnerApi"), "postCocos2dxCrashAsync", new Object[] { Integer.valueOf(this.val$category), str1, paramString2, str2 }, new Class[] { Integer.TYPE, String.class, String.class, String.class });
    455 
    456         if (paramBoolean)
    457           GameAgent.delayExit(3000L);
    458       }
    459     });
    460   }
    461 
    462   private static void postUnityException(String paramString1, final String paramString2, final String paramString3, final boolean paramBoolean)
    463   {
    464     runTaskInUiThread(new Runnable()
    465     {
    466       public void run() {
    467         GameAgent.Reflection.invokeStaticMethod(GameAgent.access$500("crashreport.inner.InnerApi"), "postU3dCrashAsync", new Object[] { this.val$type, paramString2, paramString3 }, new Class[] { String.class, String.class, String.class });
    468 
    469         if (paramBoolean)
    470           GameAgent.delayExit(3000L);
    471       }
    472     });
    473   }
    474 
    475   public static void postException(int paramInt, String paramString1, String paramString2, String paramString3, boolean paramBoolean)
    476   {
    477     switch (paramInt) {
    478     case 5:
    479     case 6:
    480       postCocosException(paramInt, paramString1, paramString2, paramString3, paramBoolean);
    481       break;
    482     case 4:
    483       postUnityException(paramString1, paramString2, paramString3, paramBoolean);
    484       break;
    485     default:
    486       printLog(4, new StringBuilder().append("The category of exception posted is unknown: ").append(String.valueOf(paramInt)).toString());
    487     }
    488   }
    489 
    490   private static class Reflection
    491   {
    492     private static Object getStaticField(String paramString1, String paramString2, Object paramObject)
    493     {
    494       try
    495       {
    496         Class localClass = Class.forName(paramString1);
    497 
    498         Field localField = localClass.getDeclaredField(paramString2);
    499         localField.setAccessible(true);
    500         return localField.get(paramObject);
    501       } catch (ClassNotFoundException localClassNotFoundException) {
    502         localClassNotFoundException.printStackTrace();
    503       } catch (NoSuchFieldException localNoSuchFieldException) {
    504         localNoSuchFieldException.printStackTrace();
    505       } catch (IllegalAccessException localIllegalAccessException) {
    506         localIllegalAccessException.printStackTrace();
    507       }
    508 
    509       return null;
    510     }
    511 
    512     private static Object invokeStaticMethod(String paramString1, String paramString2, Object[] paramArrayOfObject, Class<?>[] paramArrayOfClass)
    513     {
    514       try
    515       {
    516         Class localClass = Class.forName(paramString1);
    517         Method localMethod = localClass.getDeclaredMethod(paramString2, paramArrayOfClass);
    518         localMethod.setAccessible(true);
    519         return localMethod.invoke(null, paramArrayOfObject);
    520       } catch (ClassNotFoundException localClassNotFoundException) {
    521         localClassNotFoundException.printStackTrace();
    522       } catch (NoSuchMethodException localNoSuchMethodException) {
    523         localNoSuchMethodException.printStackTrace();
    524       } catch (InvocationTargetException localInvocationTargetException) {
    525         localInvocationTargetException.printStackTrace();
    526       } catch (IllegalAccessException localIllegalAccessException) {
    527         localIllegalAccessException.printStackTrace();
    528       } catch (Exception localException) {
    529         localException.printStackTrace();
    530       }
    531       return null;
    532     }
    533 
    534     private static Object newInstance(String paramString, Object[] paramArrayOfObject, Class<?>[] paramArrayOfClass)
    535     {
    536       try
    537       {
    538         Class localClass = Class.forName(paramString);
    539         if (paramArrayOfObject == null) {
    540           return localClass.newInstance();
    541         }
    542         Constructor localConstructor = localClass.getConstructor(paramArrayOfClass);
    543         return localConstructor.newInstance(paramArrayOfObject);
    544       }
    545       catch (ClassNotFoundException localClassNotFoundException) {
    546         localClassNotFoundException.printStackTrace();
    547       } catch (NoSuchMethodException localNoSuchMethodException) {
    548         localNoSuchMethodException.printStackTrace();
    549       } catch (InstantiationException localInstantiationException) {
    550         localInstantiationException.printStackTrace();
    551       } catch (IllegalAccessException localIllegalAccessException) {
    552         localIllegalAccessException.printStackTrace();
    553       } catch (InvocationTargetException localInvocationTargetException) {
    554         localInvocationTargetException.printStackTrace();
    555       } catch (Exception localException) {
    556         localException.printStackTrace();
    557       }
    558       return null;
    559     }
    560   }
    561 }
    View Code
     1 private static readonly string GAME_AGENT_CLASS = "com.tencent.bugly.agent.GameAgent";
     2     private static readonly int TYPE_U3D_CRASH = 4;
     3     private static readonly int GAME_TYPE_UNITY = 2;
     4     private static bool hasSetGameType = false;
     5     private static AndroidJavaClass _gameAgentClass = null;
     6     
     7     public static AndroidJavaClass GameAgent {
     8         get {
     9             if (_gameAgentClass == null) {
    10                 _gameAgentClass = new AndroidJavaClass(GAME_AGENT_CLASS);
    11 //                using (AndroidJavaClass clazz = new AndroidJavaClass(CLASS_UNITYAGENT)) {
    12 //                    _gameAgentClass = clazz.CallStatic<AndroidJavaObject> ("getInstance");
    13 //                }
    14             }
    15             if (!hasSetGameType) {
    16                 // set game type: unity(2).
    17                 _gameAgentClass.CallStatic ("setGameType", GAME_TYPE_UNITY);
    18                 hasSetGameType = true;
    19             }
    20             return _gameAgentClass;
    21         }
    22     }
    View Code
  • 相关阅读:
    静态成员在类中的初始化
    博客中尖括号不显示的问题
    声明vector对象保存函数指针
    返回数组指针的函数
    C++ 指针与引用的差别
    Configure Eclipse “Content Assist”
    How to install Eclipse-Color-Theme
    国内 git 托管平台
    SHA1 对文件求信息摘要的实现
    SHA1 对字符串求摘要的实现
  • 原文地址:https://www.cnblogs.com/mttnor/p/6409849.html
Copyright © 2020-2023  润新知