【问题标题】:Android Package Name Dex IssueAndroid 软件包名称 Dex 问题
【发布时间】:2020-04-23 21:01:13
【问题描述】:

我正在尝试创建一个包名称为“com.cvs.myapp”的应用程序。应用构建完美,但在运行时在设备中崩溃。

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.cvs.myapp/com.cvs.myapp.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.cvs.myapp.MainActivity" on path: DexPathList[[zip file "/data/app/com.cvs.myapp-DG6fxWRjVXjsKQV_vwJwAw==/base.apk"],nativeLibraryDirectories=[/data/app/com.cvs.myapp-DG6fxWRjVXjsKQV_vwJwAw==/lib/x86, /system/lib]]
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.cvs.myapp.MainActivity" on path: DexPathList[[zip file "/data/app/com.cvs.myapp-DG6fxWRjVXjsKQV_vwJwAw==/base.apk"],nativeLibraryDirectories=[/data/app/com.cvs.myapp-DG6fxWRjVXjsKQV_vwJwAw==/lib/x86, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)

这只是一个新项目,没有其他添加,仅包含一个 MainActivity 类。如果我将包重命名为“com.demo.myapp”,则相同的新项目将起作用。

使用Analyze APK,我可以看到classes.dex 文件不包含MainActivity。名称“cvs”是否会导致问题,因为它可以与任何其他名称完美配合?

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

build.gradle(项目)

classpath 'com.android.tools.build:gradle:3.6.3'

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cvs.myapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.cvs.myapp.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

【问题讨论】:

  • 我不认为这是一个 proguard 问题,因为如果我重命名包名称,同一个项目将完美运行。我认为这与当前的名称有关。如果我将 gradle 版本更改为 classpath 'com.android.tools.build:gradle:3.0.1 distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all,同样的项目也将在设备上运行.zip 。在我将版本更新到最新版本之前它工作正常。
  • 你加了multiDexEnabled true吗?
  • 是的,我已经添加了。没用。即使我不添加这个并重构包名,它也会在设备中运行而不会崩溃。
  • 根据链接github.com/gradle/gradle/search?q=cvs&unscoped_q=cvs,名称“cvs”似乎被排除在外。遵循链接github.com/gradle/gradle/issues/11017 中提供的解决方案。添加:org.apache.tools.ant.DirectoryScanner.removeDefaultExclude("/CVS") org.apache.tools.ant.DirectoryScanner.removeDefaultExclude("**/CVS/") 到 settings.gradle

标签: android gradle dex


【解决方案1】:

正如您所提到的,当您使用当前为 3.6.3 的最新 Gradle 时会发生这种情况,它有一个新的打包工具 ZipFlinger,这可能是导致问题的原因,请尝试以下代码来禁用它

android.useNewApkCreator=false

另外我有一些相关的链接,请看一下。

https://issuetracker.google.com/issues/150198184

After upgrading to android 3.6.1 apk cant be installed on devices

Android App runtime crash after update gradle plugin 3.6

MultiDex problem with Android Studio 3.6 when implementing it the right way

【讨论】:

  • 我已经尝试过了,但问题仍然存在。还有其他事情正在发生,我不确定。正如我所说,即使不使用上述代码,如果我只是将包名称从“com.cvs.myapp”重构为“com.demo.myapp”或“com.sample”,我的项目将在具有最新 gradle 版本的设备上运行.myapp”。显然是“cvs”这个词导致了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多