![](/img/trans.png)
[英]error "bad component name" when launching android app with adb shell am start
[英]error “activity class does not exist” when launching android app with adb shell am start
在adb install
-ing 我的應用程序之后,我可以使用adb shell pm list packages AppName
驗證它是否存在:
包:air.com.client.AppName
所以我知道它在那里,但是當我嘗試使用adb shell am start -a android.intent.action.MAIN -n air.com.client/.AppName
啟動它adb shell am start -a android.intent.action.MAIN -n air.com.client/.AppName
,我收到此錯誤:
開始:意圖 { cmp=air.com.client/.AppName}
錯誤類型 3
錯誤:活動類 {air.com.client/air.com.client.AppName} 不存在。
如果重要的話,您可能已經注意到,這是一個打包為 Android 應用程序的 AIR 應用程序。 有什么想法嗎? 我在某處錯過了什么嗎? 當我使用aapt dump xmltree
我可以看到我的 .apk 在意圖過濾器節點中包含一個android.intent.action.MAIN
條目,這是值得的。
最后,為了理智,使用相同的命令模板我可以毫無問題地啟動設置應用程序:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings
注意applicationIdSuffix
!!
在build.gradle 中使用applicationIdSuffix
時,后綴僅適用於您的應用程序 ID,而不適用於生成的 .apk 中的實際包結構,這意味着以簡短的方式引用您的活動( .MainActivity
,而不是使用其完全限定名稱)將添加應用程序 id 后綴也是活動的路徑,因此 AS 將無法找到它。 例如:
我的應用程序的包名稱是my.application.package
,我在我的應用程序模塊的build.gradle 中有這個:
buildTypes {
someBuildType {
[...]
applicationIdSuffix ".dev"
}
}
嘗試執行時,讓我們從命令行說`MainActivity(位於根包中):
$ adb shell am start -n my.application.package.dev/.MainActivity
實際上解決了
$ adb shell am start -n my.application.package.dev/my.application.package.dev.MainActivity
但是MainActivity
實際上是在my.application.package.MainActivity
,而不是在my.application.package.dev.MainActivity
,因為applicationIdSuffix
只改變了應用程序id,而不是實際的包結構,所以會定位失敗。
因此,您應該使用活動的完全限定名稱:
$ adb shell am start -n my.application.package.dev/my.application.package.MainActivity
設法弄明白了 - 我用adb logcat
打開了一個提示,然后在設備上啟動了我的應用程序 - 在這個相應的日志條目中:
I/ActivityManager(2115):從 pid 2453 開始 u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=air.com.client.AppName/.AppEntry}
我整理了一個新的命令行:
adb shell start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n air.com.client.AppName/.AppEntry
...這正是我想要的。 老實說,我不明白為什么它會起作用,但現在已經足夠了。
至少對我來說,一旦我在應用程序清單文件中輸入了主要活動的完整路徑,這個問題就解決了。
而不是:
<activity android:name=".MyMainActivity"/>
使用:
<activity android:name="com.fullPathToActivityPackage.MyMainActivity"/>
然后使用常規:
adb shell am start -n com.myAppPackage/com.fullPathToActivityPackage.MyMainActivity
問題是只寫活動名稱而沒有包
am start -a android.intent.action.MAIN -n air.com.client/.AppName
錯了,
首先,您應該輸入活動名稱(而不是 AppName),其次您不能在沒有包名稱的情況下輸入活動名稱。單獨的 AppName 是行不通的。 即使活動與應用程序包在完全相同的包中,您也應該輸入 air.com.client.AppName。
這可能會奏效
am start -a android.intent.action.MAIN -n air.com.client.AppName/air.com.client.ActivityName
我通過復制另一個現有項目創建了一個新項目,但遇到了這個問題。 上面的答案都沒有幫助,因為一切似乎都是正確的。 最終解決我的問題的只是重新啟動 Andriod Studio。
檢查您設備的應用程序領域中是否沒有同名的 apk。 新設備有紙盒,有問題。
對於 AIR 應用程序,有特定的前綴和 postifx。 這對我cz.jara
,應用程序包是cz.jara
adb shell am start -n air.cz.jara/air.cz.jara.AppEntry
請注意,有時會在包名稱后附加 .DEBUG。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.