1. ホーム
  2. android

[解決済み] Android Studioとgradleでアンドロイドライブラリをビルドするには?

2022-05-11 11:36:35

質問

Eclipseからプロジェクトを移行しようとしていますが、何をやってもうまくいきません。Eclipseには3つのプロジェクト(2つのアンドロイドアプリプロジェクトと1つのアンドロイドライブラリプロジェクト)があります。2つのアプリプロジェクトは、ライブラリプロジェクトに依存しています。gradleエクスポートを実行すると、動作しない3つのプロジェクトが表示されます。私はプロジェクトを再構築することに前向きですが、これがどのように行われるべきかについてのドキュメントは見つかっていません。

Eclipse がエクスポートする 3 つのプロジェクトを一緒に動作させる方法はありますか?物事を再構築する方がよいのでしょうか、もしそうなら、これをどのように行うべきかのドキュメントはありますか。

更新

プロジェクト全体をGitHubにアップロードしました。 https://github.com/respectTheCode/android-studio-library-example

アップデート1

Padma Kumarからの提案に基づいて、これは私が試したものです。

  1. という名前の新しいプロジェクトを作成します。 MyApp
  2. クリック File > New Module を選択します。 Android Library を選択し、その名前を MyLib
  3. クリック Build > Make Project

このエラーでビルドが失敗します。

Module "MyLib" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 1 error and 0 warnings in 19 sec
1 error
0 warnings
/.../MyApp/MyLib/build/bundles/debug/AndroidManifest.xml
Gradle: <manifest> does not have package attribute.

次に package 属性を追加し、マニフェストに

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mylib" >

ビルド後、このエラーが表示されます。

Module "MyApp" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 2 errors and 0 warnings in 13 sec
2 errors
0 warnings
/.../MyApp/MyLib/src/main/java/com/example/mylib/MainActivity.java
Gradle: package R does not exist
Gradle: package R does not exist

依存関係を追加しても、エラーに影響はないようです。上記から続けて

  1. クリック File > Project Structure > Modules > MyApp-MyApp
  2. に切り替えます。 Dependencies タブ
  3. クリック + > Module Dependency をクリックし MyLib
  4. クリック ApplyOK
  5. クリック Build > Make Project

アップデート2

Ethanからの提案に基づき、以下のようになりました。

2つのサブプロジェクト build.gradle はすべて正しいパーツで構成されているように見えますが、唯一違うのは、下のプラグインの行が MyApp/build.gradle .

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

ルートプロジェクト build.gradle が空だったので、このように2つのプロジェクトを追加しました。

dependencies {
    compile project(":MyLib")
    compile project(":MyApp")
}

ビルド時にこのようなエラーが発生するようになりました。

Gradle:
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/kevin/GitHub/AppPress/MyApp/build.gradle' line: 2
* What went wrong:
A problem occurred evaluating root project 'MyApp'.
> Could not find method compile() for arguments [project ':MyLib'] on root project 'MyApp'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

アップデート3

この問題を解決してくれたEthanに大感謝です。

  1. 追加 compile project(':SubProjects:MyLib')MyLib/build.gradle
  2. 削除する compile files('libs/android-support-v4.jar') を削除します。 MyLib/build.gradle
  3. プロジェクトを閉じ、gradleからルートプロジェクトをインポートします。

アップデート4

0.1.2 からは、以下のように compile "com.android.support:support-v4:13.0.0" の代わりに compile files('libs/android-support-v4.jar') . mavinから提供されているため、複数のプロジェクトに問題なく組み込むことができます。

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }
}

apply plugin: 'android'

dependencies {
    compile "com.android.support:support-v4:13.0.0"

    compile project(':SubProjects:MyLib')
}

アップデート 5

0.1.3 では、ツールバーに "Sync Project" ボタンが追加されました。を変更した後にプロジェクトを再インポートする代わりに、これをクリックすることができます。 .gradle ファイルを変更した後にプロジェクトを再インポートする代わりにクリックできます。

どのように解決するのですか?

