EDIT MODE

モバイルアプリ開発に関することを書いています

Android Architecture Components 勉強会#1 に参加してきました

勉強会の参加レポート

GDG東京が主催のAndroid Architecture Components 勉強会の第1回目に参加してきました。 素晴らしい勉強会だったので記事にしたかったのと、学んだことの復習のために書いてます。

ちなみにこの勉強会は全4回の予定だそうで、Lifecycles(今回) -> LiveData -> ViewModel -> Roomと続いていくそうです。

gdg-tokyo.connpass.com

第1回目の講師は「あんざい」さんで、この方は本当に発表が上手いのですが今回もとても聞きやすくて、最後まで1ミリも飽きませんでした。

前半はLifecyclesの説明で、後半はあんざいさんが用意してくださった課題をみんなで取り組みました。課題にはいくつかの問いが用意されていて、動作確認後に参加者が答える形式だったので、楽しく課題に取り組めました。

課題も1個が丁度いいボリュームで、1時間くらいしかなかったにも関わらず、全部で5個くらいやったと思います。

以下のスライドに課題も載ってますが、現地でみんなとやるのが楽しかったので、もしお時間と場所的に可能であれば第2回目に参加することをおすすめします。

Lifecyclesの復習

1. 基本

必要な設定

プロジェクトのbuild.gradleにgoogleリポジトリ(Android Gradle Plugin 3.0ならデフォルトで記述有り)を追加して、モジュールのbuild.gradleにsupport-v4もしくはappcompat-v7を入れる。理由は、v26.1.0からsupport-v4のFragmentActivityやFragmentが、Lifecycleを組み込んでいるため。

メインクラス

  • Lifecycle
    • ライフサイクル状態の取得やObserverの追加・削除を行う

Enum

  • Lifecycle.State
    • ライフサイクル状態を表すenum
  • Lifecycle.Event
    • ライフサイクルのイベントを表すenum

Interface

  • LifecycleOwner
    • Lifecycleを持つクラスを表すためのsingle method interface
  • LifecycleObserver
    • Lifecycleに追加・削除できるObserverを表すinterface
    • @OnLifecycleEvent アノテーションをつけて自分でイベントメソッドを作る
    • Lifecycle.Event.ON_ANYは全てのイベントで呼ばれる
    • 第2引数でEventを受け取れる
  • GenericLifecycleObserver
    • あんざいさんが資料作成中にドキュメントから姿を消した幻のinterface
    • 便利なんだけど今後は使用しないほうがいいかも

その他

  • LifecycleRegistry
    • 複数のObserverを扱えるLifecycleの実装

2. 拡張機能

必要な設定

モジュールのbuild.gradleに以下を追記するだけ

dependencies {
    implementation 'android.arch.lifecycle:extensions:1.0.0'
}

便利クラス

  • LifecycleService
    • LifecycleOwnerが実装されたService
  • ServiceLifecycleDispatcher
    • ServiceにLifecycle機能をもたせるためのヘルパークラス
  • ProcessLifecycleOwner
    • アプリのプロセス全体に対するLifecycleを提供
    • こいつでアプリのForeground/Background判定が簡単に出来る
    • サポートライブラリでないFragmentでも検知可能

3. 注意点

onSaveInstanceState() まわりは要注意。 SupportLibraryのFragmentでは、onSaveInstanceState()が呼ばれると状態は CREATED になるようだ。

詳細は以下を読むほうがいい。

https://developer.android.com/topic/libraries/architecture/lifecycle.html#onStop-and-savedState

4. 基本的なサンプルコード

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val TAG_NAME = MainActivity::class.java.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // create observer
        val observer = object: LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_START)
            fun calledWhenOnStart(source: LifecycleOwner) {
                Log.i(TAG_NAME, "ON_START: " + source.lifecycle.currentState.name)
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
            fun calledWhenOnAny(source: LifecycleOwner, event: Lifecycle.Event) {
                Log.i(TAG_NAME, "ON_ANY: " + source.lifecycle.currentState.name + " arg2: " + event.name)
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun calledWhenOnDestroy(source: LifecycleOwner) {
                Log.i(TAG_NAME, "ON_DESTROY: " + source.lifecycle.currentState.name)
                // onDestroy()でやるより、ここでremoveObserverするのが楽
                source.lifecycle.removeObserver(this)
            }
        }
        // 何回addしても呼ばれるのは1回
        lifecycle.addObserver(observer)
    }

