Android机型太多 Android机型更新太快 崩溃日志无法收集
请参考Demo:SendMail-Demo
一、收集崩溃日志
经常收到APP崩溃了,但是在测试环境又是好的。一说机型和Android版本,公司又没有。让用户拍一个视频或录屏吧。可还是没法重现,看不到崩溃日志。所以想到记录下崩溃日志吧。
/**
* 当UncaughtException发生时会转入该函数来处理
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
SystemClock.sleep(3000);
// 退出程序
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
复制代码
当崩溃的时候,将崩溃日志记录到本地文件,并且保存5天。
二、发送崩溃日志
等到用户反馈崩溃时,让用户发送下崩溃日志吧。妥妥的,看到崩溃原因。
/**
* 创建带有附件的邮件
*
* @return
*/
private Message createAttachmentMail(final Mail info, List<File> fileList) {
// 创建邮件
MimeMessage message = null;
Properties pro = info.getProperties();
try {
Session sendMailSession = Session.getInstance(pro, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(info.getUserName(), info.getPassword());
}
});
message = new MimeMessage(sendMailSession);
// 设置邮件的基本信息
// 创建邮件发送者地址
Address from = new InternetAddress(info.getFromAddress());
// 设置邮件消息的发送者
message.setFrom(from);
// 创建邮件的接受者地址,并设置到邮件消息中
setAddress(message,info);
// 邮件标题
message.setSubject(info.getSubject());
// 创建容器描述数据关系
MimeMultipart mp = new MimeMultipart("mixed");
message.setContent(mp);
// 创建邮件正文,为了避免邮件正文中文乱码问题,需要使用CharSet=UTF-8指明字符编码
MimeBodyPart text = new MimeBodyPart();
text.setContent(info.getContent(), "text/html;charset=UTF-8");
mp.addBodyPart(text);
// 创建邮件附件
if (null != fileList && 0 < fileList.size()) {
for (File file : fileList) {
MimeBodyPart attach = new MimeBodyPart();
FileDataSource ds = new FileDataSource(file);
DataHandler dh = new DataHandler(ds);
attach.setDataHandler(dh);
attach.setFileName(MimeUtility.encodeText(dh.getName(), "UTF-8", "B"));
mp.addBodyPart(attach);
}
}
message.saveChanges();
// add handlers for main MIME types
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
} catch (Exception e) {
Log.e("TAG", "创建带附件的邮件失败");
e.printStackTrace();
}
// 返回生成的邮件
return message;
}
复制代码
三、注意点
记录崩溃日志的实现是从网上下载,直接可以用。但是发送邮件碰到了几个坑: #####1. 腾讯企业邮箱 如果使用的是腾讯企业邮箱,那么建议换一个自己的邮箱,比如126或者163. 不然一直提示授权失败。 #####2. jar的问题 使用的javaMail的jar,下载方式有很多种,并且又有很多封装的包。所以选择包的时候,最好是匹配的。可以直接使用DEMO的jar包。 #####3. 附件MIME TYP的问题 一切都很正常的时候,上传附件报mimeType问题,需要添加下。
// add handlers for main MIME types
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
复制代码
4. 环境问题
当使用的jar包测试了很多次,依赖第三方库很多次,导致java mail的依赖包过多,会经常出现冲突的问题。那么建议清楚~/.gradle/caches文件夹中的内容。
5. Demo
在使用demo的时候,需要修改收件人和发件人的地址。其中发件人的密码,一定要使用授权码。授权码不同邮箱获取的方式不一样,不推荐使用腾讯的微信绑定安全码,尝试很多次不成功。推荐163或126邮箱,登录后在设置中可以明显的看到。