レガシーな環境でのテスト環境構築メモ

はじめに

Javaの認識度が低い?*1アホな環境縛りでハマったので備忘メモ

まあ一番いいのは仕事場を変えることなんだけどね・・

大企業のお仕事ってこんなとこばかりだから転職する人多いんだろうなーとか思いつつ

動作環境

縛り環境

  • gradle plugin 2.2.3
  • gradle runtime-2.14.1-bin

G様推奨環境

  • gradle plugin 2.3.3/gradle plugin 3.0.0
  • gradle runtime-4.1-bin

状況的な話


最終的にマージして動かさないといけない?条件下

お客さんの子会社が作ったサンプルの環境らしい。

そのまま作成分を追加してデモ動かしたいみたいな状況

  • gradle-experimental:0.7.2
  • gradle plugin 2.2.3

書き方は下記のページ参照

これAS2.1〜2.2時代に流行った独自NDK DSLなので*2

data-bindingが動かないというStackOverFlowを見たので検証が必要な気がする。あとで追記予定

android.dataBinding {
    enabled true
}

なのが出てきた・・・

=> 上記DSL動きませんでしたorz。stackoverflowの動いた例の

apply plugin: "android.databinding" が既にサポートされてない

on gradle-experimental:0.7.2

追記

packageOptionの記述でハマったのでメモ

お客さんがandroidの標準ライブラリ以外はNDKがほとんどだったので、記載自体がなく

外部ライブラリ追加時点でハマりましたorz*3

model {
    android {
        // package除外は多少法則が乱れる。ややこしい。
        packagingOptions.with {
            exclude 'LICENSE.txt'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE'
            exclude 'androidannotations-api.properties'
            exclude 'services/com.fasterxml.jackson.core.JsonFactory'
            exclude 'services/com.fasterxml.jackson.core.ObjectCodec'
        }
    }
}

そもそもの話

  • ndkも独自プラグインだと動作安定しないから標準に統合 on 2.3
  • Java8もJackがうまく動かないから標準に統合 on 3.0

の流れなんだけどな・・古いまま提供されている時点で、

大本のお客さん側に作った人が既に居ないとかいうオチもたまにあるのでこの業界結構怖い(汗


  • root/build.gradle
buildscript {
  repositories {
    jcenter()
  }
  dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.7.2' //バージョンは後で再確認!!
    classpath "com.android.tools.build:gradle:2.2.3" //△何でこの記載が有るんだろう??
  }
}

△ これ調べたら、mix環境じゃないと動かないlibraryが多いみたいで

  1. gradle-experimental
  2. android gradle plugin通常
  3. 順番逆にするとエラーになる

両参照で回避したというgithubのissueが引っかかるのが凄く香ばしい。

しかもバージョンにより動いたり動かなかったりがあるとのこと。

でも提供サンプルの記載見る限り javaのdependenciesが殆ど無い*4ので怖すぎるんだよね

  • app/build.gradle
dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.4.0'
        testCompile 'junit:junit:4.12'
}

これ、お客さん提供のサンプルのbuild.gradleをいじれない想定*5だとすると

libsにjar突っ込んで回避とか考えてたりするんですかね?*6


  • app/build.gradle
model {
  android{
     compileSdkVersion 23
     buildToolsVersion "23.0.3"

    defaultConfig {
       minSdkVersion 23
       targetSdkVersion 23
    }
}

ローカルでとりあえず構築した条件下

  • gradle plugin 2.2.3

  • root/build.gradle

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.android.tools.build:gradle:2.2.3"
  }
}
  • app/build.gradle
android{
     compileSdkVersion 23
     buildToolsVersion "23.0.3"

    defaultConfig {
       minSdkVersion 23
       targetSdkVersion 23
    }
}
  • gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip

追加してみたテストモジュール設定

  • app/build.gradle
dependencies {
    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.2') {
        exclude group: 'com.android.support'
    }
    androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.2') {
        exclude group: 'com.android.support'
    }
    androidTestCompile ("com.android.support.test:runner:0.5"){
        exclude group: 'com.android.support'
    }
    androidTestCompile ("com.android.support.test:rules:0.5"){
        exclude group: 'com.android.support'
    }   
    androidTestCompile "com.android.support:support-annotations:23.4.0"

        compile 'com.android.support:appcompat-v7:23.4.0' //◎◎
} 
  • ◎◎は一番下に。appcompat入れると support-library系のdependenciesはすべて入る感じ

最新のバージョンは動きません><。下記辺りで引っかかる

  • gradle runtime
  • build-tools

gradle plugin 2.3.3 以上の本来の書き方

