Android Studioはbuild.gradleに外部プロジェクトを追加します


139

次の設定のサンプルプロジェクトがあります。

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

テストプロジェクト」は「テストライブラリ」に依存し、最後は「Pure Java Lib」に依存します。プロジェクトコンパイルとこのセットアップの起動は問題なく動作します。

私は今、以前のEclipseワークスペースをインポートしてAndroidスタジオで作業することを考えています。問題は、プロジェクトのセットアップが異なるため、この方法で維持したいと考えています。

たとえば、前の例を使用する場合:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

多くの構成を試しましたが、親フォルダーのスコープ外(例の場合は「root」)のプロジェクトを参照する方法が見つかりませんでした。

多くのプラットフォーム/モジュールでは、「..」を使用してフォルダー内を上に移動できますが、これは私にとってはうまくいきませんでした。おそらく間違って使用した可能性があります。

誰かがこれがGradleでどのように達成できるか知っていますか?

更新

私はより一般的になるように努力します:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

プロジェクトAでプロジェクトBのモジュール1を使用したいと思います。


更新:09-03-19

私はこれを今見て、更新しなければなりません...ほぼ6年後、今日、私はより賢くなり、問題は「真実の源」の概念を誤解したことであると間違いなく言えるでしょう。

ライブラリへの参照を1つ持つことはコンセプトを持つのに適していますが、「真実のソース」のように見えるかもしれませんが、REALの「真実のソース」は、各プロジェクトがそのライブラリを使用しているコードのバージョンです。ライブラリ自体にはバージョンがあります。多くのバージョンの「真実のソース」は、ライブラリを使用しているプロジェクトに関連しています。

正しい方法は、ほとんどの開発者が好まないもの、つまりgitサブモジュールを使用することです。そうすれば、各プロジェクトでソースを複製すると、各プロジェクトで異なるバージョンのコードが使用される可能性が高くなります。

ただし、すべてのプロジェクトですべてのライブラリの最新かつ最高のバージョンを使用することを目指す必要があります。これはそれ自体が課題です。

これがライブラリソースを使用してプロジェクトを開発する正しい方法である理由は、これがスケーリングするためです...それぞれ独自のライブラリ構成を持つ何百ものプロジェクトを持つことができます。


4
この質問に注意が向けられるようになりました...本当に一生懸命に取り組んだ後、今はAndroidスタジオをあきらめました。なぜなら、構築しようとしているセットアップの複雑さはあまりにも多く、最終プロジェクトの構築は可能だったからです。しかし、非常に不安定です。Androidスタジオを起動するたびに、いくつかのパラメーターを再度設定し、手動でビルドを機能させる必要がありました。あきらめてから約2ヶ月が経ちましたが、今は元気になってほしいです!
TacB0sS 2013年

ここのアプローチ2は、これを非常に簡単に行う方法を説明しています。stackoverflow.com
questions

回答:


222

Some Other Folderがgradleプロジェクトであるとすると、settings.gradleファイルに次のようなものを追加できます:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
プロジェクトフォルダに、それでsomeOtherFolderポイントは、私はAndroidのLibのプロジェクトにモジュールとして追加することが興味のモジュールがある
TacB0sS

設定dirが「ルート」を指しているので、レベルを上げる必要があります。別のプロジェクトの別のモジュールを指します。
TacB0sS 2013

その後、サブモジュールを追加できますか?':someOtherFolder:proj1'を含める
Ethan

1
いくつかの詳細を更新しました。settings.gradleは/ Project A
2013

5
すばらしい答えです。AS 1.0.2で、私はまた、次の操作を行うために必要な:右クリックモジュール- > [開く]モジュール設定を- >依存関係- > +(下)、モジュールの依存関係を選択し、リストからライブラリを選択し、[OK]をクリックします:)
T. Coutlakis

49

あなたはあなたのファイルsettings.gradleにこの行を入れなければなりません:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

次に、依存関係ツリーのbuilde.gradle(モジュール:アプリ)に次の行を追加する必要があります。

implementation project(':module2')

または、プロジェクト構造 > アプリ >依存関係」に移動し、「追加」をクリックして、「3モジュール依存関係」を選択し、モジュールを選択します


