[解決済み] Android Studioとgradleでアンドロイドライブラリをビルドするには?
質問
Eclipseからプロジェクトを移行しようとしていますが、何をやってもうまくいきません。Eclipseには3つのプロジェクト(2つのアンドロイドアプリプロジェクトと1つのアンドロイドライブラリプロジェクト)があります。2つのアプリプロジェクトは、ライブラリプロジェクトに依存しています。gradleエクスポートを実行すると、動作しない3つのプロジェクトが表示されます。私はプロジェクトを再構築することに前向きですが、これがどのように行われるべきかについてのドキュメントは見つかっていません。
Eclipse がエクスポートする 3 つのプロジェクトを一緒に動作させる方法はありますか?物事を再構築する方がよいのでしょうか、もしそうなら、これをどのように行うべきかのドキュメントはありますか。
更新
プロジェクト全体をGitHubにアップロードしました。 https://github.com/respectTheCode/android-studio-library-example
アップデート1
Padma Kumarからの提案に基づいて、これは私が試したものです。
-
という名前の新しいプロジェクトを作成します。
MyApp
-
クリック
File > New Module
を選択します。Android Library
を選択し、その名前をMyLib
-
クリック
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
依存関係を追加しても、エラーに影響はないようです。上記から続けて
-
クリック
File > Project Structure > Modules > MyApp-MyApp
-
に切り替えます。
Dependencies
タブ -
クリック
+ > Module Dependency
をクリックしMyLib
-
クリック
Apply
とOK
-
クリック
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に大感謝です。
-
追加
compile project(':SubProjects:MyLib')
をMyLib/build.gradle
-
削除する
compile files('libs/android-support-v4.jar')
を削除します。MyLib/build.gradle
- プロジェクトを閉じ、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')
}
ソースはこちら
関連
-
Android端末にADBが接続できない!を解決。理由: デバイスが認証されていない!
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
JVMのエラーに遭遇しました。Java Runtime Environmentによって致命的なエラーが検出されました。
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Android Studioでパッケージ名を変更する
-
[解決済み] Android StudioのGradleとは?
-
[解決済み] Gradle for Androidを使用して、外部のaarパッケージを手動でインクルードする方法
-
[解決済み】Android Studioです。jarをライブラリとして追加しますか?
-
[解決済み】Android Studio Gradle すでにディスパッチされたモジュール
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
を作ってください。*** makeするルールがない エラーの原因、分析、解決策
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
AndroidでListViewを使ってカスタムテーブルを描画する
-
Android Bluetooth 開発の基本プロセス
-
アンドロイドの遅延実行のいくつかの方法
-
AndroidStudioのショートカット 検索/置換
-
[解決済み] Android studio、gradle、NDK
-
[解決済み] Android Studioでbuild.gradleに外部プロジェクトを追加する
-
[解決済み] Android Studioを使用しています。Android Manifestが存在しない、または不正なルートタグがある