web-dev-qa-db-ja.com

AARファイルJava.lang.NoClassDefFoundErrorでアクティビティクラスが見つかりません

私はAndroidライブラリを作成しました。これには、カメラインテントを開くために使用するアクティビティクラスが含まれています。ライブラリは、アクティビティを呼び出して画面上に表示される部分とアプリがスローをスローすることを除いて、完全に機能します次のエラー

_Suppressed: Java.lang.ClassNotFoundException: com.me.scanner.ScannerViewActivity
            at Java.lang.Class.classForName(Native Method)
            at Java.lang.BootClassLoader.findClass(ClassLoader.Java:781)
            at Java.lang.BootClassLoader.loadClass(ClassLoader.Java:841)
            at Java.lang.ClassLoader.loadClass(ClassLoader.Java:504)
                    ... 14 more
         Caused by: Java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
_

以下は、このライブラリを使用する他のプロジェクトの_build.gradle_ファイルです

_repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })
    compile 'com.Android.support:appcompat-v7:25.3.0'
    compile 'com.Android.support.constraint:constraint-layout:1.0.2'
    compile 'com.me.app:gpio_lib@aar'
    compile ('com.me.app:scanner@aar'){ transitive = true; }
    testCompile 'junit:junit:4.12'
}
_

ご注意ください:

  • このライブラリはモジュールプロジェクトとして完全に機能し、

    _compile project(':scannercontrol')
    _

    プロジェクトでaarとして使用する場合は除く

  • _{ transitive = true; }_あり、なしで試してみましたが、変更はありません

  • Aarファイルの名前を_scanner.aar_に変更しました
  • _/[library-project]/build/outputs/aar/scanner-release.aar_のaarファイル形式を使用しました

Update1-2017-09-14

アクティビティScannerViewActivityは私のライブラリの一部です。これは、ライブラリクラスの1つから呼び出される方法です

_Intent scannerView = new Intent();
scannerView.putExtra(MESSAGE_RECEIVER, new MessageReceiver());
scannerView.setClass(context, ScannerViewActivity.class);
scannerView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(scannerView);
_

このcontextは_Android.app.Application_のインスタンスであり、Activityのインスタンスではありません

Update2-2017-09-14

幸いにも、グーグル全体で2日間ローミングした後、私は質問の答えに出くわします クラスがaarに見つかりません 。ライブラリの依存関係をプロジェクトに追加し、aarで実行できるようにしましたが、これは私の問題の解決策ではありません。

以下は、私が現在直面しているフローと問題です

  • 特定のバーコードスキャナーハードウェアと通信するライブラリのサンドボックスバージョンを開発しています。開発者は、デバイスのカメラをバーコードとして使用できるライブラリのサンドボックスバージョンを使用するハードウェアを必ずしも持っていないためです。スキャナー、

  • 開発者には、提供されたAARからSDKファイル_scanner.aar_および_scanner-sandbox.aar_を抽出し、それらのいずれかを使用してほしい

  • ライブラリのサンドボックスバージョンを実行する場合、開発者が_.gradle_ファイルに追加の依存関係を追加することは望ましくありません。

  • 以下は、デバイスのカメラをバーコードスキャナーとしてシミュレートするために使用されている依存関係です。

    _compile 'me.dm7.barcodescanner:zxing:1.9.8'
    _

更新された質問は

maven repositoryのようなリポジトリに公開せずにaarファイルを配布するための可能な方法と、開発者が_.gradle_ファイル

16
riksof-zeeshan

zeeshan

私は多くの研究を行った同じ問題に直面しました&うまくいけばそれがあなたを助けるのを修正しました

プロジェクトの.aarファイルを作成する:

  1. ライブラリモジュールの場合、.aarファイルはAndroid Studioによって自動的に作成されます。任意のリソースファイルまたはライブラリを使用するプロジェクトの場合、次の手順で説明するように.aarファイルを生成できます。
  2. プラグインを確認してください。次のようになっているはずです。アプリケーションにある場合はライブラリに変更し、プラグインを適用してください: 'com.Android.library'
  3. 開いている右の境界線のGradleバーを開き、「your project」-> Tasks-> buildに移動して、assembleReleaseをダブルクリックします。プロジェクトのビルドでは、app/build/outputs/aar /ディレクトリ内に2つの.aarファイル(app-debug.aarとapp-release.aar)があります。プロジェクトで.aarファイルを使用する:
  4. 「app-release.aar」ファイルを取得して、プロジェクトのlibsフォルダーに貼り付けます。 libsフォルダーが存在しない場合は、アプリディレクトリ内に「libs」という名前のディレクトリを作成します。

  5. 以下をアプリグラドルファイルに追加します。リポジトリ{flatDir {dirs 'libs'}} dependency {compile(name: 'app-release'、ext: 'aar')}

  6. 同期すると、プロジェクトでライブラリファイルを使用する準備が整います。注:.aarグラドルの依存関係は、プロジェクトアプリグラドルに手動で追加する必要があります例:以下

