簡體   English   中英

使用 adb shell am start 啟動 android 應用程序時出現錯誤“活動類不存在”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM