Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Eclipse ADTとAndroidStudio両方で動かせる開発環境構築

5,812 views

Published on

横浜Android and モバイルOSプラットフォーム部第38回勉強会 #yapf 発表スライド

Published in: Technology
  • Be the first to comment

Eclipse ADTとAndroidStudio両方で動かせる開発環境構築

  1. 1. Eclipse ADTと AndroidStudio両方で
 動かせる開発環境構築 @kimukou2628
  2. 2. はじめにお断り書き • すみません。あまり濃い話はできません>< • どちらかというと初心者向けのお話かと思います • 現状 eclipse ADT形式のプロジェクトをgit管理してた りしていて差分を見るために構成を変えたくない方向 けです
  3. 3. 今話の対象の方(1) • AndroidStudio(以降略 AS)はまた使い慣れない方で徐々に慣れていこ うという方 • 操作に詰まったらeclipse ADT(以降略 ADT)に戻れるようにしたいとか • (Androidなら減価償却?的に)Windowsで(いいんじゃね?という方針 で)開発している方 • JJUG CCCで公演された方のお話のような環境 • http://www.slideshare.net/s_kozake/android-android-sierjava • ASは自分の環境だと重いな∼と感じる方(特にWin)
  4. 4. 今話の対象の方(2) • 編集IDEとしてはASでもいいけどデバックしづらいと感じる方 • logcat周りの除外フィルタが使えない • フィルタの重ねとかADTだとできたり • 変数Inspectionが使えない等
 (AS1.2RCでデバック時に引数値みたいなのが見えるようになっ たりとかだいぶ改善されましたが。。。) • breakpointの位置が微妙にずれることが有る等
 • submodule(library project)は参照はしてるけど編集しない方 • NDK使っててgradle NDK DSLで書けないAndroid.mkを書いて しまっている方 • それでいて属人化はNG(メンテ性、だれでも出来る?)ということ で独自Task等を書くのが非推奨な環境の方
  5. 5. 今話の対象外かも?の方 • 一部の固定フォルダ名(app等)を存在チェックするような サードパーティ製gradle pluginを使っている方 • test用のplugin等(appフォルダ名等固定のものも有)
 • 豊富なメモリ環境/CPU環境のMacで主に開発している方 • マシンスペック自体がいいので体感的に改善されたよう に感じないかもしれません • 通信ネットワークが快適な環境前提で開発している方 • オフラインで開発することがない方
  6. 6. 前提知識編
  7. 7. build.gradleって何ぞや? •antのgroovyラッパーAntBuilder + Mavenアクセス機能
 をDSL(振る舞い言語)で記述できるようにしたビルドスクリプト言語。 •昨今では ASで比較的一般人に近い人も触れる機会が増えた為注目株。 •twitterだとASのverが上がる度に動かなくなり阿鼻叫喚な呟きが、、 •昔からantでapkをbuildしていた方は、なぜlocal.propertiesがなぜ必要 なのか辺りを実感できるかと思います •sdk.dir=XXX •ndk.dir=XXX 
 等の指定でgradleでも現在も使用中 •ADTでは必須のproject.properties は
 DSL側に記述が移動してますので不要物扱いです •その代わりに gradle.properties を追加する形が多いようです
  8. 8. single projectとmulti projectの違い •settings.gradleの有無になります
 •single projectの場合(settings.gradle無) •ADTのexport gradleを元にした構成で作ります •submoduleを再帰読込しない(出来ない)ためprojectの同期/ビ ルド等は速いです •submoduleを参照するには一手間工夫が入ります
 •multi projectの場合(settings.gradle有) •ASで新規Projectを作った場合に作られる構成です •submoduleの導入は簡単ですが、moduleが増えれば増えるほど 同期/ビルドが遅くなります(フォルダの再帰参照が遅い)
  9. 9. 実作業編
  10. 10. ■まずADT環境の構築から(構築済ならSkip) 現在ADT bundle が配布されなくなっていますが 中途半端に古い環境からupdateサイト経由で 更新しようとすると eclipseが固まったり、壊れてしまう事があるようです。 現時点版の手順を書き出してみます。 1. eclipse JavaDeveloperをダウンロードします(最新版でOK) 2. http://developer.android.com/sdk/installing/installing-adt.html
 より ADT-23.0.6.zip をダウンロードします 3. Help > Install New Software. で Add Repository-Archive でダウン ロード済のADT-23.0.6.zipを参照します 4. installを実行します 5. 依存するモジュールをダウンロードし始めてしばらくかかります。
  11. 11. ■移行手順として提供されていた
 export gradle機能を実行 •手順 •プロジェクト>右クリック>export
 から Generate Gradle build file •ルートプロジェクトを選択 •長所 •現在のADTの構成に近い形で
 build.gradleが生成 •短所 •全然メンテされていないため、SDK内のテンプレートが古い •現在はAS Pluginの内部のテンプレートが使用されている •下記のような構成があると途中で生成が失敗する
 (後は解釈に失敗すると途中生成中断する) •soが同梱されているプロジェクト •jniフォルダがあるプロジェクト •workspace直下にroot projectを生成してしまうためADT上から
 workspace直下のbuild.gradleファイルを参照できない
  12. 12. 第2段階目の作業(1) •生成後の作業として、まずexport gradleのマルチプロジェ クト構成で動く環境を作ります •workspace直下のbuild.gradleを最新Plugin参照に修正 •workspace直下のgradle-wrapper.propertiesを修正 buildscript { repositories { jcenter() } dependencies { //classpath 'com.android.tools.build:gradle:0.12.+' classpath 'com.android.tools.build:gradle:1.2.+' } } #distributionUrl=https://services.gradle.org/distributions/gradle-1.12-all.zip distributionUrl=https://services.gradle.org/distributions/gradle-2.2.1-all.zip
  13. 13. 第2段階目の作業(2) •生成に失敗したlibrary-projectに他の生成に成功した library-projectのbuild.gradleをコピー
 (ここではLobi-5.0 Project が失敗したとします) • Lobi­5.0 Projectのbuild.gradleを編集します
 
 • workspace直下のsettings.gradleを修正
 • main projectのbuild.gradleに記述を追加 sourceSets { main { java.srcDirs = ['src'] jniLibs.srcDirs=[ libs'] //☆追加 } include :Lobi-5.0' //☆追加 dependencies { compile project( :Lobi-5.0') //☆追加 }
  14. 14. •ターミナル/コマンドプロンプトで下記のコマンドを入力し
 記述チェックを行います •sh gradlew tasks •sh をつけているのはgit管理をしている場合、実行権限がない為です •windowではsh記述はいりません
 •sh gradlew assemble ̶offline 
 でビルドを走らせます
 • Lint/LICENSE.txt辺りで
 エラーになるはずなので
 main Projectのbuild.gradle 末尾に追記 •ManifiestMargerでminSDK等が
 全部一致しないとビルドが通らないので
 build.gradle/AndroidManifest.xml等を修正
 •で問題なければ、第3段階に進みます 第2段階目の作業(3) android { lintOptions { checkReleaseBuilds false abortOnError false } packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' } }
  15. 15. •main project側でmulti projectが制御できると嬉しいので下記作業をします •workspace直下 => main projectに下記のファイルをコピーします •settings.gradle •gradlew/gradlew.bat/gradleフォルダ
 •techbooster様のAndroid実践プログラミング P105 に記載のとおり
 android gradle plugin 1.1.Xベースでまた相対パス指定が可能になったので
 settings.gradleを下記のように記述を修正します •https://techbooster.booth.pm/items/75014 第3段階目の作業(1) //include :irof_history' //☆MainProjectをコメント include ':play-services-6.1.71' include ':ArcMenu' include ':QuickActionLib' include ':Lobi-5.0' project(':QuickActionLib').projectDir = new File(settingsDir,'../QuickActionLib') project(':ArcMenu').projectDir = new File(settingsDir,'../ArcMenu') project(':play-services-6.1.71').projectDir = new File(settingsDir,'../play-services-6.1.71') project(':Lobi-5.0').projectDir = new File(settingsDir,'../Lobi-5.0')
  16. 16. •この段階で mavenやsdkのlocal repository経由のライブラリを
 dependenciesで直参照するように修正することが出来ます。
 (build.gradle/settings.gradle両方修正必要)
 ただしaarから参照する場合はAndroidManifest.xmlは
 編集できませんので
 その点は注意が必要です 第3段階目の作業(2) //include ':play-services-6.1.71' include ':ArcMenu' include ':QuickActionLib' include ':Lobi-5.0' project(':QuickActionLib').projectDir = new File(settingsDir,'../QuickActionLib') project(':ArcMenu').projectDir = new File(settingsDir,'../ArcMenu') //project( :play-services-6.1.71 ).projectDir = new File(settingsDir,'../play-services-6.1.71') project(':Lobi-5.0').projectDir = new File(settingsDir,'../Lobi-5.0') repositories { mavenLocal() mavenCentral() } dependencies { //compile project(':play-services-6.1.71') compile 'com.google.android.gms:play-services:6.1.71' }
  17. 17. 第3段階目の作業(3) •main projectのbuild.gradleのままだと
 grade android pluginにアクセスできませんので
 (apply from: ../build.gradle の記述は動きません)
 workspace直下のbuild.gradleから下記の記述を移植します(最上部挿入) •第2段階目の作業(3) のコンソール作業をまた行って正常に動くか確認します •この段階でworkspace直下の
 gradlew/gradle.bat/gradle/settings.gradle/build.gradle
 等のファイルは削除しても問題ありません buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.+' } }
  18. 18. 第3段階目の作業(4) •libsによるjar参照は build.gradleではあまり推奨されてい ませんので、記述を修正したいものを修正します。下記のサ イト等で記述例検索ができます • http://gradleplease.appspot.com/ • http://mvnrepository.com/ buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.+' } } //∼以下略 //下記は修正 dependencies { //compile fileTree(dir: 'libs', include: '*.jar') compile 'com.android.support:support-v4:21.0.2' //☆ }
  19. 19. ASへのimport(1) •open an existing Android Studio project で初回IDEAプロジェクト構成を作るとき に誤読するため(移行Wizが勝手に動いてしまう)下記ファイルは一旦リネムします •pom.xml(もしあれば) •project.properties •1.2RCからwrapperで読み込む等の選択ダイアログがでなくなったので
 Configure>ProjectDefault>Settings からgradleを検索し下記の設定をします •offline workにチェック •Gradle VMOptionに -Xms512m を指定(gradle.propertiesに設定する形でも可) • org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m
  20. 20. ASへのimport(2) •open an existing Android Studio projectを実行します •main Projectのフォルダを選択します(例だと irof_history) •
 
 
 •workspace情報が作成されるまで待ちます •実機に転送されることを確認します •pom.xml/project.properties を元に戻します •これでADTでも編集できる環境が整いました
  21. 21. チューニング
  22. 22. ASが重いという方のチェックポイント(1) • offline workにちゃんとチェックが入っていますか? • offline workでのライブラリ追加手順 • build.gradleを編集 • ASのterminalで下記コマンドを実行 • sh gradlew tasks • GradleSyncを行う
 • open gradle project として初回に開く前に • sh gradlew tasks
 で事前に実行して依存モジュールを落としておくとスムーズに開けます • 逆にここで通信に失敗すると、IDEAのプロジェクトファイルが壊れま す
 (失敗した場合は関連ファイルを削除してやり直してください) • 通信+IDEAプロジェクトファイル作成 を行うと環境により激重にな り失敗する可能性が高くなります

  23. 23. ASが重いという方のチェックポイント(1) • gradlewを使ってビルドを前提にしている時 • gradle/wrapper/gradle-wrapper.properties
 のdistributionUrlがhttpになってませんか? • offlineビルドでもhttp記述だと通信しようとして重くなる事有
 フォルダ直下にDLして置いておくほうがベター • daemon/parallel モードで動かすとローカルのgradlewキャッシュの
 判定が上手くいかないことが多くて多重DL等が発生して重くなったり • 直下ではなく下記なフルパス指定でもOK
 distributionUrl=file:/D:/workspace/apk/gradle-2.2.1-all.zip #Wed Apr 10 15:27:10 PDT 2013 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists #distributionUrl=http://services.gradle.org/distributions/gradle-2.2.1-all.zip distributionUrl=gradle-2.2.1-all.zip
  24. 24. ASが重いという方のチェックポイント(3) • submoduleの数が多くないですか? • 基本ソース弄らないのであればsubmoduleのaarを作成して下記のようにバイナリ参照 する方が軽くなります • local Repositoryにupload(よくブログに載ってる方法) • この手のprojectがgithubで上がってよく動かせないことも多々(汗 • ローカルでaar参照 •軽くなる理由 •aar参照形式 •解凍してapkバイナリに結合するのみ
 (実行されるのはmain projectのタスク内) • submodule形式 •単純に実行されるタスク数が多い •taskのinputs/outputsの指定により フォルダの再帰検索等をしていて UP­TO­DATE等のチェックをしている •http://siosio.hatenablog.com/entry/2014/08/31/002105 らへんの話 •task.onlyIf{ } でも同じようなことが出来る
  25. 25. localでのaarの作成の仕方 •submodule側作業 •gradlew/gradlew.bat/gradleフォルダコピー •workspace直下のbuild.gradleから下記の記述を移植します(最上部挿入) •sh gradlew assemble で aarを作成する buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.+' } }
  26. 26. localでのaarの参照の仕方 •main project側作業 •libs_aarフォルダに 作成したLobi-5.0-debug.aarをコピー •build.gradleに記述を変更/追加 •settings.gradleからsubmoduleのエントリを消去 repositories { flatDir { dirs 'libs_aar' } } dependencies { //compile project(':Lobi-5.0') compile(name:'Lobi-5.0-debug', ext:'aar') } //include ':play-services-6.1.71' include ':ArcMenu' include ':QuickActionLib' //include ':Lobi-5.0' project(':QuickActionLib').projectDir = new File(settingsDir,'../QuickActionLib') project(':ArcMenu').projectDir = new File(settingsDir,'../ArcMenu') //project( :play-services-6.1.71 ).projectDir = new File(settingsDir,'../play-services-6.1.71') //project( :Lobi-5.0 ).projectDir = new File(settingsDir,'../Lobi-5.0')
  27. 27. IDE固有の話
  28. 28. ■ADT=ASの機能対応メモ • ADTとCodeFommaterを一致させたい • EclipseCodeFormatterを使う(.settingフォルダを参照共有) • コードフォーマッターが保存時にかからない(マクロを定義して使う) • http://qiita.com/konifar/items/1f56c82490986d1613a8 • http://qiita.com/chocomelon/items/46810763a5be0a433158 • 操作ファイルとツリーが連動したい • Projectウィンドウの設定で「Autoscroll from Source」チェック • デバック実行が途中からアタッチしたい • Attach debugger to Android proccess で接続
  29. 29. ■ASが快適だという話に関しての考察 •ADTのようにauto buildがデフォルトでないからです •プロジェクトを開くときのindex作成はADTと実は同じくらいかかります
 (aar参照形式で改善されます) •FileScannerの再帰でフォルダ検索処理が遅いという話も(特にWin) •因みに雑知識ですが、submoduleとaar形式では
 build/intermediates/exploded-aar/XXX の展開先が違います •逆にbuildするまでproblemが表示されないのでエラーがわかりづらい時もあります
 •ADT遅延の一因のandroid.jarのソース参照も下記設定をすれば多少改善されます •ライブラリプロジェクトも含めてtarget sdkを一致する •ANDROID_HOMEsourcesandroid-22 をたとえばzip圧縮する •Property>Java Build Path •Librarys>GooglePlay>android.jar>Source Attachments •Editで圧縮した android-22.zip参照 •Eclipseでaar形式のAndroidライブラリを取り込む方法 •http://qiita.com/ksoichiro/items/f68e19e70d6635a7be18 •試してみましたがすごい微妙でした(jarも展開)使わないほうがいいと思います
  30. 30. Eclipseのgradle対応の話 •現在Cloud Foundation ではなくGradlewareがサポートしているらしい •EclipseMarketから入手可能 •右クリックからbuild.gradleがbuild.xmlのように実行できるらしい •デフォルトだとwarpperみない、daemon有なので
 設定>Gradle EnlDE の項目等を変更すること
  31. 31. ASベースのライブラリの共用に関して •gradleが落としてくるjarの場所 •ADTでやる場合、gradleビルドのものを共用したい場合、 •gradlew tasks 等を実行後、下記の場所からjarをコピー •$HOME/.gradle/caches/modules-2/files-2.1
 •古いjar(library project)がほしい(support-lib/google-play-lib等) •1) Task実行後の build/intermediates/exploded-aar 辺りから取得 •2) Local Repositoryからaarを取得 •ANDROID_SDK_HOME/extras/android/m2repository •ANDROID_SDK_HOME/extras/google/m2repository •support-v4-21.0.2.aar => .zipに拡張子を変更して解凍 •class.jar => support-v4-21.0.2.jar に変更
 •resフォルダ等リソースがある場合にはフォルダごとコピーしてきて
 ライブラリプロジェクトっぽい体裁を整えて利用する •jar => libsフォルダを作って入れる •srcフォルダ作成 •project.propties等足りないファイルを他のライブラリプロジェクトからもらっ てきて補う •.projectファイルを編集して、フォルダ名と一致させる 等
  32. 32. その他
  33. 33. 知っておくといい記述(1) • AndroidManifest.xmlから設定を読み込むDSL記述 import com.android.builder.core.DefaultManifestParser android { defaultConfig { def manifestParser = new DefaultManifestParser() applicationId = manifestParser.getPackage(android.sourceSets.main.manifest.srcFile) versionName = manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) def manifest = new XmlSlurper().parse(android.sourceSets.main.manifest.srcFile) versionCode manifest.'@android:versionCode'.text() as int minSdkVersion manifestParser.getMinSdkVersion(android.sourceSets.main.manifest.srcFile) targetSdkVersion manifestParser.getTargetSdkVersion(android.sourceSets.main.manifest.srcFile) }
 }
  34. 34. 知っておくといい記述(2) • 普段release/特定Flavors使わないから BuildValiantから非表示にしたい • 因みにtestという名前のBuildType/Flavorsは作れないようです def isDebug = true if(isDebug){ android.variantFilter { variant -> //無効にしたいBuildType指定 if (variant.buildType.name.equals("release")){ variant.setIgnore(true); } //無効にしたいFlavors指定 def flavorName=variant.getFlavors().get(0).name if(flavorName.equals( hoge')){ variant.setIgnore(true); } } }
  35. 35. 知っておくといい記述(3) • build.gradleをgit管理しだすとローカルでライブラリを試している時
 直に書いてしまうとブランチ切り替えでコンフリクトして結構面倒なことが有ります • 実はbuildType/dependencies 等の設定も外出しできて、
 build.gradleファイルも最終的にマージされて実行されるので便利 • ただしAndroidTestのDSLはカスタムbuildTypeには適応されませんでした //glib_compile.gradle android { buildTypes { glib.initWith(buildTypes.debug) glib { debuggable = true zipAlignEnabled false minifyEnabled false signingConfig signingConfigs.debug proguardFiles getDefaultProguardFile('proguard-android.txt'), proguard-project.pro' }
 } } dependencies { //Glide glibCompile 'com.github.bumptech.glide:glide:3.5.2' glibCompile 'com.github.bumptech.glide:okhttp-integration:1.2.2' glibCompile 'com.github.bumptech.glide:volley-integration:1.2.2' glibCompile 'com.mcxiaoke.volley:library:1.0.+' } //build.gradle apply from: glib_compile.gradle'
  36. 36. ■packageNameSuffix/applicationIdSuffix 
 に関してのメモ •packageNameSuffix •変更するとContentProvider系で影響が出ます •http://stackoverflow.com/questions/16777534/using-build-types-in-gradle- to-run-same-app-that-uses-contentprovider-on-one-dev •http://qiita.com/ginsyama/items/574b13b755554252c9b5
 あたりの対応が必要なようです
 あまり知見的な情報が出てこないので対応すると大変かも
 •applicationIdSuffix •layout.xml等で下記のようになります
 (layout.xml系まで書き換えてくれないからだと思われます) •NG: xmlns:irof= http://schemas.android.com/apk/res/パッケージ名" •OK: xmlns:irof= http://schemas.android.com/apk/res-auto"
  37. 37. (参考)NDKのDSLに関して(1) • 事前準備として local.propertiesに下記の定義をしておく必要が有 • sdk.dir=XXX • ndk.dir=XXX
 と定義すると下記の変数として参照ができます • android.sdkDirectory • android.ndkDirectory • ソースをコンパイルする場合は • sourceSets.main.jni.srcDirs=[ jni ] • 現在は毎回ビルド走ってしまうということはないようです • ただeclipseのようにjniLibsの位置に入るわけではないのでそこら辺 も共有したければ自分でcopyTaskを書く必要はあります • コンパイル済みのsoを利用する場合は • sourceSets.main.jniLibs.srcDirs=[ libs'] • 上記の2つのルートは最終的に下記のフォルダ等に格納されます • build/intermediates/exploded-aar/XXX/jni/armeabi-v7a
  38. 38. (参考)NDKのDSLに関して(2) android { buildTypes { debug { debuggable true jniDebugBuild true ndk { moduleName "hello-jni" stl gnustl_shared //or gnustl_static cFlag -std=c99 -I${project.buildDir}/jni/incude abiFilters "armeabi", "armeabi-v7a", x86" //or all ldLibs log" }
 } } moduleName モジュール名 stl 共有ライブラリを作成する場合は gnustl_shared 指定 cFlag コンパイルフラグ abiFilters CPUアーキテクチャを指定 ldLibs ライブラリを用いる場合はここに指定

×