ローカルリモート


Logcatを尊重する


主なAndroid開発ツール- Logcat.それは非常に広く使用され、常に手で、それはあなたがそれなしで動作しなければならない状況を想像することは困難です.しかし、私はそのような状況で私自身を見つけました.そして、私はこのドラマを生き残るのを助けたツールを書き、共有することに決めました.

挑戦


私はあるライブラリをテストするためのタスクを与えられた#fintech , いくつかの追加セキュリティチェックがあります.このライブラリは、
  • アプリケーションが組み込まれたdebug モード
  • Android Studioによってインストールされましたadb install
  • それは符号なしであった(これは、アプリケーションをrelease バージョン)
  • 「開発者オプション」が有効になった
  • が承認されていないデバイスやOSのバージョンで動作していた
  • どんな開発者オプションもログを意味しません.アプリケーションのビルドrelease バージョンはログを制限しますが、少なくとも例外はログに記録されます.アプリケーションはかなり頻繁にクラッシュしていた、私はいくつかの標準的なNPEを疑ったので、例えば、私は何かを初期化またはスタブなどを忘れたが、私はどこに考えていた.私はテストやスタブライブラリを書くことができませんでした、それは私のタックだったので-それはどのように“リアル”環境に最も近い方法をチェックします.
    crashlyticsまたはいくつかの他のリモートクラッシュ報告ツールは多少役立つかもしれません.しかし、報告されていないだけで、アプリケーションのクラッシュといくつかのメトリックが報告され、私は定期的なイベントをログしたいと思います.

    解決策


    あなたがLogcatログを送ることができるならば、例えばWebSocketを通して、そして、それからあなたのコンピュータで彼らを捕えてください.私はそのようなツールを見つけませんでした.

    サーバ


    私は何か簡単なものを必要とし、それは私がWebSocketサーバーを設定し、ログをHTMLとして表示するか、ファイルにログインできるようにしました.選んだExpressJS 私は趣味として少し対処しなければならなかった.

    Websocket


    これは、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 オブジェクト.

    Web UI


    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スタイルです.
    以下のようになります.

    エキストラ


    私はちょうど楽しみのために余分な何かを追加しないようにすることができなかったので、サーバーを起動した後、我々は使用されるポートについての情報、Androidのコードで入力されるサーバーの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
  • サーバディレクトリでサーバを起動するnode index.js
  • 追加ライブラリとアプリケーションを起動
  • ページを更新するremote logger
  • アプリケーションが起動するとライブラリ自体がサーバーに接続しますので、サーバーを先に起動する必要があります.今のところ、私はそれがより良いことを行うような気がしなかった.このツールは開発者を対象とし、特定の問題を解決します.
    Androidからのすべてのログは、アプリケーションが起動する瞬間から収集されているonCreate () インApp . 通常、最初のエントリはFri Aug 06 08:58:54 GMT + 02: 00 2021 [DEBUG] LOGGER: --------- beginning of system . ログは、1つのスレッドで収集され、WSサーバーに接続した後、別の1つで送信されます.ログはアプリケーションパッケージだけで収集されるので、initialize() メソッド.
    RemoteLogger設定によってキャッチされない例外の処理を引き継ぐThread.setDefaultUncaughtExceptionHandler . アプリケーションをクラッシュさせる例外が発生した場合、サーバー上でログオンされ、アプリケーションがエラーコードでクラッシュします1 . 私はFirebase Crashlyticsでそれをテストする機会を持っていませんでした、しかし、あなたがすでにそれを構成したならば、あなたは多分私のツールを必要としないでしょう.

    あなたはとにかくそれを使用したくない


    私はこのツールはかなりラフだと思います.しかし、それは私を大いに助けました、そして、私はそれの上で1つ以上の午後を過ごしたくありませんでした.私はそれを使用する必要はありません.