Android SDKにバンドルされてるIntentアクションのリスト

知ってる人は知ってることなんでしょうけど、自分的には大発見だったので嬉しくて記事にしました。

ことの発端は、OSが投げてくるBroadcastの一覧を探してたところ、BroadcastのAPIガイドを呼んでいたら次のような一文を見つけたためです。

For a complete list of system broadcast actions, see the BROADCAST_ACTIONS.TXT file in the Android SDK.

引用:Broadcasts | Android Developers

慌ててfindコマンド叩いたら本当にありました。全然知らなかった。

$ find . -name "broadcast_actions.txt"
./platforms/android-24/data/broadcast_actions.txt
./platforms/android-25/data/broadcast_actions.txt
./platforms/android-27/data/broadcast_actions.txt
./platforms/android-21/data/broadcast_actions.txt
./platforms/android-26/data/broadcast_actions.txt
./platforms/android-19/data/broadcast_actions.txt

なるほど、APIレベルごとにあるんですね。

Android SDKにバンドルされているリスト

broadcast_actions以外にも一覧として欲しい情報が、いろいろとありました。いづれも sdk/platforms/android-[API level]/data の中にあります。

$ ls
NOTICE.txt            annotations.zip       broadcast_actions.txt features.txt          layoutlib.jar         service_actions.txt   widgets.txt
activity_actions.txt  api-versions.xml      categories.txt        fonts                 res                   tzdata
  • broadcast_actions.txt
    • OSがブロードキャストとして通知するアクションの一覧
  • features.txt
    • AndroidManifestに宣言できる機能の一覧
  • service_actions.txt
    • 各サービスを利用する際に指定するアクションの一覧(?)
  • widgets.txt
    • Viewコンポーネントの一覧(?)
  • activity_actions.txt
    • startActivity()とかで使えるアクションの一覧
  • categories.txt
    • 単なるカテゴリの一覧(?)

※ ?のものは推測です。もしかしたら別の意図のある一覧かもしれません。

まとめ

  • Android SDKには各APIレベル毎にIntentアクションなどのリストがある
  • 各リストはフルネームが列挙されてるので詳細はリファレンスで調べる必要がある

2段階認証を有効にしてるGitHubのHttps認証をMacのkeychainに登録する方法

GitHubのリモートリポジトリを、Httpsでコマンドラインから快適にアクセスするのに、2つ超えなければいけない壁があるのですが、PC買い換える度に毎回ググってるのでまとめました。 ここにまとめた内容は2段階認証を有効にしている場合です。

やること

  1. osxkeychain helper をインストールしてGit Configに設定する
  2. Personal Access Tokenを発行してkeychainに登録する

1. osxkeychain helper をインストールしてGit Configに設定する

1-1. oxkeychain helperがインストールされているか確認する。

以下のように表示されればインストール済み。そうでなければHomebrewで最新のgitをインストールする。

$ git credential-osxkeychain
Usage: git credential-osxkeychain <get|store|erase>

1-2. Gitのconfigにosxkeychain helperを使うことを登録する。

$ git config --global credential.helper osxkeychain

参考:Caching your GitHub password in Git - User Documentation

2. Personal Access Tokenを発行してkeychainに登録する

2-1. Personal Access Tokenを発行する。

Settings -> Developer Settings -> Personal access tokens -> Generate new token を選択する。

Permissionを選択する必要があるので、 repo を選択する。(delete repoもあってもいいかもしれない。)

※ tokenは作成直後しか見られないので、一時的に何かにメモっておいたほうがいい。

2-2. tokenを入力しkeychainに登録する。

