AGPBI 関連の多量のエラーを排除する

意味不明な Gradle の Warning や Error を消して激ビルド時間短縮

解決法がなく, 待っていたがビルド時間が長すぎて非効率すぎる.

Issue リストに新しい書き込み.

A temporary workaround I managed was to rollback to 2.1.3 of gradle in my project level build.gradle. No more errors and app builds fine. Going to keep it like this until a fix is pushed out. You will be prompted to upgrade to v2.2.0 when you open AS for the project, but you can ignore it.

classpath 'com.android.tools.build:gradle:2.1.3'

Issue 215748 - android - AGPBI reports errors instead of warnings - Android Open Source Project - Issue Tracker - Google Project Hosting

なので 2.2.0 から 2.1.3 に下げる.


  dependencies {
      //classpath 'com.android.tools.build:gradle:2.2.0'
      classpath 'com.android.tools.build:gradle:2.1.3'

com.android.tools.build.gradle

再度, clean build のあと, re-start や rebuild しても以下でできず.


Error:Cause: org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
<a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

gradle-wrapper.properties で gradle のバージョンを下げる.


#distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

これでいけます. ビルド時間は, 5分の1程度に短縮された感じ.

意味がなかった proguard 記述は 無効化しておく.

proguard-rules_pro

まとめ

AGPBI 関連のエラーを消すには com.android.tools.build:gradle を 2.1.3 にダウングレードする(build.gradle root の書き換え).

com.android.tools.build:gradle:2.1.3 に対応している最新バージョンの gradle は 2.14.1(gradle-wrapper.properties の書き換え).

Gradle Distributions

2016-10-14 追記

修正された模様.

Yesterday (28 hours ago) #8 [email protected]
it seems to be fixed in Android Studio 2.2.1 with the gradle wrapper 2.2.1

Yesterday (25 hours ago) #9 [email protected]
A.S. 2.2.1 fixed it for mee too

Issue 222989 - android - Android Studio 2.2 : Build successful with 1944 errors - Android Open Source Project - Issue Tracker - Google Project Hosting

実際, 試してみたが確かに修正されていた.


  dependencies {
      classpath 'com.android.tools.build:gradle:2.2.1'

gradle 3.1 でも問題はない感じ.


カンバンライクな「GitHub Projects」で 付箋のかたまりはクソとなり

いろいろな会社にお邪魔したとき,

「ウチではみんなでこのように検討して進捗を確認しています」

と言わんばかりのホワイトボードと付箋.

お客さんから見えるとこにわざと設置してない?

imgres

imgres-1

imgres-2

気持ち悪かったです.

けれど, 「カンバン」という言葉が世界で使われている程素晴らしい手法といえます.

分かりやすくて効率的です.

かんばん (ソフトウェア開発) - Wikipedia

Kanban board - Wikipedia, the free encyclopedia

それが, GitHub からリリースされています.

今すぐ使えます.

これまでどおり リポジトリを開くと「Projects」なるタブが追加されています.

googlesamples_android-architecture__a_collection_of_samples_to_discuss_and_showcase_different_architectural_tools_and_patterns_for_android_apps_

リポジトリ以下に以下の構成になっています.


  + repositories
    + projects
      + columns 
        + notes

たぶん, まずは以下の構成が基本的になると思います.
(動画から)


  + Project Board (project)
    + ToDo (column1)
    + In Progress (column2)
    + Done (column3)
    + Blocked (column4)

これで作成しておいて, 付箋の部分を「note」と呼ばれるカードで追加して, 移動させていきます.

githubu07

あとこれまでの「Issues」からも簡単に検索して「note」を追加していけますので, きっと必須なツールとなることは間違いありません.

GitHub gets built-in project management tools and support for formal reviews | TechCrunch


「Amazon Vehicles」で車でもポチる?

こゆのあったんだわ!

Amazon.com: : Vehicles

Amazon_com____Vehicles

オプションの選択とかの金額とか店舗で話してもなんかめんどくさいすよね.

とうぜんWEBなら計算できたり画像で確認できたり.

Amazon_com__2015_Toyota_Corolla_L__4-Door_Sedan_Automatic_Transmission__GS___Black_Sand_Mica__Vehicles 2

Amazon_com__2015_Toyota_Corolla_L__4-Door_Sedan_Automatic_Transmission__GS___Black_Sand_Mica__Vehicles

試乗しないのであれば, Amazonで買ってもいいように思ったり.


DiffUtil で簡単に RecyclerView を更新する

list_mail

例えば, RecyclerView で一覧を作成して表示しているとして


1. 田中一郎
2. 佐藤二郎
3. 鈴木三郎
....

サーバなどに問い合わせて取得された以下データ


1. 田中一郎
2. ジローラモ
3. 鈴木三郎
...

を一覧画面に反映させたい場合.

RecyclerView.Adapter に更新を通知する場合,

RecyclerView.Adapter | Android Developers

notify*() のうちアイテムの更新に関するものは


notifyDataSetChanged()
notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)

ですが, それぞれ以下の面倒な部分がありました.


notifyDataSetChanged()

→ 変更部分のみに関してのアニメーションが表示されない.


notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)

