如何为VS2015 Android调试器提供命令行参数?

时间:2016-02-19 17:18:05

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

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

我知道Visual GDB扩展提供了与我正在查找的here类似的功能,但这不是一个可行的选项,因为我想避免支付扩展许可证。

如何为Android调试器提供命令行参数,就像我为Local Windows Debugger执行的操作一样?

1 个答案:

答案 0 :(得分:2)

我发布这个问题后,我的一位同事发现答案的时间不长。以下是我们解决问题的方法。

在VS2015中,在Android跨平台程序包/应用程序项目(Androidproj)的属性页中,更准确地说,在“调试”选项卡中,有“启动活动”字段。此字段可用于传递命令行意图参数。在安装软件包后启动调试器时,它将执行以下命令:

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

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

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

在我们的main函数中,我们可以使用下面的代码和一些解析(未显示)来检索附加组件的值。它使用JNI(Java Native Interface)。

        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));