Android、运行 检测模式下的常规应用程序(仅限 adb + 调试)
Android, run regular app in instrumentation mode (adb + debug only)
我想 运行 一个 Android 应用程序,它可以在 运行 时间内访问 InstrumentationRegistry.getInstrumentation()
。
这仅适用于调试版本,通过 ADB 安装应用程序就足够了。因为我不想使用仪器测试套件,所以我不想使用 InstrumentationTestRunner
而是直接启动应用程序的 MainActivity
。
这怎么可能?
我尝试过的:
- 添加了对测试包的常规实现依赖(而不是仅测试依赖)- 有效
implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
implementation 'androidx.test:runner:1.1.0'
- 向清单添加了检测
<instrumentation android:name=".MainActivity"
android:targetPackage="com.android.shell"
android:label="App" />
(不确定这是否真的正确。)
- 运行 正在使用的应用程序(应用程序已安装在设备上)
adb shell am instrument -w com.example.app/.MainActivity
这导致:
android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.app/com.example.app.MainActivity
at com.android.commands.am.Instrument.run(Instrument.java:519)
at com.android.commands.am.Am.runInstrument(Am.java:202)
at com.android.commands.am.Am.onRun(Am.java:80)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:60)
at com.android.commands.am.Am.main(Am.java:50)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:399)
所以基本上我的问题是,如何在 运行 时间内以我可以使用 UiAutomator
的方式实现 运行 应用程序?
提前致谢!
是的,有可能:
1. 将依赖项添加到您的 build.gradle。应该是这样的:
implementation 'androidx.test.ext:junit:1.1.2'
implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
implementation 'androidx.test:runner:1.1.0'
2. 在 application
标签和 instrumentation[=53] 中添加以下 uses-library =] 在 manifest
在你 AndroidManifest.xml:
<!-- Add inside application tag -->
<uses-library android:name="android.test.runner" />
设置android:targetPackage
为您自己的应用程序包名称。
<!-- Add inside manifest tag -->
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:label="App"
android:targetPackage="com.example.app" />
</manifest>
3. 创建您的 activity。您可以在那里使用 InstrumentationRegistry.getInstrumentation();
。
4. 在您的应用程序 class 的同一源集中创建测试 class(在 src/main/java)
@RunWith(AndroidJUnit4.class)
public class Test {
@org.junit.Test
public void test() {
// Put any code here. It is launching the activity.
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
Context context = instrumentation.getTargetContext();
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
5. 构建并安装应用程序。
6. 运行 应用使用: adb shell am instrument -w -m -e debug false -e class 'com.example.app.Test' com.example.app/androidx.test.runner.AndroidJUnitRunner
7.(可选)如果您想直接从 Android Studio 中的 run
按钮执行它,则将其添加到 android
在你的 build.gradle
中,它将更改必须创建测试 classes 的位置,指向与主代码相同的文件夹:
sourceSets {
androidTest {
java.srcDir 'src/main/java'
}
}
我想 运行 一个 Android 应用程序,它可以在 运行 时间内访问 InstrumentationRegistry.getInstrumentation()
。
这仅适用于调试版本,通过 ADB 安装应用程序就足够了。因为我不想使用仪器测试套件,所以我不想使用 InstrumentationTestRunner
而是直接启动应用程序的 MainActivity
。
这怎么可能?
我尝试过的:
- 添加了对测试包的常规实现依赖(而不是仅测试依赖)- 有效
implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
implementation 'androidx.test:runner:1.1.0'
- 向清单添加了检测
<instrumentation android:name=".MainActivity"
android:targetPackage="com.android.shell"
android:label="App" />
(不确定这是否真的正确。)
- 运行 正在使用的应用程序(应用程序已安装在设备上)
adb shell am instrument -w com.example.app/.MainActivity
这导致:
android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.app/com.example.app.MainActivity
at com.android.commands.am.Instrument.run(Instrument.java:519)
at com.android.commands.am.Am.runInstrument(Am.java:202)
at com.android.commands.am.Am.onRun(Am.java:80)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:60)
at com.android.commands.am.Am.main(Am.java:50)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:399)
所以基本上我的问题是,如何在 运行 时间内以我可以使用 UiAutomator
的方式实现 运行 应用程序?
提前致谢!
是的,有可能:
1. 将依赖项添加到您的 build.gradle。应该是这样的:
implementation 'androidx.test.ext:junit:1.1.2'
implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
implementation 'androidx.test:runner:1.1.0'
2. 在 application
标签和 instrumentation[=53] 中添加以下 uses-library =] 在 manifest
在你 AndroidManifest.xml:
<!-- Add inside application tag -->
<uses-library android:name="android.test.runner" />
设置android:targetPackage
为您自己的应用程序包名称。
<!-- Add inside manifest tag -->
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:label="App"
android:targetPackage="com.example.app" />
</manifest>
3. 创建您的 activity。您可以在那里使用 InstrumentationRegistry.getInstrumentation();
。
4. 在您的应用程序 class 的同一源集中创建测试 class(在 src/main/java)
@RunWith(AndroidJUnit4.class)
public class Test {
@org.junit.Test
public void test() {
// Put any code here. It is launching the activity.
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
Context context = instrumentation.getTargetContext();
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
5. 构建并安装应用程序。
6. 运行 应用使用: adb shell am instrument -w -m -e debug false -e class 'com.example.app.Test' com.example.app/androidx.test.runner.AndroidJUnitRunner
7.(可选)如果您想直接从 Android Studio 中的 run
按钮执行它,则将其添加到 android
在你的 build.gradle
中,它将更改必须创建测试 classes 的位置,指向与主代码相同的文件夹:
sourceSets {
androidTest {
java.srcDir 'src/main/java'
}
}