Android,使用 "provided project " 时出现 ClassNotFoundException 或 IllegalArgumentException:已添加,使用 "compile project" 时

Android, ClassNotFoundException when using "provided project " OR IllegalArgumentException: already added , when using "compile project"

在 class com.xyz.sample.QuickSampleApplication 中使用 "provided project" 时,我的 class com.xyz.sample.QuickSampleApplication 在应用程序启动时出现异常 ClassNotFoundException =] 依赖脚本或另一个错误 未捕获的翻译错误:java.lang.IllegalArgumentException:已添加: 在 gradle 依赖中使用 "compile project" 时。

实际错误:

E/AndroidRuntime(17749): java.lang.RuntimeException: Unable to instantiate application com.xyz.sample.QuickSampleApplication: 

java.lang.ClassNotFoundException: Didn't find class 

"com.xyz.sample.QuickSampleApplication" on path: DexPathList[[zip file

"/data/app/com.uei.sample.library-2.apk"],nativeLibraryDirectories=[/data/app-

lib/com.uei.sample.library-2, /vendor/lib, /system/lib]]

项目说明:

com.xyz.sample.QuickSampleApplicationcom.xyz.sample.QuickSampleActivity 使用,两个 class 都在同一个包裹com.xyz.sample.

com.xyz.sample.QuickSampleApplication 使用一个名为 'quicksdklibrary' 的 JAR,我将其作为 "provided dependency" 包含在gradle,请参阅下面的 gradle 片段:

dependencies {
    provided project(':quicksdklibrary')
    //OR provided fileTree(dir: 'libs/MyExternalLibs', include: '*.jar')
    compile 'com.android.support:appcompat-v7:21.0.0'
}

JAR 实际上在 IDE 中解析,构建没有错误,并且 JAR 的内部 classes 对我的应用 classes 可见,例如我的:

com.xyz.sample.QuickSampleApplication 或 com.xyz.sample.QuickSampleActivity。

两者都com.xyz.sample.QuickSampleApplication 而 com.xyz.sample.QuickSampleActivity 在 AndroidManifest.xml:

中是正确的 declared/spelled
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.xyz.sample.library"
      android:versionCode="1"
      android:versionName="1.0.002">
    <uses-sdk android:minSdkVersion="19" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:icon="@drawable/icon" android:label="@string/app_name"
        android:name="com.xyz.sample.QuickSampleApplication">
        <activity android:name="com.xyz.sample.QuickSampleActivity" android:screenOrientation="portrait"
                  android:label="@string/app_name" android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>
</manifest>

当我打开实际生成的.apk文件时,我发现我的com.xyz...classes没有被打包到.apk中,为什么???

我尝试通过以下方式在依赖项标记中明确包含源代码:

compile fileTree(dir: 'src/main/java', include: ['*'])

compile fileTree(dir: 'src/main/java/com/xyz', include: ['*'])

compile fileTree(dir: 'src/main/java/com/xyz', include: ['*.java'])

 compile fileTree(dir: 'src/main/java', include: ['*.java'])

 compile file(libs/quicksdklibrary.jar)

根据评论还尝试使用 sourceSets 标签:

或使用 sourceSets 标签:

sourceSets {

        main{
           java {
                java.srcDirs 'src/main/java'
            }

        }

    }

  sourceSets {

        main{
           java {
                java.srcDirs 'src/main/java/com/xyz'
            }

        }

    }

但是生成的“.apk”仍然不包含 class 包 com.xyz...

问题的最新更新,请看下面:

替代尝试#1:

当我在 gradle

中使用此标签时
dependencies {
    compile 'com.android.support:appcompat-v7:23.0.1'

    provided project(':quicksdklibrary')
}

然后我得到 ClassNotFoundException (检查 apk 和 class classes.dex 确认我的 quicksdklibrary classes 没有被包括在内),然而当我使用:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // OR compile files(libs/:quicksdklibrary.jar)
    // OR compile project(':quicksdklibrary')
    compile 'com.android.support:appcompat-v7:23.0.1'

}

然后我得到另一个错误,它甚至不允许我 deploy/install apk:

:app:preDexDebug

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ACEUtils$Creator;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AEUtils;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AEngine;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ATag;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/ABehavior;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AContext;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AControl$List;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AControl;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/xyz/ace/AData;

UNEXPECTED TOP-LEVEL EXCEPTION:

Error:Execution failed for task ':app:preDexDebug'.

com.android.ide.common.process.ProcessException: 

org.gradle.process.internal.ExecException: Process 'command 'C:\Program 
Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 2

**其他尝试:**

我真的检查了整个项目并重新创建了几次项目以确保我没有多次包含这个 JAR,但是我仍然遇到同样的错误 "Uncaught translation error: java.lang.IllegalArgumentException: already added..."

我也重新安装了Android SDK,并将我的JDK更新为jdk1.7.0_80,但是我仍然收到这个错误。

我看了 Whosebug 上的其他帖子,提到我应该删除对支持库版本 4 或 7 的引用,我也试过了。

其他尝试:

我还检查了实际的 JAR,看看是否在同一个包中创建了多个具有相同名称的 classes,而没有。

我也尝试添加混淆版本,它会有不同的 class 名称,但是混淆版本的 JAR 有 "Uncaught translation error: java.lang.IllegalArgumentException: already added:.." 错误!!!

问题:

我该如何解决这个 "Uncaught translation error: java.lang.IllegalArgumentException: already added:",为什么 app:preDexDebug 认为我的 classes 有多个版本或试图添加多个版本???

万分感谢!

我遇到了同样的问题,但答案与支持库有关。

    compile 'com.android.support:appcompat-v7:21.0.0'

尝试创建一个没有支持库的新应用程序,或者只是尝试删除这个应用程序,看看会发生什么。

更新(您还应该检查它是否存在):

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

可能是您两次添加库:

  1. 依赖性
  2. 在库文件夹中

不要这样做。而是保留这两种方式中的任何一种。 意味着从库文件夹中删除 jar 文件对您来说效果更好。