【问题标题】:How to provide command line arguments to the VS2015 Android Debugger?如何为 VS2015 Android 调试器提供命令行参数?
【发布时间】:2016-02-19 17:18:04
【问题描述】:

我正在开发一个在包括 Android 在内的许多平台上都受支持的库。该库使用 Google 测试基础设施进行了单元测试。我目前正在使用 Visual Studio 2015 的跨平台功能来构建、部署和调试。测试套件变得相当大,运行整个测试套件需要一段时间。使用 Google Test 基础架构,可以传递命令行参数来过滤出要运行的测试(--gtest_filter...)。对于 Windows、PS4 和 XboxOne 等平台,这很容易在 Visual Studio 中通过在 Project Properties -->Configuration Properties --> Debugging --> Command Arguments 中设置来实现。但是对于跨平台开发项目和包(AndroidProj),这个 Debugger 属性似乎不存在。这是 Android Native-Activity Project Properties 的快照。

我知道 Visual GDB 扩展提供了与我正在寻找的功能相似的功能,如 here 所示,但这不是一个可行的选择,因为我想避免为扩展许可证付费。

如何向 Android 调试器提供命令行参数,就像我为本地 Windows 调试器提供的一样?

【问题讨论】:

    标签: android debugging visual-studio-2015 cross-platform googletest


    【解决方案1】:

    我的一位同事在我发布此问题后不久就找到了答案。以下是我们解决问题的方法。

    在 VS2015 中,在 Android 跨平台 Package/App 项目(Androidproj)的属性页中,更准确地说是在 Debugging 选项卡中,有 Launch Activity 字段。此字段可用于传递命令行意图参数。安装包后启动调试器时,会执行以下命令:

    adb.exe am start -D -n com.YourPackageName/TheContentOfLaunchActivityField

    默认情况下,在 Launch Activity 字段中指定启动器活动 (android.app.NativeActivity),但您可以提供更多的意图参数。可以在此文档中找到它们的列表:https://developer.android.com/studio/command-line/adb.html#IntentSpec

    在我们的情况下,我们需要向我们的应用提供字符串数据(例如:--gtest_filter=...),因此我们使用了意图参数 -e extra_key extra_value。

    在我们的 main 函数中,我们可以使用以下代码和一些解析(未显示)来检索附加项的值。它使用 JNI(Java 本地接口)。

            JNIEnv* env = NULL;
            state->activity->vm->AttachCurrentThread(&env, 0);
    
            Private::JNIObjRef nativeActivityObject(env, state->activity->clazz);
            jclass nativeActivityClass = env->GetObjectClass(nativeActivityObject.Get());
    
            jmethodID getIntentID = env->GetMethodID(nativeActivityClass, "getIntent", "()Landroid/content/Intent;");
            Private::JNIObjRef intentObject(env, env->CallObjectMethod(nativeActivityObject.Get(), getIntentID));            
            jclass intentClass = env->FindClass("android/content/Intent");
    
            jmethodID getExtrasID = env->GetMethodID(intentClass, "getExtras", "()Landroid/os/Bundle;");
            Private::JNIObjRef extrasObject(env, env->CallObjectMethod(intentObject.Get(), getExtrasID));            
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多