or_chid_d 2019-06-25 10:27 采纳率: 0%
浏览 254

printk打印用串口输出相关问题

情况是从bootloader起kernel的时候挂掉了,所以adb不能起,boot和lk的log通过串口打印能用cutecom接收,但kernel里面的Log没有打印能不能咨询一下,怎么打开kernel的printk并用串口输出啊~
环境是msm8909,android8.1

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-10 13:37
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要使用串口从Android系统打印出kernel的日志信息,你需要在你的应用程序中添加一个日志打印功能,并且确保你的应用程序可以正确地连接到串口。以下是一个简单的示例,展示了如何实现这一目标:

    首先,你需要在你的应用的build.gradle文件中添加必要的依赖。

    dependencies {
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'org.apache.log4j:log4j-core:2.13.1'
        implementation 'org.apache.log4j:joran:2.13.1'
    }
    

    然后,在你的应用程序的主activity或服务中,你可以创建一个新的线程来处理串口通信。这里我们使用ThreadedLogcatReceiver来监听来自串口的数据。

    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class ThreadedLogcatReceiver extends Service {
    
        private LogcatOutputHandler handler = new LogcatOutputHandler();
        private final String TAG = "ThreadedLogcatReceiver";
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            handler.start(this);
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // Do nothing here.
            return START_STICKY;
        }
    }
    
    class LogcatOutputHandler implements Runnable {
        private static final String TAG = "ThreadedLogcatHandler";
        private static final String LOGCAT_STREAM_NAME = "/dev/log";
    
        private boolean stopRequested = false;
        private final Handler mHandler = new Handler();
    
        public void start(Service service) {
            File logFile = new File("/proc/self/fd/6");
            if (!logFile.exists()) {
                logFile.createNewFile();
            }
    
            try (BufferedReader reader = new BufferedReader(new FileReader(logFile))) {
                while (!stopRequested && reader.ready()) {
                    String line = reader.readLine();
                    if (line != null) {
                        handleLine(line);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private void handleLine(String line) {
            // Handle the line as needed in your application code.
            System.out.println("Received log message from kernel: " + line);
        }
    
        public void stop() {
            stopRequested = true;
            mHandler.removeCallbacksAndMessages(null);
        }
    }
    

    在这个示例中,我们创建了一个新的线程来处理串口数据。当线程接收到串口数据时,它会调用handleLine()方法来处理这些数据。这个方法会在你的应用程序代码中被调用,用来处理你想要处理的任何日志信息。

    注意:这个示例仅适用于MSM8909设备。如果你的设备型号不同,请相应调整代码以适应你的设备。

    评论

报告相同问题?