如何在Windows中使用ADB在设备中的Cordova Android应用程序中调试Java代码

使用CLI(而不是直接使用Android Studio)与Cordova一起工作的明显缺点是, 你无法正确调试或获取有关本机错误的详细信息(除非在设备上运行应用程序的过程中), 例如以下类的cordova插件:

package com.ourcodeworld.plugins;

import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Intent;
import android.content.Context;
import android.widget.Toast;

public class randomClass extends CordovaPlugin {
    
    @Override
    public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
        if (action.equals("executeAwesomeFunction")) {
            /** 
             * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             * The following code will throw an exception and will make your app crash !
             **/
            Intent intent = new Intent("com.nononsenseapps.filepicker.FilePickerActivity");
            intent.putExtra("some_data", "data");
            cordova.startActivityForResult((CordovaPlugin) this, intent, 0);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        showToast("Enviar aquí resultado cordova");
        if(resultCode == cordova.getActivity().RESULT_OK){
            // Some Code to Handle response
            return;
        }else if(resultCode == cordova.getActivity().RESULT_CANCELED){
            // Some Code to Handle response
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     * Show a toast with some message
     */
    public void showToast(String toLog){
        Context context = cordova.getActivity();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, toLog, duration);
        toast.show();
    }
}

从理论上讲, 当你在控制台中使用cordova run android来构建或运行应用程序时, 先前的代码将编译且不会显示任何错误(但是, 该错误在execute函数中, 我们稍后将清除你的原因)。现在, 上一个类将使用myApp.executeAwesomeFunction()在Javascript中公开和触发, 因此, 如果编译该应用程序并触发该函数, 请执行以下操作:

应用已停止android cordova

你的应用将停止运行, 而没有任何有用或可见的信息。因此, 基本上, 如果你使用的是插件, 但对失败的原因一无所知, 则可能现在想自杀。但是, 除非尚未消失, 否则不会丢失所有内容。如果你有Android设备和USB电缆, 则可以了解如何检查错误。

调试

为了从你的设备进行调试, 我们需要依赖adb logcat。 Logcat是一个命令行工具, 可转储系统消息的日志, 包括设备抛出错误时的堆栈跟踪信息以及你使用Log类从应用程序编写的消息(有关更多信息, 请参见官方文档)。

Android SDK中提供了该工具(可在Windows中执行), 因此, 如果你可以编译应用程序, 则说明你已经安装了Android Studio。现在, 要在设备上调试应用程序, 请按照下列步骤操作:

1.连接你的设备

第一步, 建议你首先连接设备以腾出时间, 以便计算机识别它。

2.执行adb

作为一种好的做法(使调试过程更容易的做法), 我们将把命令行工具的所有输出重定向到日志文件(位于系统中某个位置的log.txt)。

打开命令提示符(cmd.exe)并执行以下命令, 并在调试时使其在后台运行(在不进行调试时将其停止, 以防止无用的输出):

adb logcat > C:\Users\sdkca\Desktop\log.txt

该命令应在桌面上创建一个log.txt文件, 并且在使用你的应用程序时, 该文件将不断使用ADB的输出进行更新。通常, 在Windows中adb不能用作环境变量(请学习本文中的创建环境变量), 因此, 如果要快速执行此操作, 可以在控制台中提供可执行文件的绝对路径。

在这种情况下, adb.exe位于Windows的以下文件夹中:

Android ADB视窗

因此, 我们将改为使用以下命令:

C:\Users\sdkca\AppData\Local\Android\sdk\platform-tools\adb.exe logcat > C:\Users\sdkca\Desktop\log.txt

现在, 亚行应该在命令提示符下运行, 除非你这样做, 否则它不会停止。

3.在设备上构建并安装你的应用

使用cordova CLI编译你的应用程序, 然后使用cordova运行android –device或你使用的任何工具。请注意, 自从安装应用程序并在你的应用程序中执行该时刻起, logcat将开始生成输出并将其保存在log.txt文件中。我们在本教程中提供的顺序(连接设备, 启动logcat, 然后安装你的应用程序)很有用, 因为对于某些开发人员而言, 该应用程序会在开始时崩溃(因此logcat将捕获错误并将内容保存在日志文件中) 。

4.测试并检查失败的原因

假设你的应用程序运行良好, 但是当你执行一些Javascript时, 它崩溃了, 这是时候检查错误了!在我们的示例中, 当我们使用Javascript执行myApp.executeAwesomeFunction()时, 应用程序崩溃。那应该停止Android中的应用程序, 现在我们需要检查logcat在输出中检索了什么。

如果你的应用已崩溃, 请使用CTRL + BREAK停止命令中的ADB或仅关闭命令提示符窗口(这是为了防止在日志中生成更多文本或允许打开文件, 因为有时, 如adb所写, 在关闭ADB之前它不会打开)并打开log.txt文件。

最后可能是令人不舒服的时刻, 你需要检查日志文件(重点放在测试应用程序的时间上, 你会迅速发现错误):

输出logcat android

如你所见, log.txt文件为我们提供了一些宝贵的信息, 这些信息是我们在使用ADB之前所没有的。错误信息:

原因:android.content.ActivityNotFoundException:无法找到显式的活动类{com.ourcodeworld.sandbox / com.nononsenseapps.filepicker.FilePickerActivity};你是否在AndroidManifest.xml中声明了此活动?

现在我们知道我们正在调用一个不存在的活动, 所以我们只需要创建它就可以了。请记住, 你可以过滤由logcat提供的-f等参数生成的输出, 以仅显示致命错误(请在此处的官方文档中了解有关logcat API的更多信息)。

玩得开心 !

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?