リモートリポジトリにアクセスすると、プロンプトでuser nameとpasswordを聞かれるので、passwordに発行したaccess tokenを入力する。 一度入力すれば、自動的にkeychainに登録され次回からは入力を省略できる。

$ git clone https://github.com/username/repo.git
Username: [user name]
Password: [personal access token]

2-3. keychainに登録されるとgithub.comが見える。

f:id:androhi:20171212235049p:plain

参考:Creating a personal access token for the command line - User Documentation

Support Library の 2016 年の issue を振り返る

この記事は「 Qiita Advent Calendar 2016 Android その2 」の 8 日目の記事です。

Android 関連のプロダクトでオープンになっているものは、Issue Tracker で不具合報告や要望などが管理されているのは、ご存知かと思います。 今回はその中で、2016 年に SupportLibrary として issue が切られているものを、振り返ってみたいと思います。なお、調査したのは 2016/12/7 時点の内容です。

対象とした issue

  • Component が Support-Libraries のもの
  • 作成日が 2016/1/1 以降のもの
  • Status は全て対象
  • 上記を満たす issue は 1081 件

Stars Top 3

No.1 : 211 stars

  • ID : 202658
  • Summary : "New support library: support-sqlite. Allow developers to use customized sqlite with existing Android Java bindings"
  • Status : Assigned

サポート・ライブラリに SQLite を扱うためのものを、作ってみてはどうかという issue が最も多くのスターを集めていました。 背景として、Android の OS バージョンによって SQLite のバージョンがバラバラなので、開発者が SQLite をコントロールできないのは不便すぎるからということです。既に、3rd-party のもので存在するようですが、オフィシャルにサポートしてくれると嬉しいので、ぜひ実現して欲しいですね。

No.2 : 153 stars

  • ID : 210615
  • Summary : "Databinding with Jack compiler"
  • Status : Assinged

Jack Compiler で Databinding をビルドできるようにして欲しいという要望のようです。 中の人は Databinding だけ特別扱いできるものではないから、もうちょっと待ってくれとのことです。コメントを見ると徐々にゴールに向かってる感はあるっぽいですね。

No.3 : 109 stars

  • ID : 220250
  • Summary : "FAB can no longer be anchored to indirect children of CoordinatorLayout"
  • Status : Released

スクロールによって連動するようレイアウトしたはずの FAB が、期待通りに動かないという不具合報告のようです。 ver24.2.0 で issue が作成され、ver24.2.1 で修正がリリースされたとして Released になっていますが、その後も同様の現象が起きるという報告がコメントに書かれていました。 CoodinatorLayout と Anchor の組み合わせは、基本形はいいのですがいろんな要素が影響し合うとややこしいですし、使い方の問題なのか不具合なのか難しいですね。

Priority High & Critical

  • Databinding : 9 件
  • ConstraintLayout : 5 件
  • Other : 5 件

プライオリティが、 High もしくは Critical に設定されているものの内訳を、カウントしてみました。ほぼほぼ Databinding と ConstraintLayout に関するものでした。それだけ、どちらも注目度が高いということですね。

最後に

本当は、もっといろいろまとめたかったのですが、時間が無くこれしか書けませんでした。 後日改めて、ちょっとずつ書き足していきたいと思います。

最後に issue tracker からエクスポートした CSV を整理したものを貼って、記事を終えたいと思います。 https://docs.google.com/spreadsheets/d/1pG5e5GVxJmjuF6Y5RCBdsCPiQ8WKSBWZjEBoskUabrQ/edit?usp=sharing

CollaboTips vol.2 に参加しました

主にデザイナーとエンジニアを対象として、お互いに役立つ Tips を披露するという勉強会に参加してきたので、そのレポートを書きたいと思います。

概要

主旨
デザイナーとエンジニアの垣根を取り払いたい人のための勉強会

イベントページ
http://collabotips.connpass.com/event/40038/

日時
2016年10月5日(水)19:30 - 21:30

場所
株式会社 FiNC

ハッシュタグ
#CollaboTips

f:id:androhi:20161005191949j:plain

ウェルネスタイム