1
メインアプリからライブラリのクラスを参照することに問題がある場合、これは、ライブラリがおそらく別のバリアントで提供されているためです。したがって、適切な方法で依存関係を指定するだけですcompile project(path: ':library', configuration: 'variant')。ここで、variantで構成flavorし、buildTypeライブラリので定義されたbuild.gradleファイル。たとえばreleasedevelopフレーバーでライブラリのビルドタイプが必要な場合は、variantですdevelopRelease
Sevastyan Savanyuk 2017

9

Gradle 1.10(これが有効になる他のバージョンがわからない)では、これはここで与えられた応答に基づいて私が思いついたものですhttp://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

APIライブラリプロジェクト、共通ライブラリプロジェクト、メインアプリプロジェクトがあります。それぞれがスタンドアロンの開発プロジェクトであり、2つのライブラリは複数のアプリ間で共有されることを意図しています。

共通プロジェクトのsettings.gradleで:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

次に、メインのアプリプロジェクトのsettings.gradleで:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

それぞれのbuild.gradleファイルで、他のプロジェクトの依存関係と同じように、settings.createProjectDescriptorで指定した名前でそれらを参照するだけです。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

これは動作するようです。apiライブラリを定義する複数のDEXファイルに対してエラーをスローすることすらありませんでした。すべて同じビルドプロセスの一部であり、Gradleはそれをすべて理解できるほどスマートだったためと思います。


2
私はこれを試し続けますが、問題は、それぞれのライブラリの依存関係がロードされないように見えることです。したがって、ライブラリのみを開いている場合は問題ないように見えますが、メインのアプリからそれを試すと、インポートされたすべてのライブラリが見つからないと表示されます。
チェコ語2014

@Czechnology同じ問題がありました。解決しました。この回答についての私のコメントを参照してください:stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk 2017

9

プロジェクトを右クリック-「モジュール設定を開く」を選択-左ペインで「モジュール」を選択-上部の「+」記号をクリック-「モジュールのインポート」を選択

モジュールをインポートした後。現在のプロジェクトの依存関係として追加する必要があります。

左側のペインで「モジュール」を選択したまま、プロジェクトをクリックします。依存関係タブに移動し、下部にある「+」記号をクリックします。3番目のオプション「モジュールの依存関係」を選択します。プロジェクトを正しくインポートした場合は、現在のプロジェクトへの依存関係として追加できるすべての利用可能なモジュールを表示します。


これはほとんど機能します...依存関係モジュールの出力がbuild.gradleファイルに追加されていないため、プロジェクトをビルドできません。これはまさに私の元の問題です。
TacB0sS 2013

Gradleでは、すべてのプロジェクトを同じルートフォルダーに配置する必要があると思います。やってみて。依存関係として追加するプロジェクトを現在のプロジェクトと同じフォルダーに配置します。
Varundroid、2013

これは誰もやりたくないことですが、ATMでAndroid Studioを使用したい場合は、これが物事を機能させる方法です。私がフォローしている別の方法は、Intellijですべての依存関係をセットアップしてプロジェクトを作成し、そのプロジェクトをAndroid Studioにインポートすることです。これにより、Android StudioにGradleではなくAntビルドシステムを使用するように強制します。それが役に立てば幸い。乾杯!!
Varundroid 2013

1
@Varundroid、解決策は、最初にEthanの回答を使用してスタンドアロンライブラリへの参照をインポートすることです。次に、答えを使用してモジュールをメインアプリの依存関係に追加します。これにより、ライブラリコードを複製せずに、複数のアプリで同じライブラリを参照できます。
bcorso 2014

1

メインのAndroidプロジェクトのディレクトリの外部にあるカスタムAndroidおよびJavaライブラリを参照するにはどうすればよいですか?で、元の投稿者の意図を伴う方法でこの質問を再質問します。

そこで自分の質問に答えます。コアでは、私の回答は@Ethan(現在のスレッドで選択された回答の作成者)のGradleコーディング洞察を使用しています。しかし、私の答えは、他のいくつかの問題をナビゲートし、詳細なステップバイステップの例を提供します。


-1

イーサンが言ったように、これをsettings.gradleに追加すると、外部プロジェクトがAndroid Studioに追加されます(この例では、親フォルダーにあります)。

project(':../ProjectB/:module1')

次に、それをプロジェクトの依存関係として追加するには、そのプロジェクトのbuild.gradleに次のような別の依存関係として追加します(ここでのようにグラフィカルに行うこともできます)。

compile project(':../ProjectB/:module1')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.