エラーの仮定:System.err:Java.lang.NoClassDefFoundError:

ソリューション:

.aar gradleの依存関係をプロジェクトアプリgradleに手動で追加する必要があります

4
madhu sudhan

あなたの「Update2-2017-09-14」の答えは、単に太いaarファイルを構築することができます。これにはすべての依存関係が含まれますが、処理しなければならない可能性の1つは、依存関係の競合が問題を引き起こすことがあります。また、ファットアールのサイズは非常に大きくなる場合があります。だから試してみてください。

4
roronoa_zoro

ライブラリを配布するには3つの方法があります。

  1. ローカルのMavenライブラリを作成し、生成されたaarを配布します。
    Gradle Android Maven plugin を使用してローカルaarを作成できます。作成方法:

    a。 root_build.gradle_にプラグインクラスパスを追加します。

    _buildscript {
      repositories {
        jcenter()
        mavenCentral()
      }
      dependencies {
        classpath 'com.Android.tools.build:gradle:2.2.3'
        classpath 'com.github.dcendents:Android-maven-gradle-plugin:1.5'
    
      }
    }
    
    allprojects {
      repositories {
        jcenter()
      }
    }
    _

    b。 mavenプラグインを設定し、グループとバージョン名をライブラリbuild.gradleに追加します。

    _apply plugin: 'com.Android.library'
    apply plugin: 'com.github.dcendents.Android-maven'
    
    group = 'com.your.packagename'
    version = '1.0.0'
    ext.versionCode = 1000
    
    Android {
      compileSdkVersion 25
      buildToolsVersion "25.0.3"
    
      defaultConfig {
        minSdkVersion 9
        targetSdkVersion 25
        versionCode versionCode
        versionName version
      }
      buildTypes {
        ...
      }
    
    }
    
    dependencies {
      ...
    }
    _

    c。設定アーティファクトがsettings.gradleで設定されている:

    _rootProject.name = 'yourlibraryname'
    _

    d。ライブラリをビルドしてローカルのmavenにインストールします。
    プロジェクトフォルダで_./gradlew_ installを実行するか、

    Gradle-> YourLibrary->その他-> Android Studioからインストール(Android Studio)の右側)

    e。インストールしたライブラリをプロジェクトに直接使用します。
    ライブラリを使用するには、mavenLocal()rootbuild.gradleに追加します

    _allprojects {
      repositories {
        jcenter()
        mavenLocal() // for local maven.
      }
    }
    _

    次に、依存関係をプロジェクトに追加します。

    _compile 'com.your.packagename:modulename:1.0.0'
    _

    または、ローカルのmavenパスから生成された.aarをコピーできます。 Linuxでは、_/your/userpath/.m2/repository/_または_~/.m2/repository/_から取得できます。

  2. 1番と同じ手法を使用しますが、各開発者コンピューターのローカルmavenパスを_~/.m2/repository/_中央を指すようにします。

  3. プライベートMavenリポジトリーを使用します。 JFrog Artifactory oss または Nexus Repository OSS を使用できます

問題の原因は、クラスScannerViewActivityが次のような依存関係としてAARの1つの中で呼び出されることです。

apply plugin: 'com.Android.library'
Android{...}
dependencies {
    compile 'com.me.scanner:otherscanner@aar' //library which contains ScannerViewActivity
}

しかし、aarを使用する場合(推移的ではこのaar依存関係は追加されません!)、次のような他の依存関係を追加する必要があります。

dependencies {
...
compile ('com.me.app:scanner@aar')// remove{ transitive = true; }
compile ('com.me.scanner:otherscanner@aar')
...
}
2
xiaomi

根本的な原因はわかりませんが、このソリューションを試すことができます。アプリプロジェクトで、ScannerViewActivityから拡張されたアクティビティを定義し、AndroidManifest.xmlで宣言します。

class MyScannerViewActivity extends ScannerViewActivity {
    // do nothing or something you want
}

次に、意図的にScannerViewActivityではなくMyScannerViewActivityを起動する必要があります。

0
Spark.Bao

以下のようにしてみませんか?

  1. Instant Runを無効にして、AARをクリーンビルドします。
  2. AARをホストしている場所に再度デプロイします。
  3. 依存関係としてAARを使用してアプリを再度テストします。

インスタント実行では、キャッシュが原因で問題が発生する場合があります。

編集:ローカルAARを追加します。あなたは言及されたように答えに従うことができます ここ

0
mthakuri