まずは LT の前に、FiNC トレーナーの方によるウェルネスタイムから始まりました。FiNC で勉強会が開催される時は恒例となっているようです。参加者のほとんどがデスクワークのため、上半身を中心としたストレッチ行いました。

勉強会も基本座りっぱなしなので、こういうのはいいですね。他の勉強会でも取り入れると良さそうだなと思いました。

LT : 1人5分

LT は全部で10回あり、みなさんそれぞれが本当にいろんな視点での発表だったので、とても楽しく聞くことが出来ました。 以下、発表順に要約と感想を書かせて頂きます。(資料が公開されたら、随時リンクを貼っていきます。)

そして本勉強会では、 @nnnzzz000 さんによるグラフィックレコーディングが行われました!今回の勉強会のまとめとしては、そちらをご覧になると楽しく理解できると思います。(記事の最後に画像をアップしました。)

1. kanamorit さん

タイトル: デザイナとの協働を通じて分かったこと

要約: 協働することで大切なのは、相手の提案、考え方を受け容れ任せる所は任せる。

感想: 実際に現場での経験を話されていたので、とても興味深かったです。

2. yucovin さん

タイトル: プログラミングのすごいところ

要約: デザインとは違う楽しさがあるから、興味ある人はぜひやって欲しい。

感想: デザインとプログラミングの対比がとても納得&面白かったです。

3. masaki_ohsumi さん

タイトル: デザインエンジニアという考え方

要約: デザイナーとエンジニアの橋渡しをするポジションとして、デザインエンジニアという役割を考察する。

感想: 双方の努力で溝を埋められるのもいいけど、その役割を担う人を立てるという考えも、なるほど理にかなってるなと思いました。

4. よこ[りんごマーク]てっく さん

タイトル: PhotoShop でプログラムを使い効率化を図ろう!

要約: スクリプト機能を使うと面倒な作業や些細なミスを激減出来るので試してみて欲しい。デザイナーさんの場合、難しければ周りのエンジニアにお願いしちゃおう。

感想: 座標情報とか本当に大変そうなので、自動化素晴らしいなと思いました。

5. d_date さん

タイトル: Storyboard を使えるようになりたいデザイナーのための思考実験

要約: 簡単な UI を使えるようにしつつ AutoLayout を理解する。ただし Storyboad のコンフリクトに注意。

感想: 最近は sketch 使ってるデザイナーさん多いみたいだし、割とすんなり AutoLayout は理解できるんじゃないかなと個人的には思います。

6. MutsumiOkano さん

タイトル: パッションがとっても大切だった話し

要約: 技術やツールの話しをする前に、お互いの思い(=パッション)を共有する。

感想: 同じゴールを向いてコミュニケーションすることが大切と、理解しました。そういうのひっくるめてパッションと呼ぶのいいかもしれないですね。

7. tomomasa_masuzawa さん

タイトル: 見えないデザイン

要約: よりたくさんの人にサービスを使ってもらうために、アクセシビリティに注意を払おう。

感想: iOS の VoiceOver や Android の TalkBack は、一度自分で使ってみると重要さが分かりますよね。

8. fumiyasac さん

タイトル: デザイナーだった記憶を忘れないために自分なりに気をつけていること

要約: お互いの役割を理解した上で、歩み寄って作業をすると良い。自作アプリなどで実際に自分でいつもと違う役割を体験してみるのもいい。

感想: デザイナーとエンジニアの両方を経験するのは中々難しそうなので、もしそういう人に出会ったら良く話を聞いてみたいなと思いました。

9. JPMartha さん

タイトル: Collaboration

要約: ZenHub の GitHub Project Management のブログは一見の価値あり。ユーザーストーリーをきちんと考えて共有することが大切。

感想: 僕もあまりデザイナーさんとの協働について考える機会を持たなかったので、上記ブログを全部読んでみます。

10. akio さん

タイトル: なし(急遽発表となったため)

要約: iOS の UI パーツを理解するために PlayGround が便利

感想: iPad でプログラミング&実行が楽しめるのは本当に便利そうでしたが、やはりソフトウェアキーボードは辛そうだなと思いました。