注意 : この回答は純粋なGradleの回答です。私はこれをIntelliJで定期的に使用していますが、Android Studioとの統合がどうなっているかは知りません。私は自分にとって何が起こっているかを知ることが信条なので、これは私がGradleとAndroidを使う方法です。

TL;DR 完全な例 https://github.com/ethankhall/driving-time-tracker/

免責事項 : これは私がやっている/やっていたプロジェクトです。

Gradleには を定義しています。 の構造(変更可能、下部のリンクがその方法を教えてくれます)を持っています。

Project Root
+-- src
|   +-- main (your project)
|   |   +-- java (where your java code goes)
|   |   +-- res  (where your res go)
|   |   +-- assets (where your assets go)
|   |   \-- AndroidManifest.xml
|   \-- instrumentTest (test project)
|       \-- java (where your java code goes)
+-- build.gradle
\-- settings.gradle

プロジェクトが1つしかない場合は、settings.gradleファイルは必要ありません。しかし、あなたはより多くのプロジェクトを追加したいので、それが必要です。

さて、build.gradleファイルを覗いてみましょう。アンドロイドツールを追加するために)このファイルが必要です。

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.3'
    }
}

さて、AndroidのいくつかのパーツについてGradleに伝える必要があります。かなり単純なものです。基本的なもの(私のほとんどのケースで機能するもの)は次のようなものです。このブロックの中にコメントがありますが、これはAPKを生成するときにバージョン名とコードを指定するためのものです。

build.gradle

apply plugin: "android"
android {
        compileSdkVersion 17
        /*
        defaultConfig {
            versionCode = 1
            versionName = "0.0.0"
        }
        */
    }

まだGradleの光を見たことがない人を助けるために、私たちが追加したいもの、それはインストールせずにプロジェクトを使用する方法です。

build.gradle

task wrapper(type: org.gradle.api.tasks.wrapper.Wrapper) {
    gradleVersion = '1.4'
}

これでビルドするプロジェクトが1つできました。これから他のプロジェクトを追加していきます。私はそれらをディレクトリに置きます。depsと呼ぶか、subProjectsと呼ぶか。それは本当に重要ではありませんが、どこに置いたか知っておく必要があります。Gradleにプロジェクトの場所を教えるには、settings.gradleにそれらを追加する必要があります。

ディレクトリ構造。

Project Root
+-- src (see above)
+-- subProjects (where projects are held)
|   +-- reallyCoolProject1 (your first included project)
|       \-- See project structure for a normal app
|   \-- reallyCoolProject2 (your second included project)
|       \-- See project structure for a normal app
+-- build.gradle
\-- settings.gradle

settings.gradleで設定します。

include ':subProjects:reallyCoolProject1'
include ':subProjects:reallyCoolProject2'

最後に確認するのは subProjects/reallyCoolProject1/build.gradleです。 があります。 apply plugin: "android-library" の代わりに apply plugin: "android" .

すべてのGradleプロジェクト(とMaven)のように、今度はルートプロジェクトにその依存関係を伝える必要があります。これはまた、あなたが望む通常のJava依存性を含むことができます。

build.gradle

dependencies{
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.4'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.4'
    compile project(":subProjects:reallyCoolProject1")
    compile project(':subProjects:reallyCoolProject2')
}

手順が多いように見えますが、1、2回やればかなり簡単です。この方法では、Android SDKがインストールされていることを前提に、CIサーバー上でビルドすることも可能です。

NDKの補足: NDKを使用する場合、以下のようなものが必要になります。build.gradleのサンプルはこちらです。 https://gist.github.com/khernyo/4226923

build.gradle

task copyNativeLibs(type: Copy) {
    from fileTree(dir: 'libs', include: '**/*.so' )  into  'build/native-libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
  pkgTask.jniDir new File('build/native-libs')
}

ソースはこちら

  1. http://tools.android.com/tech-docs/new-build-system/user-guide
  2. https://gist.github.com/khernyo/4226923
  3. https://github.com/ethankhall/driving-time-tracker/