Android开发adb命令和闪退日志

您所在的位置:网站首页 android闪退日志文件 Android开发adb命令和闪退日志

Android开发adb命令和闪退日志

2023-10-04 11:09| 来源: 网络整理| 查看: 265

一、ADB简介

Android Debug Bridge,是 Android 开发/测试人员的强大工具,也是 Android 设备玩家的好玩具。安卓调试桥 (Android Debug Bridge, adb),是一种可用来操作手机设备或模拟器的命令行工具。它存在于 sdk/platform-tools 目录下。现在 Android Studio 已经将大部分 ADB 命令以图形化的形式实现了。

常用 adb 命令

adb connect ip:host #连接模拟器端口 adb disconnect ip:host adb install -r release_v2.1.apk #覆盖安装 adb shell pm clear #清除应用数据与缓存 adb shell dumpsys package com.examle.xx | grep version # adb 根据包名查看版本号(versionCode 和versionName) adb shell pm list packages -u #查询系统已安装的包,不包括隐藏的

查看设备中已安装app的包名

adb shell pm list packages | grep name package:com.test.dev

查看顶部Activity --Windows环境下: adb shell dumpsys activity | findstr "mFocusedActivity" --Linux、Mac环境下 adb shell dumpsys activity | grep "mFocusedActivity" ​ 遇见的问题 adb 命令没有 将adb地址写入环境变量(即配置adb为环境变量) # 例子是:mac zsh vim ~/.zshrc export ANDROID_HOME=/Volumes/WORK/AndroidSdk/sdk export PATH=${PATH}:${ANDROID_HOME}/tools export PATH=${PATH}:${ANDROID_HOME}/platform-tools ​ adb: more than one device/emulator adb devices #列出已连接的设备 adb -s emulator-5554 shell adb install -r release_v2.1.apk -s emulator-5554 二、闪退:

Android分三种闪退情况,均可用adb命令输出crash日志。

1、 app无任何提示,直接闪退(最普遍)

先清除之前的日志:adb logcat -c

操作闪退步骤后,输出干净的闪退日志:adb logcat -b crash >error.txt

2、app弹窗提示:程序意外终止

adb bugreport > log.txt

搜索fatal exception 或者crash;

3、ANR无反应

app出现anr时会在data/anr目录下生成traces.txt文件

adb pull data/anr/traces.txt > anr_log.txt

traces.txt文件里存放设备所有app的anr日志

打开日志文件,搜索包名

其他 1.

查看手机的所有日志 adb logcat 只获取该应用的日志 adb logcat | findstr 应用包名 开始抓取日志并保存到D盘的crash.txt adb logcat >D:\crash.txt ctrl +C 停止抓取 ctrl +F 搜索 force finishing查看闪退的日志

写一个工具类,然后直接引用,简单粗暴。 package com.cain.my.utils; ​ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.os.Looper; import android.util.Log; import android.widget.Toast; ​ import java.io.File; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Field; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. * * @author user * */ public class CrashHandler implements Thread.UncaughtExceptionHandler {   public static final String TAG = "CrashHandler"; ​   // 系统默认的UncaughtException处理类   private Thread.UncaughtExceptionHandler mDefaultHandler;   // CrashHandler实例   private static CrashHandler INSTANCE = new CrashHandler();   // 程序的Context对象   private Context mContext;   // 用来存储设备信息和异常信息   private Map infos = new HashMap(); ​   // 用于格式化日期,作为日志文件名的一部分   private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); ​   /** 保证只有一个CrashHandler实例 */   private CrashHandler() {   } ​   /** 获取CrashHandler实例 ,单例模式 */   public static CrashHandler getInstance() {       return INSTANCE;   } ​   /**     * 初始化     *     * @param context     */   public void init(Context context) {       mContext = context;       // 获取系统默认的UncaughtException处理器       mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();       // 设置该CrashHandler为程序的默认处理器       Thread.setDefaultUncaughtExceptionHandler(this);   } ​   /**     * 当UncaughtException发生时会转入该函数来处理     */   @Override   public void uncaughtException(Thread thread, Throwable ex) {       if (!handleException(ex) && mDefaultHandler != null) {           // 如果用户没有处理则让系统默认的异常处理器来处理           mDefaultHandler.uncaughtException(thread, ex);       } else {           try {               Thread.sleep(3000);           } catch (InterruptedException e) {               Log.e(TAG, "error : ", e);           }           // 退出程序           android.os.Process.killProcess(android.os.Process.myPid());           System.exit(1);       }   } ​   /**     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.     *     * @param ex     * @return true:如果处理了该异常信息;否则返回false.     */   private boolean handleException(Throwable ex) {       if (ex == null) {           return false;       }       // 使用Toast来显示异常信息       new Thread() {           @Override           public void run() {               Looper.prepare();               Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show();               Looper.loop();           }       }.start();       // 收集设备参数信息       collectDeviceInfo(mContext);       // 保存日志文件       saveCrashInfo2File(ex);       return true;   } ​   /**     * 收集设备参数信息     *     * @param ctx     */   public void collectDeviceInfo(Context ctx) {       try {           PackageManager pm = ctx.getPackageManager();           PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);           if (pi != null) {               String versionName = pi.versionName == null ? "null" : pi.versionName;               String versionCode = pi.versionCode + "";               infos.put("versionName", versionName);               infos.put("versionCode", versionCode);           }       } catch (PackageManager.NameNotFoundException e) {           Log.e(TAG, "an error occured when collect package info", e);       }       Field[] fields = Build.class.getDeclaredFields();       for (Field field : fields) {           try {               field.setAccessible(true);               infos.put(field.getName(), field.get(null).toString());               Log.d(TAG, field.getName() + " : " + field.get(null));           } catch (Exception e) {               Log.e(TAG, "an error occured when collect crash info", e);           }       }   } ​   /**     * 保存错误信息到文件中     *     * @param ex     * @return 返回文件名称,便于将文件传送到服务器     */   private String saveCrashInfo2File(Throwable ex) { ​       StringBuffer sb = new StringBuffer();       for (Map.Entry entry : infos.entrySet()) {           String key = entry.getKey();           String value = entry.getValue();           sb.append(key + "=" + value + "");       } ​       Writer writer = new StringWriter();       PrintWriter printWriter = new PrintWriter(writer);       ex.printStackTrace(printWriter);       Throwable cause = ex.getCause();       while (cause != null) {           cause.printStackTrace(printWriter);           cause = cause.getCause();       }       printWriter.close();       String result = writer.toString();       sb.append(result);       try {           long timestamp = System.currentTimeMillis();           String time = formatter.format(new Date());           String fileName = "crash-" + time + "-" + timestamp + ".log";           if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {               String path = "/sdcard/jianke/crash/";               File dir = new File(path);               if (!dir.exists()) {                   dir.mkdirs();               }               FileOutputStream fos = new FileOutputStream(path + fileName);               fos.write(sb.toString().getBytes());               fos.close();           }           return fileName;       } catch (Exception e) {           Log.e(TAG, "an error occured while writing file...", e);       }       return null;   } } ​ 在自己写的application 的onCreate方法里面,加上这句代码。 CrashHandler.getInstance().init(getApplicationContext());   ​


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3