am start找不到清单中列出的主要活动



我正试图通过adb shell为一个应用程序启动一个活动(如果你想知道的话,我没有写)。清单上有行:

    <activity android:label="@string/app_name" android:name="MainActivity$mainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我已经尝试使用命令

adb shell am start -W com.pkg.name/MainActivity$mainActivity
adb shell am start -W com.pkg.name/.MainActivity$mainActivity
adb shell am start -W com.pkg.name/.MainActivity
adb shell am start -a android.intent.action.MAIN -n com.pkg.name/MainActivity$mainActivity
adb shell am start -n com.pkg.name/MainActivity$mainActivity
etc...

每个人都给了我一个错误:

Error type 3
Error: Activity class {com.pkg.name/com.pkg.name.MainActivity}
does not exist.

然而,当点击模拟器中的应用程序图标时,它确实起作用,通过grepping logcat输出,我发现正在启动的活动被称为.MainActivity$mainActivit.MainActivity,它们都显示在输出中。有人能告诉我为什么am start不工作,以及如何在不手动单击图标的情况下启动此活动吗?

更新:laalto给出的解决方案几乎是正确的。事实证明,$被解析为环境变量是个问题,但他建议的命令并不能完全解决这个问题。除了转义$之外,还需要在<pkgname/activityname>周围加上单引号。

在类unix shell中,$是shell元字符,因此$mainActivity可以扩展到环境变量mainActivity的任何值,在您的情况下可能是空值。

要对其进行转义,请使用反斜杠:

adb shell am start -W com.pkg.name/.MainActivity$mainActivity

然而,有一个内部类作为入口点是一种代码气味。考虑把外层类作为你的切入点。那么你就不需要任何形式的$了。

am start -n com.pkg.name/com.package.name.MainActivity$mainActivity

祝好运

最新更新