using UnityEngine; using System.Collections; #if !UNITY_STANDALONE_WIN using com.xsj.Crasheye.U3D; #endif using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; using System.IO; using System.Runtime.CompilerServices; public class CrasheyeForAndroid : MonoBehaviour { #if UNITY_ANDROID && !UNITY_STANDALONE_WIN /// 通过JNI调用Java添加自定义数据 /// /// /// [DllImport("CrasheyeNDK")] private static extern void SetCustomData(string key, string value); /// 通过JNI调用 /// /// /// [DllImport("CrasheyeNDK")] private static extern string GetCustomData(string key); /// 通过JNI移除自定义数据 /// /// [DllImport("CrasheyeNDK")] private static extern void RemoveCustomData(string pKey); /// 通过JNI清除自定义数据 /// [DllImport("CrasheyeNDK")] private static extern void CleanCustomData(); /// 通过JNI调用Java添加打点信息 /// /// [DllImport("CrasheyeNDK")] private static extern void LeaveBreadcrumbData(string breadcrumb); /// /// 崩溃回溯C#堆栈信息 /// private static bool CSharpStackTrace = false; /// /// 用于调用java函数 /// private static AndroidJavaClass dumpcls; /// /// 设置AppVersion信息 /// private static string YourAppVersion = "NA"; /// /// 设置渠道号 /// private static string YourChannelId = "NA"; /// /// 设置是否只在wifi下往服务器发送数据 /// private static bool FlushOnlyOverWiFi = false; /// /// Android的初始化 /// /// /// public static void Init(string appKeyForAndroid, string channIdForAndroid) { if (string.IsNullOrEmpty(appKeyForAndroid)) { return; } AndroidJavaClass cls = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject javaObj = cls.GetStatic("currentActivity"); EnableDebug(); dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (!YourAppVersion.Equals("NA")) { dumpcls.CallStatic("setAppVersion", new object[] { YourAppVersion }); } if (FlushOnlyOverWiFi) { // 默认什为false dumpcls.CallStatic("setFlushOnlyOverWiFi", new object[] { FlushOnlyOverWiFi }); } dumpcls.CallStatic("setChannelID", new object[] { channIdForAndroid }); dumpcls.CallStatic("initWithNativeHandleUserspaceSig", new object[] { javaObj, appKeyForAndroid }); if (CSharpStackTrace) { Crasheye.crasheyeLib.InitCrasheyeLib(); } Crasheye.crasheyeLib.SetExceptionCallback(); } /// /// 如果启动了C#堆栈回溯可能会导致某些机型出现宕机 /// public static void EnableCSharpStackTrace() { CSharpStackTrace = true; } /// 设置版本号信息 /// /// public static void SetAppVersion(string yourAppVersion) { if (yourAppVersion == null) { return; } YourAppVersion = yourAppVersion; } /// 获取SDK版本信息 /// /// 返回sdk版本号 public static string GetAppVersion() { try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return "NA"; } string sdkVersion = dumpcls.CallStatic("getSDKVersion", new object[] { }); if (string.IsNullOrEmpty(sdkVersion)) { return "NA"; } return sdkVersion; } catch (Exception ex) { Debug.LogError(ex.Message); return "NA"; } } /// 设置用户信息 /// /// public static void SetUserIdentifier(string userIdentifier) { if (String.IsNullOrEmpty(userIdentifier)) { Debug.LogError("set user identifier is null or empty!"); return; } try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setUserIdentifier", new object[] { userIdentifier }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// SetURL /// /// public static void SetURL(string url) { if (String.IsNullOrEmpty(url)) { Debug.LogError("set url is null or empty!"); return; } try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setURL", new object[] { url }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// 指定获取应用程序log日志的行数 /// /// 设置获取行号 public static void SetLogging(int lines) { try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setLogging", new object[] { lines }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// 获取应用程序log日志关键字过滤 /// /// 设置获取关键字 public static void SetLogging(string filter) { if (string.IsNullOrEmpty(filter)) { return; } try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setLogging", new object[] { filter }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// 获取应用程序log日志(过滤条件:关键字过滤+行数) /// /// 设置获取行数 /// 设置获取关键字 public static void SetLogging(int lines, string filter) { if (string.IsNullOrEmpty(filter)) { return; } try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setLogging", new object[] { lines, filter }); } catch (Exception ex) { Debug.LogError(ex.Message); } } public static void SetIsBetaVersion(bool isBeta) { try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setIsBetaVersion", new object[] { isBeta }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// 设置是否在Wifi下往服务器发送信息 /// /// public static void SetFlushOnlyOverWiFi(bool enabled) { FlushOnlyOverWiFi = enabled; } /// /// 打调试信息设置打开 /// public static void EnableDebug() { try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); dumpcls.CallStatic("enableDebug", new object[]{}); } catch (Exception ex) { Debug.LogError("call java set debug log err:" + ex.Message); } } /// /// 添加自定义数据 /// /// Key. /// Value. public static void AddExtraData(string key, string value) { if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value)) { return; } SetCustomData(key, value); try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("addExtraData", new object[] { key, value }); } catch (Exception ex) { Debug.LogError(ex.Message); } } /// /// 获取自定义的值 /// /// /// public static string GetExtraData(string key) { if (string.IsNullOrEmpty(key)) { return "NA"; } return GetCustomData(key); } /// /// 移除自定义数据 /// /// public static void RemoveExtraData(string key) { if (string.IsNullOrEmpty(key)) { return; } RemoveCustomData(key); } /// /// 清空所有自定数据 /// public static void CleanExtraData() { CleanCustomData(); } /// /// 打点数据 /// /// Breadcrumb. public static void LeaveBreadcrumb(string breadcrumb) { if (string.IsNullOrEmpty(breadcrumb)) { return; } LeaveBreadcrumbData(breadcrumb); try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("leaveBreadcrumb", new object[] { breadcrumb }); } catch (Exception ex) { Debug.LogError(ex.Message); } } public static void setInternalExtraData() { var internalExtraData = GetHardwareInfo(); if (String.IsNullOrEmpty(internalExtraData)) { Debug.LogError("set internalExtraData is null or empty!"); return; } try { dumpcls = new AndroidJavaClass("com.xsj.crasheye.Crasheye"); if (dumpcls == null) { return; } dumpcls.CallStatic("setInternalExtraData", new object[] { internalExtraData }); } catch (Exception ex) { Debug.LogError(ex.Message); } } private static string GetCpuInfo() { string cpuInfo = "NA"; TextReader file = null; AndroidJavaClass androidOSBuild = new AndroidJavaClass("android.os.Build"); if (File.Exists("/proc/cpuinfo")) { file = File.OpenText("/proc/cpuinfo"); } if (file == null) { cpuInfo = androidOSBuild.GetStatic("HARDWARE"); return cpuInfo; } try { string line; while ((line = file.ReadLine()) != null) { if (line.ToLower().IndexOf("hardware") != -1) { string[] partArr = line.Split(':'); if (partArr.Length > 0) { cpuInfo = partArr[partArr.Length - 1].Trim(); break; } } } if (cpuInfo == "NA") { cpuInfo = androidOSBuild.GetStatic("HARDWARE"); } } catch (Exception ex) { Debug.LogError(ex.Message); } return cpuInfo; } private static string GetHardwareInfo() { StringBuilder sb = new StringBuilder(); sb.Append(SystemInfo.graphicsDeviceName); sb.Append("###" + GetCpuInfo()); return sb.ToString(); } #endif }