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 お手軽なビルド時間の短縮メモ


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

Square 生まれのライブラリを使います.

SQLBrite

square/sqlbrite: A lightweight wrapper around SQLiteOpenHelper which introduces reactive stream semantics to SQL operations.

SQLiteOpenHelper をラップするように使い, ContentProvider(ContentResolver) のように更新を通知する役割を担当します.

SQLBrite__A_Reactive_Database_Foundation

SQLBrite: A Reactive Database Foundation

RxJava と連携させて使いましょう.


SqlBrite sqlBrite = SqlBrite.create();
BriteDatabase db = sqlBrite.wrapDatabaseHelper(openHelper, Schedulers.io());

// 対象テーブル名を含むSQLクエリーを登録
Observable<Query> users = db.createQuery("users", "SELECT * FROM users");
final AtomicInteger queries = new AtomicInteger();

// データ更新を監視して受け取る
users.subscribe(new Action1<Query>() {
  @Override public void call(Query query) {
    queries.getAndIncrement();
  }
});


System.out.println("Queries: " + queries.get()); // Prints 1

db.insert("users", createUser("jw", "Jake Wharton"));
db.insert("users", createUser("mattp", "Matt Precious"));
db.insert("users", createUser("strong", "Alec Strong"));

System.out.println("Queries: " + queries.get()); // Prints 4

このしくみを利用すると,

CursorLoader + ContentProvider

の部分を

RxJava + SQLBrite

で置き換えてリアクティブに記述できます.

MVP実装の例

googlesamples/android-architecture at dev-todo-mvp-rxjava

Observable を DataSource で作成して,

TasksLocalDataSource.java:77


    @Override
    public Observable<List<Task>> getTasks() {
        String[] projection = {
                TaskEntry.COLUMN_NAME_ENTRY_ID,
                TaskEntry.COLUMN_NAME_TITLE,
                TaskEntry.COLUMN_NAME_DESCRIPTION,
                TaskEntry.COLUMN_NAME_COMPLETED
        };
        String sql = String.format("SELECT %s FROM %s", TextUtils.join(",", projection), TaskEntry.TABLE_NAME);
        return mDatabaseHelper.createQuery(TaskEntry.TABLE_NAME, sql)
                .mapToList(mTaskMapperFunction);
    }

Repository 経由させて,

TaskRepository:96


    @Override
    public Observable<List<Task>> getTasks() {
        // ...
        if (mCacheIsDirty) {
            return remoteTasks;
        } else {

            // Query the local storage if available. If not, query the network.
            Observable<List<Task>> localTasks = mTasksLocalDataSource.getTasks();
            return Observable.concat(localTasks, remoteTasks).first();

        }
    }

Presenter 上で subscribe しておけば,

TaskPresenter:104


        Subscription subscription = mTasksRepository
                .getTasks()
                .flatMap(new Func1<List<Task>, Observable<Task>>() {
                    @Override
                    public Observable<Task> call(List<Task> tasks) {
                        return Observable.from(tasks);
                    }
                })
                .filter(new Func1<Task, Boolean>() {
		  // ...
                })
                .toList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<Task>>() {
                    @Override
                    public void onCompleted() {
                        mTasksView.setLoadingIndicator(false);
                    }

                    @Override
                    public void onError(Throwable e) {
                        mTasksView.showLoadingTasksError();
                    }

                    @Override
                    public void onNext(List<Task> tasks) {
                        processTasks(tasks);
                    }
                });

データベースで対象テーブルに更新されるとすぐに自動的に再読み込みが実行されて画面が更新されます.

MVP に CursorLoader を利用すると, Presenter で受け取るコールバックが煩雑になりやすいのでこれを使うと便利です.

DiffUtil で簡単に RecyclerView を更新する


【急げ】オライリー「Gradle Recipes for Android」が無料ダウンロード配布中!!

あのオライリーから発売されているこの本ですが.

Amazon_co_jp:_Gradle_Recipes_for_Android__Master_the_New_Build_System_for_Android__Ken_Kousen__洋書

Chapter 1 Gradle for Android Basics
1.1. Gradle Build Files in Android
1.2. Configure SDK Versions and Other Defaults
1.3. Executing Gradle Builds from the Command Line
1.4. Executing Gradle Builds from Android Studio
1.5. Adding Java Library Dependencies
1.6. Adding Library Dependencies Using Android Studio
1.7. Configuring Repositories

Chapter 2 From Project Import to Release
2.1. Setting Project Properties
2.2. Porting Apps from Eclipse ADT to Android Studio
2.3. Porting Apps from Eclipse ADT Using Eclipse
2.4. Upgrading to a Newer Version of Gradle
2.5. Sharing Settings Among Projects
2.6. Signing a Release APK
2.7. Signing a Release APK Using Android Studio

Chapter 3 Build Types and Flavors
3.1. Working with Build Types
3.2. Product Flavors and Variants
3.3. Merging Resources
3.4. Flavor Dimensions
3.5. Merging Java Sources Across Flavors

Chapter 4 Custom Tasks
4.1. Writing Your Own Custom Tasks
4.2. Adding Custom Tasks to the Build Process
4.3. Excluding Tasks
4.4. Custom Source Sets
4.5. Using Android Libraries

Chapter 5 Testing
5.1. Unit Testing
5.2. Testing with the Android Testing Support Library
5.3. Functional Testing with Robotium
5.4. Activity Testing with Espresso

Chapter 6 Performance and Documentation
6.1. Performance Recommendations
6.2. DSL Documentation
Appendix Just Enough Groovy to Get By
Appendix Gradle Basics



無料版PDFが本家Gradleのサイトからダウンロードできるようになっています!

New_Gradle_Android_Ebook_for_Free_-_Gradle

New Gradle Android Ebook for Free - Gradle

メールアドレスなど入力後, 送信されてくるメール内のリンクからダウンロードできます.

Free_ebook_from_O_Reilly__Learn_Gradle_for_Beginners

図表入りで, 初心者にもわかりやすい内容になっています.

Gradle_Recipes_for_Android

Gradle_Recipes_for_Android 2

早めにダウンロードしたほうがいいような気がします!