递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 4740|回复: 7
打印 上一主题 下一主题

[安卓] 怎么可以获取系统日志?

[复制链接]

55

主题

154

帖子

958

积分

高级会员

Rank: 4

积分
958
跳转到指定楼层
楼主
发表于 2023-3-31 16:48:02 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,火山安卓怎么可以获取系统日志?
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40533
沙发
发表于 2023-3-31 18:45:02 | 只看该作者
这个肯定要root权限,而且你的知道日志在什么地方存储才行。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

55

主题

154

帖子

958

积分

高级会员

Rank: 4

积分
958
板凳
 楼主| 发表于 2023-3-31 20:47:52 来自手机 | 只看该作者
创世魂 发表于 2023-3-31 18:45
这个肯定要root权限,而且你的知道日志在什么地方存储才行。

我看别人通过甲壳虫adb给app读取日志权限就可以啊,不用root,火山里没有日志操作类,是没封装吗?
回复

使用道具 举报

65

主题

469

帖子

5159

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5159
QQ
地板
发表于 2023-4-1 21:38:58 | 只看该作者
hwq911128 发表于 2023-3-31 20:47
我看别人通过甲壳虫adb给app读取日志权限就可以啊,不用root,火山里没有日志操作类,是没封装吗? ...

可以参考我这个:

<火山程序 类型 = "通常" 版本 = 1 />

包 com.log.app

类 启动类 <公开 基础类 = 窗口 注释 = "" 注释 = "声明读取权限" "//@安卓.附加清单" = 常用窗口附加清单.安卓5无标题白色窗口 @安卓.权限需求 = 安卓权限.读系统日志
        @java.导入 = "java.io.BufferedReader\n java.io.InputStreamReader\n java.util.ArrayList">
{
    变量 编辑框_日志输出 <类型 = 编辑框 隐藏值属性 = "0"
            @安卓.窗口.布局 = "layout_weight = 90\np_layout_height_type = p_specified\np_layout_height_value = 0\np_layout_width_type = match_parent"
            单行模式 = 假>
    变量 按钮_开始获取系统日志 <类型 = 按钮 隐藏值属性 = "0"
            @安卓.窗口.布局 = "ctrl_order = 1\nlayout_weight = 10\np_horz_align = center_horizontal\np_layout_height_type = p_specified\np_layout_height_value = 0\np_layout_width_type = match_parent\np_vert_align = center_vertical\ntext = 开始获取系统日志">
    变量 ""
    变量 成员变量_获取日志线程对象 <类型 = 线程类>

    方法 线程类_线程启动 <接收事件 类型 = 整数 注释 = "线程已经启动事件" 注释 = "注意: 此事件的处理方代码将在多线程环境下执行,必须处理好多线程冲突问题.">
    参数 来源对象 <类型 = 线程类 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    参数 用户对象1 <类型 = 对象类 注释 = "提供调用启动方法时所提供的第1个用户对象">
    参数 用户对象2 <类型 = 对象类 注释 = "提供调用启动方法时所提供的第2个用户对象">
    {
        如果 (来源对象 == 成员变量_获取日志线程对象)
        {
            调试输出 ("线程启动")
            判断循环 (真)
            {
                @   try
                @                         {
                @                             ArrayList<String> cmdLine=new ArrayList<String>();   //设置命令   logcat -d 读取日志
                @                             cmdLine.add("logcat");
                @                             cmdLine.add("-d");
                @
                @                             ArrayList<String> clearLog=new ArrayList<String>();  //设置命令  logcat -c 清除日志
                @                             clearLog.add("logcat");
                @                             clearLog.add("-c");
                @
                @                             Process process=Runtime.getRuntime().exec(cmdLine.toArray(new String[cmdLine.size()]));   //捕获日志
                @                             BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));    //将捕获内容转换为BufferedReader
                @
                @                             String str=null;
                @                             while((str=bufferedReader.readLine())!=null)    //开始读取日志,每次读取一行
                @                             {
                @                                 Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()]));  //清理日志....这里至关重要,不清理的话,任何操作都将产生新的日志,代码进入死循环,直到bufferreader满
                @                                 //System.out.println(str);    //输出,在logcat中查看效果,也可以是其他操作,比如发送给服务器..
                // 内容显示到编辑框中,不过这种写法在安卓中是不推荐的!
                变量 日志内容 <类型 = 文本型>
                @ @<日志内容> = str;
                本对象.编辑框_日志输出.添加内容行 (日志内容)
                @                             }
                @                             if(str==null)
                @                             {
                @                                 //System.out.println("--   is null   --");
                调试输出 ("-- is null --")
                @                             }
                @                         }
                @                         catch(Exception e)
                @                         {
                @                             e.printStackTrace();
                @                         }
                @

            }
        }
        返回 (0)
    }

    方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "用户在组件上单击事件" 注释 = "注意:"
            注释 = "  1. \"按钮\"类别及\"图片按钮\"组件会自动初始设置\"支持单击\"属性为真,不需要单独设置;"
            注释 = "  2. 除开上述类别组件外,必须将组件的\"支持单击\"属性设置为真才会发送本事件.">
    参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    {
        如果 (来源对象 == 按钮_开始获取系统日志)
        {
            调试输出 ("%b", 成员变量_获取日志线程对象.启动 (, ))
        }
        返回 (0)
    }
}
回复

使用道具 举报

55

主题

154

帖子

958

积分

高级会员

Rank: 4

积分
958
5#
 楼主| 发表于 2023-4-1 22:01:02 | 只看该作者
xrea 发表于 2023-4-1 21:38
可以参考我这个:

虽然看不懂 还是感谢感谢

老板这是你写的吗?怎么不直接封装一个啊
回复

使用道具 举报

55

主题

154

帖子

958

积分

高级会员

Rank: 4

积分
958
6#
 楼主| 发表于 2023-4-1 22:02:51 | 只看该作者
xrea 发表于 2023-4-1 21:38
可以参考我这个:

能给个模块吗?
回复

使用道具 举报

65

主题

469

帖子

5159

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5159
QQ
7#
发表于 2023-4-2 10:42:24 | 只看该作者

摘抄下不就得了,写个模块太麻烦了
回复

使用道具 举报

55

主题

154

帖子

958

积分

高级会员

Rank: 4

积分
958
8#
 楼主| 发表于 2023-4-2 16:21:34 | 只看该作者
xrea 发表于 2023-4-2 10:42
摘抄下不就得了,写个模块太麻烦了

关键是没这基础,看不懂啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 12:51 , Processed in 0.096534 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表