狠狠撸

狠狠撸Share a Scribd company logo
Eclipse ADTと
AndroidStudio両方で?
動かせる開発環境構築
@kimukou2628
はじめにお断り書き
? すみません。あまり濃い話はできません><
? どちらかというと初心者向けのお話かと思います
? 現状 eclipse ADT形式のプロジェクトをgit管理してた
りしていて差分を見るために構成を変えたくない方向
けです
今話の対象の方(1)
? AndroidStudio(以降略 AS)はまた使い慣れない方で徐々に慣れていこ
うという方
? 操作に詰まったらeclipse ADT(以降略 ADT)に戻れるようにしたいとか
? (Androidなら減価償却?的に)Windowsで(いいんじゃね?という方針
で)開発している方
? JJUG CCCで公演された方のお話のような環境
? http://www.slideshare.net/s_kozake/android-android-sierjava
? ASは自分の環境だと重いな~と感じる方(特にWin)
今話の対象の方(2)
? 編集IDEとしてはASでもいいけどデバックしづらいと感じる方
? logcat周りの除外フィルタが使えない
? フィルタの重ねとかADTだとできたり
? 変数Inspectionが使えない等?
(AS1.2RCでデバック時に引数値みたいなのが見えるようになっ
たりとかだいぶ改善されましたが。。。)
? breakpointの位置が微妙にずれることが有る等?
? submodule(library project)は参照はしてるけど編集しない方
? NDK使っててgradle NDK DSLで書けないAndroid.mkを書いて
しまっている方
? それでいて属人化はNG(メンテ性、だれでも出来る?)ということ
で独自Task等を書くのが非推奨な環境の方
今話の対象外かも?の方
? 一部の固定フォルダ名(app等)を存在チェックするような
サードパーティ製gradle pluginを使っている方
? test用のplugin等(appフォルダ名等固定のものも有)?
? 豊富なメモリ環境/CPU環境のMacで主に開発している方
? マシンスペック自体がいいので体感的に改善されたよう
に感じないかもしれません
? 通信ネットワークが快適な環境前提で開発している方
? オフラインで開発することがない方
前提知识编
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 を追加する形が多いようです
single projectとmulti projectの違い
?settings.gradleの有無になります?
?single projectの場合(settings.gradle無)
?ADTのexport gradleを元にした構成で作ります
?submoduleを再帰読込しない(出来ない)ためprojectの同期/ビ
ルド等は速いです
?submoduleを参照するには一手間工夫が入ります?
?multi projectの場合(settings.gradle有)
?ASで新規Projectを作った場合に作られる構成です
?submoduleの導入は簡単ですが、moduleが増えれば増えるほど
同期/ビルドが遅くなります(フォルダの再帰参照が遅い)
実作业编
■まず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. 依存するモジュールをダウンロードし始めてしばらくかかります。
■移行手順として提供されていた?
export gradle機能を実行
?手順
?プロジェクト>右クリック>export?
から Generate Gradle build ?le
?ルートプロジェクトを選択
?長所
?現在のADTの構成に近い形で?
build.gradleが生成
?短所
?全然メンテされていないため、SDK内のテンプレートが古い
?現在はAS Pluginの内部のテンプレートが使用されている
?下記のような構成があると途中で生成が失敗する?
(後は解釈に失敗すると途中生成中断する)
?soが同梱されているプロジェクト
?jniフォルダがあるプロジェクト
?workspace直下にroot projectを生成してしまうためADT上から?
workspace直下のbuild.gradleファイルを参照できない
第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
第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') //☆追加
}
?ターミナル/コマンドプロンプトで下記のコマンドを入力し?
記述チェックを行います
?sh gradlew tasks
?sh をつけているのはgit管理をしている場合、実行権限がない為です
?windowではsh記述はいりません?
?sh gradlew assemble ?o?ine ?
でビルドを走らせます?
? Lint/LICENSE.txt辺りで?
エラーになるはずなので?
main Projectのbuild.gradle 末尾に追記
?Mani?estMargerで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'
}
}
?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')
?この段階で 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'
}
第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.+'
}
}
第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 ?leTree(dir: 'libs', include: '*.jar')
compile 'com.android.support:support-v4:21.0.2' //☆
}
ASへのimport(1)
?open an existing Android Studio project で初回IDEAプロジェクト構成を作るとき
に誤読するため(移行Wizが勝手に動いてしまう)下記ファイルは一旦リネムします
?pom.xml(もしあれば)
?project.properties
?1.2RCからwrapperで読み込む等の選択ダイアログがでなくなったので?
Con?gure>ProjectDefault>Settings からgradleを検索し下記の設定をします
?o?ine workにチェック
?Gradle VMOptionに -Xms512m を指定(gradle.propertiesに設定する形でも可)
? org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m
ASへのimport(2)
?open an existing Android Studio projectを実行します
?main Projectのフォルダを選択します(例だと irof_history)
??
?
?
?workspace情報が作成されるまで待ちます
?実機に転送されることを確認します
?pom.xml/project.properties を元に戻します
?これでADTでも編集できる環境が整いました
チューニング
ASが重いという方のチェックポイント(1)
? o?ine workにちゃんとチェックが入っていますか?
? o?ine workでのライブラリ追加手順
? build.gradleを編集
? ASのterminalで下記コマンドを実行
? sh gradlew tasks
? GradleSyncを行う?
? open gradle project として初回に開く前に
? sh gradlew tasks?
で事前に実行して依存モジュールを落としておくとスムーズに開けます
? 逆にここで通信に失敗すると、IDEAのプロジェクトファイルが壊れま
す?
(失敗した場合は関連ファイルを削除してやり直してください)
? 通信+IDEAプロジェクトファイル作成 を行うと環境により激重にな
り失敗する可能性が高くなります?
ASが重いという方のチェックポイント(1)
? gradlewを使ってビルドを前提にしている時
? gradle/wrapper/gradle-wrapper.properties?
のdistributionUrlがhttpになってませんか?
? o?ineビルドでもhttp記述だと通信しようとして重くなる事有?
フォルダ直下にDLして置いておくほうがベター
? daemon/parallel モードで動かすとローカルのgradlewキャッシュの?
判定が上手くいかないことが多くて多重DL等が発生して重くなったり
? 直下ではなく下記なフルパス指定でもOK?
distributionUrl=?le:/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
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{ } でも同じようなことが出来る
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.+'
}
}
localでのaarの参照の仕方
?main project側作業
?libs_aarフォルダに 作成したLobi-5.0-debug.aarをコピー
?build.gradleに記述を変更/追加
?settings.gradleからsubmoduleのエントリを消去
repositories {
?atDir {
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')
滨顿贰固有の话
■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 で接続
■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も展開)使わないほうがいいと思います
Eclipseのgradle対応の話
?現在Cloud Foundation ではなくGradlewareがサポートしているらしい
?EclipseMarketから入手可能
?右クリックからbuild.gradleがbuild.xmlのように実行できるらしい
?デフォルトだとwarpperみない、daemon有なので?
設定>Gradle EnlDE の項目等を変更すること
ASベースのライブラリの共用に関して
?gradleが落としてくるjarの場所
?ADTでやる場合、gradleビルドのものを共用したい場合、
?gradlew tasks 等を実行後、下記の場所からjarをコピー
?$HOME/.gradle/caches/modules-2/?les-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ファイルを編集して、フォルダ名と一致させる?等
その他
知っておくといい記述(1)
? AndroidManifest.xmlから設定を読み込むDSL記述
import com.android.builder.core.DefaultManifestParser
android {
defaultCon?g {
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)
}?
}
知っておくといい記述(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 ?avorName=variant.getFlavors().get(0).name
if(?avorName.equals( hoge')){
variant.setIgnore(true);
}
}
}
知っておくといい記述(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
signingCon?g signingCon?gs.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'
■packageNameSu?x/applicationIdSu?x ?
に関してのメモ
?packageNameSu?x
?変更するとContentProvider系で影響が出ます
?http://stackover?ow.com/questions/16777534/using-build-types-in-gradle-
to-run-same-app-that-uses-contentprovider-on-one-dev
?http://qiita.com/ginsyama/items/574b13b755554252c9b5?
あたりの対応が必要なようです?
あまり知見的な情報が出てこないので対応すると大変かも?
?applicationIdSu?x
?layout.xml等で下記のようになります?
(layout.xml系まで書き換えてくれないからだと思われます)
?NG: xmlns:irof= http://schemas.android.com/apk/res/パッケージ名"
?OK: xmlns:irof= http://schemas.android.com/apk/res-auto"
(参考)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
(参考)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 ライブラリを用いる場合はここに指定

More Related Content

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