まあ公式 大分3.0ベースに書き直されてきているので、この環境も厳しくなるんですけどね(汗

  • root/build.gradle
buildscript {
  repositories {
    google()
    jcenter()
  }
  dependencies {
    classpath "com.android.tools.build:gradle:2.3.3"
  }
}
  • app/build.gradle
android{
  compileSdkVersion 26        //★本来のベキ論環境
  buildToolsVersion "26.0.2" //★本来のベキ論環境

  defaultConfig {
    minSdkVersion 23
    targetSdkVersion 23
  }
}

dependencies {
    androidTestCompile ('com.android.support.test.espresso:espresso-core:3.0.1') {
        exclude group: 'com.android.support'
    }
    androidTestCompile ('com.android.support.test.espresso:espresso-contrib:3.0.1') {
        exclude group: 'com.android.support'
    }
    androidTestCompile ("com.android.support.test:runner:1.0.1"){
        exclude group: 'com.android.support'
    }
    androidTestCompile ("com.android.support.test:rules:1.0.1"){
        exclude group: 'com.android.support'
    }   
    androidTestCompile ('com.android.support.test.uiautomator:uiautomator-v18:2.1.2'){
        exclude group: 'com.android.support'
    }
    androidTestCompile "com.android.support:support-annotations:26.1.0"

        compile 'com.android.support:appcompat-v7:26.1.0' //◎◎
} 

その他の依存plugin

  • gradle runtime 3.3 / build tools 25.0.0 upper言われる

  • root/build.gradle

buildscript {
  repositories {
       jcenter()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://jitpack.io" }
        google()

  }
  dependencies {
     classpath 'com.github.gfx.ribbonizer:ribbonizer-plugin:2.1.0'
     classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.10'
  }
}

これPlugin作る時に指定できるのかなー(汗

  • java8 runtime依存なエラーが出た

  • root/build.gradle

buildscript {
  repositories {
    google()
    jcenter()
  }
  dependencies {
    classpath "de.mannodermaus.gradle.plugins:android-junit5:1.0.11"
  }
}
  • app/build.gradle
apply plugin: "com.android.application"
apply plugin: "de.mannodermaus.android-junit5"

dependencies {
  testCompile junit5()
  testCompile junit5Params()
  // (Optional) For running tests inside Android Studio 3.x (see below for details)
  provided junit5EmbeddedRuntime()//◎
}
  • ◎コメントしてても2.2.3 駄目。逆に違うエラーが出る感じ
  • 2.3.3 では◎も問題なし

だいじょうぶだったPlugin

  • root/build.gradle
buildscript {
  dependencies {
    classpath ('com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.11',{
    exclude module 'junit'   //★★ test実行時に干渉する><
    })
  }
  • app/build.gradle
dependencies{
   compile "org.robolectric:robolectric:3.4.2"
}

でココまで頑張って構築して、ローカルでテストしてるものの・・


  • テストをレポジトリにもコミットできない・・*7
  • だから進捗出せなくて下記みたいな状況になってるナウ・・
    • Excelベースのドキュメント報告書が主な進捗になってるところだしな・・

jenkinsとかで使う予定もあるみたいだけど、このプロジェクトビルドエラー検知以外しないつもりなのかな(汗


環境的な面で個人的に思うこと

うん。正にこれ。今の案件はそのバージョンすらイジっちゃ駄目だよ*8

な感じかなーと。日本と海外の差が歴然としてるナウ・・

まあ日本って

こういう環境を作れる人や会社に人材は集まるんだよねー

USB充電の件で言及されてたTw流れてたけど、お店の充電でもそうだけど、

バブル時期はそんなこと言われなかったそうなので、日本に精神的余裕が無いんでしょう

そこのプロパーただけ福利厚生?として

  • 冷蔵庫の使用
  • 文房具の使用
  • 電源の使用(スマホ、携帯の充電等)

なんてのが現在ザラにあるからなー*9

そんなんでスキルフルな人材の転職は止められんし来ないだろうしね

それだけパートナーさんが殆どってこともあるんでしょうけどね(苦笑

*1:C畑の人が多い職場

*2:現在廃止。ステップデバックも出来ない

*3:勿論 build.gradle環境変更申請書は書いて提出したらしい<苦笑

*4:新規プロジェクトからも削られていた記憶が・・

*5:環境変更して動かなくなった場合責任取りたくないからだそうですが・・・

*6:正直この仕事の受け方頭おかしい><。組み込み屋さんの仕事の受け方ってこんなもんなのか??

*7:開発者のローカルにしかありません

*8:責任取りたくないよ

*9:ただ正直思うに、これ経費削減な区別?差別?なだけであって福利厚生とは言わないと思う。。。