→ アニメーションは表示されるが, 変更部分の position を計算して渡す必要がある.

その他 hasStableIds() と Loader を使ったりなど面倒でしたよね.

DiffUtil を使う

support-library-v7 24.2.0 で登場の DiffUtil を使いましょう.

DiffUtil | Android Developers

コールバッククラス作成後, それを使った更新メソッドを Adapter 内に記述します.

MyDiffUtilCallback.java


public class MyDiffUtilCallback extends DiffUtil.Callback{

    List<Person> oldPersons;
    List<Person> newPersons;

    public MyDiffUtilCallback(List<Person> oldPersons, List<Person> newPersons) {
        this.oldPersons = oldPersons;
        this.newPersons = newPersons;
    }

    @Override
    public int getOldListSize() {
        return oldPersons.size();
    }

    @Override
    public int getNewListSize() {
        return newPersons.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldPersons.get(oldItemPosition).id == newPersons.get(newItemPosition).id;
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldPersons.get(oldItemPosition).equals(newPersons.get(newItemPosition));
    }

    @Nullable
    @Override
    public Object getChangePayload(int oldItemPosition, int newItemPosition) {
	// some additional information
        return super.getChangePayload(oldItemPosition, newItemPosition);
    }
}

MyRecyclerViewAdapter.java


public void updateList(ArrayList<Person> newList) {
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallback(this.persons, newList));
        diffResult.dispatchUpdatesTo(this);
}

これで, アイテムのポジションの計算はおまかせにして, 同時に綺麗なアニメーションが変更部分に適用されます.

実際, データ量が多い場合は厳しいようなので, RxJava なら メインスレッドにて以下.


@Override
public void onNext(DiffUtil.DiffResult result) {
    result.dispatchUpdatesTo(mProductAdapter);
}

kotlinなら同様に以下。


internal class DiffUtilCallback(
    private val oldItems: List<Item>,
    private val newItems: List<Item>
) : DiffUtil.Callback() {

  override fun getOldListSize() = oldItems.size

  override fun getNewListSize() = newItems.size

  override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int)
      = oldItems[oldItemPosition].id == newItems[newItemPosition].id

  override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int)
      = oldItems[oldItemPosition] == newItems[newItemPosition]
}

以下のように使うと便利かもしれません.

リアクティブにデータ更新検知して自動画面更新させる


75%速度向上という Gradle 3.0 を Android Studio で試す

更新されてます, Gradle が 3.0 に.

Gradle_3_0_released_-_News_-_Gradle_Forums

Gradle 3.0 released - News - Gradle Forums

Gradle_Distributions

Gradle Distributions

The Gradle Daemon is a key performance enhancer, making builds up to 75% faster, but it needed to be explicitly enabled in previous versions of Gradle. This is no longer necessary as the Daemon is now enabled by default in 3.0.

Daemon がデフォルトで起動され, 75% の速度向上らしいので.

 

Android Studio で使ってみよう

プロジェクトルートの位置で.

./gradlew wrapper --gradle-version=3.0

これで, Gradle 側はラッパーインストールできますが, Android Plugin が 2.1.x系では対応できていないようです.

最新のbetaを入れてみましょう.

com_android_tools_build_gradle

com.android.tools.build.gradle

(project-root)/build.gradle


buildscript {
  //System.properties['com.android.build.gradle.overrideVersionCheck'] = 'true'
  repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-beta1'
    }
}

Total time: 6.543 secs

Total time: 1.472 secs

小さいプロジェクトでも, 2回目以降のビルドで, 高速になったことが体感できます.

まあ, beta ということで少し待っていたほうがいいのかも知れませんが.

Latest Bugs topics - Gradle Forums

Android お手軽なビルド時間の短縮メモ