まとめ

この勉強会はデザイナーとエンジニアの垣根にフォーカスしてましたが、突き詰めていくとやはり「良いチーム作りとは?」という問題に収束していくのかなと感じました。

少し前に「チームが機能するとはどういうことか」という本を読んだのですが、その中でも職種を横断したチーム作りについて述べられていたり、いかにメンバーを尊重する(決して譲るわけではない)かなど、この勉強会の答えに繋がりそうな内容が多かったなと思います。

ということで、良いプロダクトは良いチームがあってこそ!ということを、今回再認識出来たように思いました。

グラフィックレコーディング

冒頭でふれたグラフィックレコーディングの画像です。 発表を聞きながらスラスラと書かれていたのに、なぜこんなに綺麗にまとめられているのか不思議でなりません。

f:id:androhi:20161005210952j:plain

f:id:androhi:20161005211008j:plain

f:id:androhi:20161005211037j:plain

分割されたv4 Support Librariesのリスト

1. 概要

Android Support Library のバージョン 24.2.0 がリリースされましたが、このバージョンから v4 Support Library を分割されたものが使えるようになりました。

参考:Support Library Features

以下の Library 群として提供されています。

  • support-compat
  • support-core-ui
  • support-core-utils
  • support-fragment
  • support-media-compat

とはいえ、Support Library 群で最も大きかった v4 なので、どのライブラリに何があるのか分からないのが不便だったので、調べてみました。

2. パッケージ構成

support-compat

  • android.support.v4.accessibilityservice
  • android.support.v4.animation
  • android.support.v4.app
  • android.support.v4.content
  • android.support.v4.content.pm
  • android.support.v4.content.res
  • android.support.v4.database
  • android.support.v4.graphics
  • android.support.v4.graphics.drawable
  • android.support.v4.hardware.display
  • android.support.v4.hardware.fingerprint
  • android.support.v4.internal.view
  • android.support.v4.net
  • android.support.v4.os
  • android.support.v4.text
  • android.support.v4.text.util
  • android.support.v4.util
  • android.support.v4.view
  • android.support.v4.view.accessibility
  • android.support.v4.view.animation
  • android.support.v4.widget

support-core-ui

  • android.support.v4.app
  • android.support.v4.view
  • android.support.v4.view.animation
  • android.support.v4.widget

support-core-utils

  • android.support.v4.app
  • android.support.v4.content
  • android.support.v4.content.res
  • android.support.v4.graphics
  • android.support.v4.graphics.drawable
  • android.support.v4.print
  • android.support.v4.provider
  • android.support.v4.text

support-fragment

  • android.support.v4.app

support-media-compat

  • android.support.v4.media
  • android.support.v4.media.session

パッケージ単位で分割されているわけではないので、これだけ見てもよく分かりませんね。(support-compat は、まだでかいなというは分かりますが。)

どのライブラリを使えばいいかは、クラスごとに見てみないと判断が難しそうです。

3. 提供しているクラス

注)以下のリストは、API互換性のための実装クラスは除いてあります。

support-compat

android.support.v4.accessibilityservice

  • AccessibilityServiceInfoCompat

android.support.v4.animation

  • AnimatorCompatHelper
  • AnimatorListenerCompat
  • AnimatorProvider
  • AnimatorUpdateListenerCompat
  • ValueAnimatorCompat

android.support.v4.app

  • ActivityCompat
  • ActivityManagerCompat
  • ActivityOptionsCompat
  • AppOpsManagerCompat
  • BundleCompat
  • BundleUtil
  • NotificationBuilderWithActions
  • NotificationBuilderWithBuilderAccessor
  • NotificationCompat
  • NotificationCompatExtras
  • NotificationCompatSideChannelService
  • NotificationManagerCompat
  • RemoteInput
  • ServiceCompat
  • ShareCompat
  • SharedElementCallback

android.support.v4.content

  • ContentResolverCompat
  • ContextCompat
  • IntentCompat
  • ModernAsyncTask
  • ParallelExecutorCompat
  • SharedPreferencesCompat

