package tws.component.log.impl;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import tws.component.log.TwsLog;
import tws.component.log.TwsLogReceiver;
import tws.component.log.upload.AppRomBaseInfo;
import tws.component.log.upload.TwsLogUploadImpl;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.text.TextUtils;
/**
* Created by interzhang on 2014/12/23.
*/
public class TwsLogReceiverImpl {
public static final String PERMISSION_PACKAGE = "com.tencent.tws.debugtool";
private static String TAG = "TwsLogReceiverImpl";
private int mPid = -1;
public TwsLogReceiverImpl() {
mPid = android.os.Process.myPid();
}
public void onReceive(Context context, Intent intent) {
if (intent != null && context != null) {
String action = intent.getAction();
if (TextUtils.isEmpty(action)) {
TwsLog.w(TAG, "onReceive-> action: is empty");
return;
}
if (TextUtils.equals(action, TwsLogReceiver.ACTION_FORCE_LOG) && verifyPermission(context)) {// 仅接收认证app广播
boolean flag = intent.getBooleanExtra(TwsLogReceiver.FORCE_LOG_FLAG, false);
TwsLogImpl.getInstance().setForceLog(flag);
} else {
TwsLog.i(TAG, "onReceive-> action: " + action);
if (action.contains(TwsLogImpl.getInstance().getPkgName())
&& action.equals(TwsLogUploadImpl.getInstance().getReportTicktAction(context))) { // 上报日志相关信息
// 可以通过 pid区分是否是本进程触发的请求,用于多进程去重
int reportPid = intent.getIntExtra(TwsLogContants.PARAM_KEY_REPORT_PID, -1);
int resId = intent.getIntExtra(TwsLogContants.PARAM_KEY_REPORT_RESID, 0);
// // 获取请求额外数据
// Bundle bundle = intent.getBundleExtra(TwsLogContants.PARAM_KEY_REPORT_EXTRA_DATA);
TwsLog.i("TwsLogReceiverImpl", "ACTION_REPORT_LOG_INFO, resId = " + resId + ", report pid = " + reportPid);
if (mPid != reportPid) { //进程号不对,取消操作,( res id暂不校验)
TwsLog.w(TAG, "ACTION_REPORT_LOG_INFO -> pid is not match, cancel");
return;
}
AppRomBaseInfo appRomBaseInfo = new AppRomBaseInfo();
// 获取的ticket相关数据
appRomBaseInfo.mTicket = intent.getStringExtra(TwsLogContants.PARAM_KEY_APP_TICKET);
// 设置上传环境,和获取ticket的环境一致
appRomBaseInfo.mEnvFlg = intent.getIntExtra(TwsLogContants.PARAM_KEY_ENV_FLG, AppRomBaseInfo.EVN_FLG_RELEASE);
TwsLog.i(TAG, "ACTION_REPORT_LOG_INFO, resId = " + resId + ", mEnvFlg = " + appRomBaseInfo.mEnvFlg);
// wup 反馈的相关wup 数据
appRomBaseInfo.mGuid = intent.getByteArrayExtra("app_guid");
appRomBaseInfo.mQua = intent.getStringExtra("app_qua");
appRomBaseInfo.mLc = intent.getStringExtra("app_lc");
appRomBaseInfo.mPkgName = intent.getStringExtra("app_pkgName");
appRomBaseInfo.mRomId = intent.getLongExtra("app_romId", 0);
// imei
appRomBaseInfo.mImei = TwsLogUtils.getImei(context);
int rspCode = intent.getIntExtra(TwsLogContants.PARAM_KEY_APP_TICKET_RSPCODE, -99);
// 通知上报log msg
TwsLogUploadImpl.getInstance().sendReceiverLogTicketInfoMsg(appRomBaseInfo, resId, rspCode);
} // ~ end 日志上报ticket广播
}
}
}
private boolean verifyPermission(Context context) {
boolean result = false;
PackageManager pm = context.getPackageManager();
if (pm != null) {
try {
String pkgSignature = getMD5(context, PERMISSION_PACKAGE);
for (String signMD5 : WHITE_LIST_SIGNATURES_MD5) {
if (signMD5.equals(pkgSignature)) {
return true;
}
}
} catch (Exception ex) {
}
}
return result;
}
// QROM应用的签名MD5列表
private static final String[] WHITE_LIST_SIGNATURES_MD5 = new String[] {
"a481b32f0c9932ad72ad01698d49aff5",
"7fcce5ba187f4152b8c84cf21c4ce5a9",
"5e793ae6b959cbc13c0e105f5c46e86b",
"b8835eafb8c43eb00074f77f2861f7d6",
"8a05a9f70baffea8419fb107cdac3b83",
"6c309d850511d545addb3f8a348b5884",
"2eed75e85b154fb0c1013ecd16115c84",
"be7bdebf080a81acd9875ecde187913d",
"78e59f87cd0cc35a467eab0034ed98e3",
"7fcce5ba187f4152b8c84cf21c4ce5a9",
"5e793ae6b959cbc13c0e105f5c46e86b",
"a481b32f0c9932ad72ad01698d49aff5",
"54be22c232e03c9ebe886667e6857c71"
};
private static final String getMD5(final Context context, final String pkgName) {
String md5 = "";
try {
PackageManager manager = context.getPackageManager();
PackageInfo packageInfo;
packageInfo = manager.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
for(Signature sign : signs)
{
byte[] hexBytes = sign.toByteArray();
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] md5digest = new byte[0];
if(digest != null)
{
md5digest = digest.digest(hexBytes);
StringBuilder sb = new StringBuilder();
for(int i = 0; md5digest != null && i < md5digest.length; ++i)
{
sb.append((Integer.toHexString((md5digest[i] & 0xFF) | 0x100)).substring(1, 3));
}
md5 = sb.toString();
}
}
return md5;
} catch (NoSuchAlgorithmException e) {
TwsLog.w(TAG, "NoSuchAlgorithmException-> " + e.getMessage());
} catch (NameNotFoundException e) {
TwsLog.w(TAG, "NameNotFoundException -> " + e.getMessage());
}
return md5;
}
//********************** 2014-12-24 先屏蔽trace上报的相关功能 ******************
//
// public void onReceive(Context context, Intent intent) {
// if (intent != null) {
// String action = intent.getAction();
// if (TextUtils.isEmpty(action)) {
// return;
// }
//
// if (TextUtils.equals(action, context.getPackageName() + ".ACTION_TRACELOG")) {
// boolean flag = intent.getBooleanExtra("TRACE_FLAG", false);
// ArrayList<Integer> modules = intent.getIntegerArrayListExtra("TRACE_MODULES");
// long expires = intent.getLongExtra("TRACE_EXPIRES", 60 * 60 * 1000);
// if (flag) {
// TwsLogImpl.getInstance().openTraceLog(modules, expires);
// } else {
// TwsLogImpl.getInstance().closeTraceLog();
// }
// } else if (TextUtils.equals(action, TwsLogReceiver.ACTION_FORCE_LOG)) {
// boolean flag = intent.getBooleanExtra(TwsLogReceiver.FORCE_LOG_FLAG, false);
// TwsLogImpl.getInstance().setForceLog(flag);
// }
// }
// }
//********************** 2014-12-24 先屏蔽trace上报的相关功能 ******************
}