안드로이드 로컬 원격 기록기

Logcat 존중


주요 Android 개발자 도구인 Logcat.그것은 이렇게 광범위하게 사용되고, 항상 손 옆에 있기 때문에, 어떤 상황에서도 당신이 그것을 가지고 있지 않은 상태에서 일을 해야 한다는 것을 상상하기 어렵다.그러나 나는 내가 이런 상황에 처해 있다는 것을 발견했다.나는 내가 이 연극을 보낼 수 있도록 도와줄 도구를 쓰고 공유하기로 결정했다.

도전하다


나의 임무는 어떤 라이브러리를 테스트하는 것이다. 왜냐하면 나는 #fintech에서 일하기 때문에 항상 추가 안전 검사가 있을 것이다.다음과 같은 경우에는 이 라이브러리를 초기화할 수 없습니다.
  • 애플리케이션은 debug 모드
  • 에서 구축됨
  • Android Studio 또는 adb install
  • 서명되지 않음release 릴리즈에 어플리케이션이 설치되어 있기 때문)
  • 개발자 옵션 사용 가능
  • 승인되지 않은 장치 또는 운영 체제 버전
  • 에서 실행 중
    개발자 옵션이 없다는 것은 로그가 없다는 것을 의미합니다.release 버전에서만 프로그램을 구축하면 로그를 제한할 수 있지만 최소한 이상을 기록할 수 있습니다.응용 프로그램이 자주 붕괴된다. 나는 일부 표준 NPE라고 의심한다. 왜냐하면, 예를 들어 초기화나 메모리를 잊어버리는 등등. 그러나 나는 어디에 있는지 모른다.나는 테스트나 메모리 라이브러리만 작성할 수 없다. 왜냐하면 이것은 나의 임무이기 때문이다. 그것이 가장 실제 환경에 가까운 작업 방식을 검사하는 것이다.
    Crashlytics나 다른 원격 충돌 보고 도구가 도움이 될 수 있습니다.그러나 보고서는 즉각적인 것이 아니라 프로그램 충돌과 지표만 보고하고 일반적인 이벤트도 기록하고 싶습니다.

    솔루션


    만약 당신이 Logcat 로그를 보낼 수 있다면, 예를 들어 웹소켓을 통해 컴퓨터에서 그것들을 포착할 수 있다면...나는 이런 도구를 찾지 못해서 하나를 만들었다.

    서버


    웹소켓 서버를 설정하고 로그를 HTML로 표시하거나 파일에 로그인할 수 있는 간단한 것이 필요합니다.저는 ExpressJS을 선택했습니다. 이것은 제 취미입니다.

    그물주머니


    이것이 바로 WebSocket 서버를 확보하는 데 필요한 모든 것입니다.
    const ws = require('ws');
    const wsServer = new ws.Server({ noServer: true});
    
    wsServer.on('connection', socket => {
        events.clear();
        console.log("clearing events");
        socket.on('message', message =>{
            events.add(JSON.parse(message))
        })
    });
    
    const server = app.listen(process.env.WS_PORT || '1234')
    
    console.log("Remote Logger is starting on port: ", process.env.WS_PORT || '1234');
    
    server.on('upgrade', (request, socket, head) =>{
        wsServer.handleUpgrade(request, socket, head, socket =>{
            wsServer.emit('connection', socket, request);
        });
    });
    
    서버는 부팅 매개 변수WS_PORT나 기본값1234에 제공된 포트의 이벤트를 탐지하여 events 대상에 집합합니다.

    네트워크 사용자 인터페이스


    JavaScript 객체의 로그가 있으면 HTML로 표시할 수 있습니다.나는 pug개의 템플릿을 사용했다.로그를 표시하려면 ExpressJS 응용 프로그램에 다음을 추가하면 됩니다.
    app.set('view engine', 'pug')
    app.get('/', function (req, res) {
      res.render('index', { title: 'Remote Logger', message: 'Remote Logger!', data: events.toArray() })
    })
    
    삽살개 템플릿이 하나 더 있습니다.
    html
      head
        title= title
        style
          include style.css
      body
        h1= message
        ul
          each event in data
              li(class=event.level)!= event.time+' <b>['+event.level+'] '+event.tag+'</b>  : ' + '<span style="white-space: pre-wrap">'+event.message+'</span>'
    
    간단한 무질서 목록에는 events 대상의 요소가 포함되어 있으며, 로그 레벨 색상은 매우 기본적인 CSS 스타일이 있습니다.
    보아하니 이렇다.

    초과의


    나는 단지 추가 사항을 추가하지 않는 것은 재미를 위해서일 뿐이라는 것을 포기할 수 없다. 따라서 서버를 시작한 후에 우리는 사용하는 포트, 안드로이드 코드에 입력할 서버 IP, 도구 이름에 대한 정보를 받을 것이다.또한 브라우저에서 로그 페이지가 자동으로 열립니다.
    ❯ node index.js
    Remote Logger is starting on port:  1234
    Application started on port 3000 at IP: 192.168.1.87
    ██████╗ ███████╗███╗   ███╗ ██████╗ ████████╗███████╗
    ██╔══██╗██╔════╝████╗ ████║██╔═══██╗╚══██╔══╝██╔════╝
    ██████╔╝█████╗  ██╔████╔██║██║   ██║   ██║   █████╗
    ██╔══██╗██╔══╝  ██║╚██╔╝██║██║   ██║   ██║   ██╔══╝
    ██║  ██║███████╗██║ ╚═╝ ██║╚██████╔╝   ██║   ███████╗
    ╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝ ╚═════╝    ╚═╝   ╚══════╝
    
    ██╗      ██████╗  ██████╗  ██████╗ ███████╗██████╗
    ██║     ██╔═══██╗██╔════╝ ██╔════╝ ██╔════╝██╔══██╗
    ██║     ██║   ██║██║  ███╗██║  ███╗█████╗  ██████╔╝
    ██║     ██║   ██║██║   ██║██║   ██║██╔══╝  ██╔══██╗
    ███████╗╚██████╔╝╚██████╔╝╚██████╔╝███████╗██║  ██║
    ╚══════╝ ╚═════╝  ╚═════╝  ╚═════╝ ╚══════╝╚═╝  ╚═╝
    

    안드로이드 라이브러리


    이 도구의android 부분의 초기화는 매우 간단합니다. onCreate()의 클래스를 계승하는 Application 방법에서 초기화하는 것이 좋습니다.
    class App : Application() {
    
        override fun onCreate() {
            super.onCreate()
            RemoteLogger().initialize(
                Config(
                    "192.168.1.87",
                    1234,
                    applicationContext.packageName
                )
            )
        }
    }
    
    라이브러리를 초기화하고 잊어버리면 로그가 로컬 서버로 넘어갑니다.이 도구는 원격 수집 애플리케이션 충돌이나 Logcat 자체를 대체하지 않습니다.이것은 단지 특정한 문제를 해결할 뿐입니다. 프로그램은 Logcat을 사용할 수 없는 환경에서 실행되어야 하지만, 개발 단계에서 로그에 접근해야 할 때, 여전히 이렇게 해야 합니다.레코더 초기화와 라이브러리 자체는 응용 프로그램의 공개 발표 버전에 포함되어서는 안 된다.

    사용법

  • 다운로드repo
  • 프로젝트에 라이브러리 추가JitPack
  • /server 디렉토리node index.js의 서버 시작
  • 추가된 라이브러리
  • 로 애플리케이션 시작
  • 페이지 새로 고침 remote logger
  • 응용 프로그램이 시작되면 라이브러리 자체가 서버에 연결되기 때문에 서버는 미리 시작해야 합니다.지금, 나는 더 잘하고 싶지 않다.이 도구는 각 프로젝트에서 일상적으로 사용하는 것이 아니라 개발자를 대상으로 합니다.
    안드로이드의 모든 로그는 프로그램이 시작되는 순간부터 수집되며, 심지어 호출 onCreate () 전까지도 수집됩니다.보통 첫 번째 항목은 App이다.로그는 한 라인에 수집되어 WS-server에 연결된 후 다른 라인으로 전송됩니다.프로그램 패키지에만 로그를 수집하기 때문에 Fri Aug 06 08:58:54 GMT + 02: 00 2021 [DEBUG] LOGGER: --------- beginning of system 방법에서 지정해야 합니다.
    RemoteLogger는 설정initialize()을 통해 예외가 발견되지 않은 처리를 인수합니다.프로그램이 붕괴되는 이상이 발생하면 서버에 기록하고 프로그램이 붕괴되며 오류 코드Thread.setDefaultUncaughtExceptionHandler가 표시됩니다.Firebase Crashlytics로 테스트할 기회는 없지만, 만약 설정이 되어 있다면, 제 도구가 필요하지 않을 수도 있습니다.

    어차피 너도 쓰고 싶지 않아.


    나는 이 공구가 상당히 거칠다는 것을 깨달았다.그러나 이것은 나에게 매우 큰 도움이 되었다. 나는 이 위에서 오후의 시간을 초과하고 싶지 않다.나는 단지 네가 그것을 영원히 사용할 필요가 없기를 바랄 뿐이다.) Logcat을 즐겨라.

    좋은 웹페이지 즐겨찾기