Jetpackの成り立ち

# 書いたこと

* Jetpackとは
* Jetpack以前の開発
* まとめ - 各パッケージについて
    * `android`
    * `android.support`
    * `androidx`

# Jetpackとは

2018年 Google I/Oにて発表された、これまでの `android.support` ライブラリーを取り替えるだけでなく、アーキテクトに関する機能が追加された新たな **ライブラリー群** です。

[ドキュメント](https://developer.android.com/jetpack)には、
開発者が、ベストプラクティスに従え、ボイラーコードを削減し、
各バージョンや機種を超えて動作するコードを書くことを手助けをする **ライブラリー群** であると宣言しています。

[公式HP](https://developer.android.com/jetpack)では、ドロイドくんがJetpackを背負っている。
![Screen Shot 2022-03-22 at 22.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70065/6b395903-412e-060d-52c0-cdbfb26be8a5.png)

# Jetpack以前の開発 

## 標準SDK(androidパッケージ)時代 (2008 ~ )

通常アプリ開発では、OSに搭載された機能を呼び出していくことで開発が行われます。
これは画面の開発(アニメーションも含めて)においても同じです。
標準SDKは、これら**Android OS**が提供してくれる機能にアクセスするためのライブラリーです。
この標準SDKによって提供される機能は、`android`パッケージ配下で提供されています。

例として画面を提供してくれる`Activity`は標準SDKに含まれています。

```java
// androidパッケージ配下にActivityが用意されている
import android.app.Activity;

public class SampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
```

つまりOSのバージョン毎によって、その機能が提供されているかどうかというのが非常に重要になってきます。

## android.supportライブラリの登場 (2011 ~ 2018)

### サポートライブラリの役割

アプリ開発においては、各バージョンに渡った開発が欠かせません。
そこでOSの新たな機能をアプリ側に組み込むことができる`android.support`（サポートライブラリ)が提供されるようになりました。
これによって本来サポートされていないOSのバージョンにおいても、その新機能を使うことが出来ます。

こうしたことから`android.support`ライブラリは、別名 **互換ライブラリ** とも呼ばれます。

例として`fragment`があります。
`fragment`は、Android v3.0から導入された機能ですが、サポートライブラリをアプリ側に組み込むことで、v1.6(APIレベル4)以上のAndroid OSでも`fragment`が使うことが出来ます。

例1. androidパッケージ配下のfragmentを使用する場合

Android OSに搭載されているFragment機能を使うため、v3.0以上のアプリに限られることになる。

```java
// androidパッケージ配下のfragmentを使用する
import android.app.Fragment;

public class MyFragment extends Fragment {
	public View onCreatedView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
	
```

例2. android.supportパッケージ配下のfragmentを使用する場合

アプリ側に`fragment`機能を組み込むため、apkの容量が増大するが、v1.6以降のAndroid OSでもアプリを動作させることが出来る。

```java
// supportパッケージ側のfragmentを使用する
import android.support.v4.app.Fragment;  

public class MyFragment extends Fragment {
	public View onCreatedView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
```

この際、アプリで使用する外部ライブラリーとしてサポートライブラリを追加する必要がある。

```gradle
dependencies {
	// サポートライブラリを追加する
	compile 'com.android.support:support-v4:23.3.0'
...
}
```

### サポートライブラリの主役化と肥大化

Android v5.0(2014)からマテリアルデザインが採用されたことによって、
サポートライブラリで提供される機能もより増大していきます。
またサポートライブラリーのみで提供される新機能(RecyclerViewなど)も登場します。

これによって一部でしか使われていなかったサポートライブラリは、本格的に主役となって使われるようになっていきます。

* `android.support.v4.*` - `fragment`などをサポート
* `android.support.v7.*` - マテリアルデザイン対応された `AppCompatActivity` などをサポート
* `android.support.design.*` - マテリアルデザインをサポート
*  ...

:::note warn
**v4**, **v7** について
ライブラリーのバージョンを表すのではなく、そのライブラリがサポートするAPIレベルを表している。
* v4 - APIレベル4(Android v1.6)以上で使えるライブラリ
* v7 - APIレベル7(Android v2.1)以上で使えるライブラリ
:::


例: 標準SDKのActivityではなく、サポートライブラリー側の`AppCompatActivity`を使用する場合

```java
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

...

```

こちらを使うことによって、本来Android v5.0以上でしか利用できないマテリアルデザインが、v2.1以上のAndroid OS上のアプリでも適用される。

## Jetpackの誕生 (2018 ~)

Jetpackは、このサポートライブラリと新たにArchitecutre Componentsを統合し、４つのカテゴリに分類します。

![Screen+Shot+2018-05-05+at+11.49.30+AMimage1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70065/79e25d60-d1aa-3456-3f19-80203e7cf312.png)
[画像参照元](https://developers-jp.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html)

これによって、サポートライブラリで提供されていた機能は、`android.support`パッケージ配下ではなく、`androidx`パッケージ配下に移動します。

# 各パッケージまとめ

|パッケージ名|概要|
|:---|:---|
|**android**|Android OSが提供する機能にアクセスするためのAPIを提供。標準SDKと呼ばれる。|
|**android.support**|新機能をアプリ側に組み込むことで下位互換性を提供してくれるライブラリ。別名、互換性ライブラリ。現在は、deprecatedとなり、今後サポートはされない|
|**androidx**|Jetpackのライブラリ群が収められているパッケージ|

# 参考書籍

* 2010
    * [Google Androidアプリ開発ガイド 第2版](https://www.amazon.co.jp/dp/4798027154)
    * [Androidアプリ UIデザイン & プログラミング](https://www.amazon.co.jp/dp/B00GH7KM62)
* 2011
    * [はじめてのAndroidプログラミング入門 改訂版](https://www.amazon.co.jp/dp/4798030244)
    * [Androidプログラミング入門](https://www.amazon.co.jp/dp/4777516105)
    * [ゼロからのAndroidアプリケーション開発入門](https://www.amazon.co.jp/dp/4899772793)
    * はじめてのAndroidプログラミング2
    * [Androidアプリケーション技術者ベーシック](https://www.amazon.co.jp/dp/B00G9QITA2)
* 2012
    * [AndroidSDK 開発のレシピ 第2版](https://www.amazon.co.jp/dp/4798035297)
    * [Android アプリ開発 実践ノウハウ128](https://www.amazon.co.jp/dp/4798035807)
    * [Android 4.0入門―アンドロイドプログラミングの基本](https://www.amazon.co.jp/dp/4777516776)
* 2013
    * [Androidプログラミングレシピ増補改訂版 アーキテクチャ/UI/ネットワーク編](https://www.amazon.co.jp/dp/4844334751) - データフラグメントの解説がある
* 2014
    * [Effective Android](https://www.amazon.co.jp/dp/4844335340)
    * [Android Pattern Cookbook](https://www.amazon.co.jp/dp/B00J3H9322) - 画面の開発手法が詳しく解説されており、今でも十分参考になる。マスターピース。
* 2015
    * [JavaからはじめようAndroidプログラミング](https://www.amazon.co.jp/dp/B013DX94F2)
    * [Android プログラミングバイブル SDK5/4対応](https://www.amazon.co.jp/dp/4883379701)
* 2016
    * [黒帯エンジニアが教えるプロの技術 Android開発の教科書](https://www.amazon.co.jp/dp/B01H4ONR9K) - サポートライブラリについて唯一詳細な解説がある
    * [Androidアプリ開発 パーフェクトマスター](https://www.amazon.co.jp/dp/479804847X)
    * [これ一冊でできる!Android Studio アプリ開発入門](https://www.amazon.co.jp/dp/B01KOC6WEQ)
    * [初めてのAndroid 第4版](https://www.amazon.co.jp/dp/4873117496)
* 2018
    * [基礎＆応用力をしっかり育成！ Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン](https://www.amazon.co.jp/dp/B078X8H61T)
* 2019
    * [作ればわかる！Androidプログラミング Kotlin対応 10の実践サンプルで学ぶAndroidアプリ開発入門](https://www.amazon.co.jp/dp/B07QZVVKYK/)
* 2020
    * [作って学ぶ Androidアプリ開発](https://www.amazon.co.jp/dp/B088T1SNTR)
    * [スタートダッシュAndroid　〜アプリエンジニアの必須ノウハウをサクっと押さえる](https://www.amazon.co.jp/dp/B08GBZ3F8N/)
    * [チームのスキルアップに役立つ Android開発テクニック](https://www.amazon.co.jp/dp/B08SQTG5R1) - **ktx**を使った開発手法の紹介が為になりました
    * [Android Jetpackプログラミング Android Studio 4 + Kotlin対応](https://www.amazon.co.jp/dp/B0928F25SH) - 今の所Jetpackを使ったAndroidの開発手法で唯一といえる参考書