android.support.v4.content.pm

  • ActivityInfoCompat

android.support.v4.content.res

  • ConfigurationHelper
  • ResourcesCompat

android.support.v4.database

  • DatabaseUtilsCompat

android.support.v4.graphics

  • BitmapCompat

android.support.v4.graphics.drawable

  • DrawableCompat
  • DrawableWrapper
  • TintAwareDrawable

android.support.v4.hardware.display

  • DisplayManagerCompat

android.support.v4.hardware.fingerprint

  • FingerprintManagerCompat

android.support.v4.internal.view

  • SupportMenu
  • SupportMenuItem
  • SupportSubMenu

android.support.v4.net

  • ConnectivityManagerCompat
  • DatagramSocketWrapper
  • TrafficStatsCompat

android.support.v4.os

  • AsyncTaskCompat
  • BuildCompat
  • CancellationSignal
  • EnvironmentCompat
  • OperationCanceledException
  • ParcelableCompat
  • ParcelableCompatCreatorCallbacks
  • ResultReceiver
  • TraceCompat
  • UserManagerCompat

android.support.v4.text

  • ICUCompat
  • TextDirectionHeuristicCompat
  • TextDirectionHeuristicsCompat
  • TextUtilsCompat

android.support.v4.text.util

  • LinkifyCompat

android.support.v4.util

  • ArrayMap
  • AtomicFile
  • CircularArray
  • CircularIntArray
  • ContainerHelpers
  • DebugUtils
  • LogWriter
  • LongSparseArray
  • LruCache
  • MapCollections
  • Pair
  • PatternsCompat
  • Pools
  • SimpleArrayMap
  • SparseArrayCompat
  • TimeUtils

android.support.v4.view

  • AccessibilityDelegateCompat
  • ActionProvider
  • GestureDetectorCompat
  • GravityCompat
  • InputDeviceCompat
  • KeyEventCompat
  • LayoutInflaterCompat
  • LayoutInflaterFactory
  • MarginLayoutParamsCompat
  • MenuCompat
  • MenuItemCompat
  • MotionEventCompat
  • NestedScrollingChild
  • NestedScrollingParent
  • OnApplyWindowInsetsListener
  • PointerIconCompat
  • ScaleGestureDetectorCompat
  • ScrollingView
  • TintableBackgroundView
  • VelocityTrackerCompat
  • ViewCompat
  • ViewConfigurationCompat
  • ViewGroupCompat
  • ViewParentCompat
  • ViewPropertyAnimatorCompat
  • ViewPropertyAnimatorListener
  • ViewPropertyAnimatorListenerAdapter
  • ViewPropertyAnimatorUpdateListener
  • WindowCompat
  • WindowInsetsCompat

android.support.v4.view.accessibility

  • AccessibilityEventCompat
  • AccessibilityManagerCompat
  • AccessibilityNodeInfoCompat
  • AccessibilityNodeProviderCompat
  • AccessibilityRecordCompat
  • AccessibilityWindowInfoCompat

android.support.v4.view.animation

  • PathInterpolatorCompat

android.support.v4.widget

  • CompoundButtonCompat
  • EdgeEffectCompat
  • ListPopupWindowCompat
  • ListViewCompat
  • PopupMenuCompat
  • PopupWindowCompat
  • ScrollerCompat
  • SearchViewCompat
  • TextViewCompat
  • TintableCompoundButton

support-core-ui

android.support.v4.app

  • ActionBarDrawerToggle

android.support.v4.view

  • AbsSavedState
  • AsyncLayoutInflater
  • NestedScrollingChildHelper
  • NestedScrollingParentHelper
  • PagerAdapter
  • PagerTabStrip
  • PagerTitleStrip
  • ViewPager

android.support.v4.view.animation

  • FastOutLinearInInterpolator
  • FastOutSlowInInterpolator
  • LinearOutSlowInInterpolator
  • LookupTableInterpolator

