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
}