`
yutinglong
  • 浏览: 66463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Eclipse中Logcat中文解决办法,重装该ADT即可

阅读更多

     这个问题从一开始接触到Android开发就困扰我很久了,平常除错少用中文log这个问题影响到不大,但是碰到需要把data (通常是远端的json or 本地端cache的sqlite)印出来观察这一种除错的情境时,这问题就头大了!

问了google也没有好解答,在android的google code里issue 1590就是在陈述这个问题,下面Comment提供的方法我试不出来,有趣的是用adb logcat在console下是不会有乱码的,所以问题一定出在ADT上,最近自已build了ADT trunk来用,刚好又遇到需要dump中文的data来debug的case,所以就尝试着自已来trace问题。

LogCat的相关的code都在LogPanel.java里,

public class LogPanel extends SelectionDependentPanel {
     private LogCatOuputReceiver mCurrentLogCat;

     @Override
     protected Control createControl(Composite parent) {...}

     private TabItem createTab(LogFilter filter, int index, boolean fillTable) {...}

    /**
      * Sent when a new device is selected. The new device can be accessed
      * with {@link #getCurrentDevice()}.
      */
     @Override
     public void deviceSelected() {
         startLogCat(getCurrentDevice());
     }

     public void startLogCat(final IDevice device) {
         if (device == mCurrentLoggedDevice) {
             return;
         }

         // if we have a logcat already running
         if (mCurrentLoggedDevice != null) {
             stopLogCat(false);
             mCurrentLoggedDevice = null;
         }

         resetUI(false); 
         if (device != null) {
             // create a new output receiver
             mCurrentLogCat = new LogCatOuputReceiver();

             // start the logcat in a different thread
             new Thread("Logcat")  { //$NON-NLS-1$
                 @Override
                 public void run() {

                     while (device.isOnline() == false &&
                             mCurrentLogCat != null &&
                             mCurrentLogCat.isCancelled == false) {
                         try {
                             sleep(2000);
                         } catch (InterruptedException e) {
                             return;
                         }
                     }

                     if (mCurrentLogCat == null || mCurrentLogCat.isCancelled) {
                         // logcat was stopped/cancelled before the device became ready.
                         return;
                     }

                     try {
                         mCurrentLoggedDevice = device;
                         device.executeShellCommand("logcat -v long", mCurrentLogCat, 0 /*timeout*/); //$NON-NLS-1$
                     } catch (Exception e) {
                         Log.e("Logcat", e);
                     } finally {
                         // at this point the command is terminated.
                         mCurrentLogCat = null;
                         mCurrentLoggedDevice = null;
                     }
                 }
             }.start();
         }
     }
 } 

 

    class Device的method executeShellCommand有三个参数分别是String command, IShellOutputReceiver receiver, int maxTimeToOutputResponse,它会透过class AdbHelper来做一下adb utility的指令操作。在第xx行时,执行了logcat -v long并把输出丢给LogCatOutputReceiver处理,所以我们的重点在于class LogCatOutputReceiver。继续追进去method executeShellCommand会发现它会把所有接收的data丢给interface IShellOutputReceiver的method addOutput处理,现在这个角色就是class LogCatOutputReceiver,而它的method addOutput是继承class MultiLineReceiver而来,问题就出在这里,把ISO -8859-1改成UTF-8就可以了...

public abstract class MultiLineReceiver implements IShellOutputReceiver {
     /* (non-Javadoc)
      * @see com.android.ddmlib.adb.IShellOutputReceiver#addOutput(
      *      byte[], int, int)
      */
     public final void addOutput(byte[] data, int offset, int length) {
         if (isCancelled() == false) {
             String s = null;
             try {
                 s = new String(data, offset, length, "ISO-8859-1"); //问题在这里,把所有输出的字串都使用ISO-8859-1 decode
             } catch (UnsupportedEncodingException e) {
                 // normal encoding didn't work, try the default one
                 s = new String(data, offset,length);
             }

             // ok we've got a string
             if (s != null) {
                 // if we had an unfinished line we add it.
                 if (mUnfinishedLine != null) {
                     s = mUnfinishedLine + s;
                     mUnfinishedLine = null;
                 }

                 // now we split the lines
                 mArray.clear();
                 int start = 0;
                 do {
                     int index = s.indexOf("\r\n", start); //$NON-NLS-1$

                     // if \r\n was not found, this is an unfinished line
                     // and we store it to be processed for the next packet
                     if (index == -1) {
                         mUnfinishedLine = s.substring(start);
                         break;
                     }

                     // so we found a \r\n;
                     // extract the line
                     String line = s.substring(start, index);
                     if (mTrimLines) {
                         line = line.trim();
                     }
                     mArray.add(line);

                     // move start to after the \r\n we found
                     start = index + 2;
                 } while (true);

                 if (mArray.size() > 0) {
                     // at this point we've split all the lines.
                     // make the array
                     String[] lines = mArray.toArray(new String[mArray.size()]);

                     // send it for final processing
                     processNewLines(lines);
                 }
             }
         }
     }
 } 

 

      然后重新编译DDMS即可。

       $javac -classpath ./ddms.jar:./ddmlib.jar MultiLineReceiver.java 
      下面便为重新编译后的的ADT,其中除了中文问题,其他与官方的完全相同。

分享到:
评论
1 楼 mcxiaoke 2011-02-22  
最新的 ADT9.0解决了这个BUG

相关推荐

    Eclipse无Logcat输出解决.zip

    然而,有时开发者可能会遇到Eclipse中Logcat无法正常显示日志输出的问题。这个问题可能是由多种原因引起的,包括但不限于以下几点: 1. **ADB(Android Debug Bridge)连接问题**:确保你的设备已经正确地通过USB...

    ddmlib.jar,用于解决该jar包作用:解决eclipse在Android7.0以及7.0以上的手机上无logcat输出

    该jar包作用:解决eclipse在Android7.0以及7.0以上的手机上无logcat输出 1.将下载好的ddmlib.jar替换到自己ADT的tools目录lib下E:\adt\sdk\tools\lib 2.将下载好的ddmlib.jar替换到自己ADT的configuration目录org....

    解决Android7.0以上手机eclipse不输出logcat问题

    6. **配置Eclipse ADT**:在Eclipse中,打开`Window > Preferences > Android > DDMS`,检查`Device`视图是否已打开,并确保你的设备被正确识别。如果需要,可以尝试重启Eclipse和ADB服务。 7. **使用命令行调试**...

    eclipse在Android7.0的手机上无logcat输出

    5. **更新ADT插件**:确保Eclipse中的ADT插件是最新的,因为旧版本可能不支持较新版本的Android系统。 6. **清空Logcat缓存**:在Eclipse的DDMS视图中,尝试清空Logcat缓存,然后重新启动应用以获取新的日志输出。 ...

    EclipseADT-24.2.0-支持jdk8.zip

    2.网上的adt24.0.2版本对logcat日志有问题 3.里面已经包含com.android.ide.eclipse.adt_24.2.0.20160729.jar修复支持了jdk8编译环境 4.里面已经包含了build-tools\25.0.3的dx.jar修改后文件 参考链接: ...

    Eclipse ADT 24.2.0 版本

    在此之前,有些用户可能遇到了在Eclipse中无法查看或打印日志的情况,这可能是由于兼容性问题、插件冲突或者是配置错误导致的。24.2.0版本的更新旨在解决这些问题,确保开发者能够顺畅地获取和分析应用程序的运行...

    ADT-0.9.6支持中文LOGCAT

    呵呵,收小小的一分,因为别的资源下载也要积分。大家下载了直接和以前ADT一样更新,在eclipse的help->install new software直接安装本地,找到这个文件夹更新,重启eclipse,LOGCAT就完美支持中文啦。

    让android的LogCat支持中文输出

    要解决LogCat中文输出的问题,我们可以从两个方面入手: 1. **修改Log类的输出方式**: Android系统的Log类提供了打印日志的方法,如`Log.v()`, `Log.d()`, `Log.i()`, `Log.w()`, 和 `Log.e()`。我们可以自定义一...

    解决Android Eclipse连接Android7.0版本以上的手机,显示unknown,无logcat输出的问题

    解决Android Eclipse连接Android7.0版本以上的手机,显示unknown,无logcat输出的问题 解决方式:1.将下载好的压缩解压包解压,复制ddmlib.jar 2.打开android eclipse 安装路径:D:\android-eclipse\eclipse\...

    eclipse的adt插件

    首先,要在Eclipse中使用ADT插件,你需要确保已经安装了Java Development Kit (JDK)和Eclipse IDE。然后,可以通过Eclipse的"Help" -> "Install New Software"菜单来添加ADT插件的更新站点。输入官方提供的更新地址...

    ADT-24.2.0以及ddmlib.jar 包含ADT文件

    如果你遇到上述问题,可以尝试升级Eclipse中的ADT至这个版本。升级过程通常包括卸载现有的ADT插件,然后导入ADT-24.2.0-20160729.zip文件中的内容。导入完成后,确保在Eclipse的插件管理器中正确安装并激活新版本的...

    ADT-24.2.0.rar

    6. **安装与使用**:要使用ADT-24.2.0,用户需要先拥有Eclipse IDE,然后将这个压缩包解压,按照官方指南将ADT导入到Eclipse中。安装完成后,开发者可以创建新的Android项目,编写代码,并利用ADT提供的工具进行编译...

    ADT-24.2.0.zip

    **Android Development Toolkit (ADT) 24.2.0** **一、ADT简介** ...总之,ADT-24.2.0作为Eclipse中的一个重要插件,为Android开发者提供了全面的开发环境,让开发、测试和调试工作变得更加高效和便捷。

    android-logcat

    下面将详细介绍如何使用`logcat`以及如何解决Eclipse中查看logcat的问题。 首先,`logcat`能够捕获不同级别的日志信息,包括`VERBOSE`、`DEBUG`、`INFO`、`WARN`、`ERROR`和`FATAL`。这些级别按照严重性递增,通常...

    ADT下载地址(含各版本),最新ADT-23.0.2

    2. **调试工具**:利用ADT内置的调试工具,开发者可以直接在Eclipse中启动应用并设置断点进行调试,通过LogCat视图查看日志信息,分析应用运行情况。 3. **布局预览**:在进行UI设计时,ADT提供了布局预览功能,可以...

    android通过logcat解决问题

    1. **Eclipse中的Logcat窗口**:在Eclipse IDE中,可以通过切换到Debug模式或DDMS模式来查看Logcat。启动Android模拟器后,Logcat窗口将自动显示出来。 - **调试信息过滤器**:Logcat窗口右上角提供了V、D、I、W、...

    Android-LogcatView一款可以在手机中打开logcat控制台

    **Android-LogcatView:手机中的日志控制台** 在Android应用开发中,日志(Logcat)是一个至关重要的工具,它允许开发者查看应用程序运行时的输出信息,包括错误、警告、调试信息等。通常,开发者会在计算机上的...

    解决华为系列手机调试时不能打印Logcat日志信息

    - 该链接提供了一种在Eclipse中设置Logcat的方法,适用于使用Eclipse作为开发工具的开发者。 #### 四、具体操作步骤详解 1. **确保设备连接正确**: - 确认手机已正确连接至电脑,并且在设备管理器中可以看到...

    ADT24.2.0最后版本.zip

    这些文件将允许用户在Eclipse中安装和配置ADT,以便进行Android应用开发。 在ADT 24.2.0中,开发者可能会找到以下关键特性: 1. **代码编辑器**:支持自动完成、错误检查和格式化,提高编码效率。 2. **图形布局...

    Android代码-一款可以在手机中打开logcat控制台。

    > 一款可以在手机中打开logcat控制台 方便快捷 支持内容搜索 支持自定义标题 支持根据tag筛选 支持根据log级别显示 如何引入 Android Studio 引入 第1步 将JitPack存储库添加到您的构建文件 将其添加到存储库末尾...

Global site tag (gtag.js) - Google Analytics