android.support.v4.widget

  • AutoScrollHelper
  • CircleImageView
  • ContentLoadingProgressBar
  • CursorAdapter
  • CursorFilter
  • DrawerLayout
  • ExploreByTouchHelper
  • FocusStrategy
  • ListViewAutoScrollHelper
  • MaterialProgressDrawable
  • NestedScrollView
  • ResourceCursorAdapter
  • SimpleCursorAdapter
  • SlidingPaneLayout
  • Space
  • SwipeProgressBar
  • SwipeRefreshLayout
  • ViewDragHelper

support-core-utils

android.support.v4.app

  • AppLaunchChecker
  • NavUtils
  • TaskStackBuilder

android.support.v4.content

  • AsyncTaskLoader
  • CursorLoader
  • FileProvider
  • Loader
  • LocalBroadcastManager
  • PermissionChecker
  • WakefulBroadcastReceiver

android.support.v4.content.res

  • TypedArrayUtils

android.support.v4.graphics

  • ColorUtils

android.support.v4.graphics.drawable

  • RoundedBitmapDrawable
  • RoundedBitmapDrawableFactory

android.support.v4.print

  • PrintHelper

android.support.v4.provider

  • DocumentFile
  • RawDocumentFile
  • SingleDocumentFile
  • TreeDocumentFile

android.support.v4.text

  • BidiFormatter

support-fragment

android.support.v4.app

  • BackStackRecord
  • DialogFragment
  • Fragment
  • FragmentActivity
  • FragmentContainer
  • FragmentController
  • FragmentHostCallback
  • FragmentManager
  • FragmentManagerNonConfig
  • FragmentPagerAdapter
  • FragmentStatePagerAdapter
  • FragmentTabHost
  • FragmentTransaction
  • ListFragment
  • LoaderManager
  • NoSaveStateFrameLayout
  • SuperNotCalledException

support-media-compat

android.support.v4.media

  • MediaBrowserCompat
  • MediaBrowserCompatUtils
  • MediaBrowserProtocol
  • MediaBrowserServiceCompat
  • MediaDescriptionCompat
  • MediaMetadataCompat
  • RatingCompat
  • TransportController
  • TransportMediator
  • TransportMediatorCallback
  • TransportPerformer
  • TransportStateListener
  • VolumeProviderCompat

android.support.v4.media.session

  • MediaButtonReceiver
  • MediaControllerCompat
  • MediaSessionCompat
  • ParcelableVolumeInfo
  • PlaybackStateCompat

4. どのくらいの容量削減が見込めそうか?

公式サイトには

For backwards compatibility, if you list support-v4 in your Gradle script, your APK will include all of the v4 modules. However, to reduce APK size, we recommend that you just list the specific modules your app needs.

という記述があり、support-v4 を必要なものだけ組み込む方が、APK サイズが小さくなるらしいので試してみました。

以下のような条件で、アプリの APK サイズを比較してみた結果です。

共通の条件

  • Android Studio v2.1.3 で新規プロジェクトを EmptyActivity で作成
  • ProGuard なし
  • Debug ビルド
  • compileSdkVersion 24
  • support library 24.2.0
Library Size
アプリ A support-v4 1,323,263 byte
アプリ B support-core-ui
support-core-utils
support-fragment
1,322,866 byte

ということで、その差は 397 byte でした。ProGuard かければもっと差が出てくれるでしょうけど、それにしても微々たるものですね。

今回は support-compat を外して検証しましたが、仕事で触ってるアプリだったら必要だし、結局あまり分割の恩恵を受ける機会は少なそうだなと感じました。 それだけ support-v4 のお世話になってるってことですね。

「独習Python入門-1日でプログラミングに強くなる」を読みました

Python で Android アプリの Publishing を自動化するのをやりたくて、Python 入門本を探していたところ、会社の人が本書を献本いただいたという話しを聞き、お借りして読んでみたので感想を書きます。

読んだ本はこちらです。

gihyo.jp

本書の概要

本にも対象読者が記載されていますが、これからプログラミングを始める人を想定した内容となっています。

Python 言語については、その題材として用いられている側面が強く、前半は Python に限らずプログラミングの基本的な内容がメインです。後半では、Python の言語仕様やオブジェクト指向などにも触れ、Python でのスクレイピングや Web アプリケーション作成のサンプルを試したりと、より実践的な内容でした。

良かった点

一通り読み終えて、良かったなと思った点を挙げてみます。全体的な感想は最後に書いたので、ここでは具体的な内容を挙げながら、良かった点を書きました。

1. ソフトウェア・エンジニアとしても入門させてくれる

本書はプログラミング初級者向けなので、Python のセットアップや基本的な構文、関数とは?といった内容が続くのですが、ソフトウェア・エンジニアとして必要となる知識についても丁寧にフォローしてくれます。

ざっくり書くと、文字コード、絶対パス・相対パス、DRY、関数を上手に作るコツ、テストを書く理由、プロトコル(主にHTTP)などなど。最初は知らなくても何とかなるけど、良いエンジニアになるためには避けては通れないことが分かりやすく書かれています。

プログラミングを学び始めるタイミングで、これらのことを一緒に学べるように構成されているのは、素晴らしいなと思いました。

2. 広範囲な内容にも関わらず、要点は丁寧に説明されている

本書で扱っている内容は、概要でも書いた通りかなり広範囲です。オブジェクト指向や例外処理、ユニットテスト、さらには Python を使ったスクレイピングや Web アプリケーションについても触れています。

これだけの内容にも関わらず、くだけた分かり易い比喩や図解などのおかげで、基本的な部分を無理なく理解できるように工夫されているなと感じました。 もちろんサンプルコードは GitHub で公開されているので、動くコードが簡単に試せるようにも配慮されています。

3. 最終章のまとめのクオリティが素晴らしい

最後の1章は、まるまる本書全体のまとめになっています。このような構成は初めて目にしたのですが、すごくいいなと思いました。各章で重要なポイントが簡潔にまとめられていて、後でさっと読み返したいときなどは、このまとめの章を読むだけでも復習になりそうです。

さらに、読者が今後の学習の参考になるようにと、筆者の考えやおすすめの本を紹介しているのですが、きちんとテーマごとに分けて解説しているため、プログラミング初級者にとってはものすごく参考になりそうだなと思いました。

物足りなかった点

良くなかったと思った点は特に無かったので、個人的に物足りなかった点を書きました。

1. Python についてもう少し触れて欲しかった

プログラミング入門としての側面が強いためか、Python そのものについては本当に基本的な部分を抑えるに留まっているなと感じました。 ただその点は筆者も意図しているらしく、本書の中で Python の入門本はぜひ別途読んで欲しいと書かれているので、なるほどなと思っています。

2. もう少しボリュームがあっても良かったかも

これは単に既に知っている内容が多かったから、そのように感じただけだと思いました。

とは言え、スクレイピングや Web アプリケーションの章については、もう少しボリュームがあったら良かったのになと感じました。サンプルは本当にミニマムなコードなので、もう少し実用性を感じられるやや大き目のサンプルだと良かったなと感じました。

個人的な感想

前述しました通り、本書はプログラミング入門本としての側面が強いので、既にプログラミングの経験がそれなりにある人には、簡単すぎる内容かと思います。なので、そういった人が Python を新たに学びたいというケースで選ぶ本では無いように思います。

しかし、これからプログラミングを始めたい、勉強したいという人には、とても素晴らしい本だと思います。今後、もし誰かに「プログラミングをどうやって勉強したらいい?」と相談されることがあれば、僕はきっと本書をすすめると思います。本当に素晴らしい入門本だと思います。

ちなみに、中・上級のプログラミング経験者が読むメリットもあると思っています。初級者に何を説明すればいいのか?それらをどのように説明すると理解しやすいのか?といった視点で読むと、なるほどなと思える部分が多々ありました。普段当たり前のようにやっていることを、うまく説明するのはとても難しいですから...。

最後に一通り読んでみて、「プログラミング入門」とか「Python で始めるプログラミング」みたいなタイトルの方が良かったのになという感想で終わりにしたいと思います。