CA.apk #4 記事

今天參加的活動是 CyberAgent 定期會舉辦的 Android 相關的聚會，由於最近幾乎一整天都在寫 Android 就決定跑來聽聽了。

- connpass 活動頁: https://cyberagent.connpass.com/event/65347/
- 這次的講者主要是 CyberAgent 旗下媒體類的公司的 Android 工程師

以下是今天晚上聽的講題

| 標題 | 講者 | 簡報 |
|---|:---:|---|---|
| **AmebaアプリでのCI改善**<br>*（Ameba App CI 的改善）* | 今中 幸太<br>[Ameba](https://play.google.com/store/apps/details?id=jp.ameba&hl=ja) | *後補* |
| **View Animation**<br>*（View 的動畫）* | 竹田 智<br>[AbemaTV](https://play.google.com/store/apps/details?id=tv.abema&hl=ja) | *後補* |
| **運用３年のタップル誕生でJavaからKotlin移行した話**<br>*（ Tapple 誕生後營運三年從 Java 移轉到 Kotlin 的那些事）* | 向中野 亘<br>[tapple](https://play.google.com/store/apps/details?id=jp.co.matchingagent.cocotsure) | *後補* |
| **RxJava1 -> RxJava2移行**<br>*（從 RxJava1 升級到 RxJava2）* | 清水 泰博<br>[AWA](https://play.google.com/store/apps/details?id=fm.awa.liverpool&hl=ja) | *後補* |

## AmebaアプリでのCI改善 / Ameba App CI 的改善

**講者:** 今中 幸太 ／ 株式会社サイバーエージェント

### 一開始碰到的問題

- CI 的地位很低，就算是執行錯誤或是 Timeout ，還是不太有人在意
- 因為沒有並行執行，所以效率很差
- 執行的時間超長，原先執行一次要花 21:56

### 測試

- 使用 Firebase Test Lab 以及 [Robolectric](http://robolectric.org/)

### 成果

- 降低一半左右的單次執行時間 → 耗時 12:12
- 解決無法在裝置上自動化測試的問題


### 解決執行時間很長的問題

- 準備一個專案本身自己的 SDK 資料夾，把 Android Home 的資料夾指向該資料夾，減少在 CI 的過程需要準備 SDK 的時間
- 加上這樣 `parallel:true` 的設定，讓他可以並行執行（預設是關閉的）

### 未來想做

- Lint
- 使用 [danger/danger](https://github.com/danger/danger)
- Automation Release 

等等

## View Animation / View 的動畫

**講者** 竹田 智 ／ 株式会社AbemaTV

### 動畫的三大種類

- view animation
- property animation (API 11 開始)
- drawable animation

**Material Design 裡面有提到**

- Motion provides meaning

### View Transition Customize

**轉場種類：**

- Enter - 進入畫面
- Exit - 退出畫面
- Shared Elements (可以把當下畫面的物件帶到下一個畫面去）
  - API 21~
  - 可以參考 Google Play Store 點開一個項目的 App Icon 移動


### 非同步載入圖片碰到的問題

```
supportPostponeEnterTransition() // 暫停
supportStartPostponedEnterTransition() // 重開
```

在畫面切換的時候，在自訂過場的時候會因為非同步載入大圖，造成體驗的延遲

> 但是又想要維持操作體驗

**解法：** Glide 的 thumbnail support （可以同時讀入多張圖片）

thumbnail → animation → show original image

### 其他 Tips

* 轉場時，轉場的物件不想被 status 或 navigation bar 擋住時，可以 把 status 或 navigation bar 放進 shared element transition 
* 畫面轉向無法控制過程的動畫
    * 可以在 onMapSharedElementCallback 處理

### 總結

- Animation Types
- 動畫的連續性
- Shared Element Transition, transition Name, Activity Options
- 和非同步載入圖片一起使用動畫時需要注意的事情

## 運用３年のタップル誕生でJavaからKotlin移行した話 / Tapple 誕生後營運三年從 Java 移轉到 Kotlin 的那些事

**講者：** 向中野 亘　／　株式会社マッチングエージェント

### 導入 Kotlin 的原因

- Android 已經正式支援
- 現代語言
- 與 Java 的互換性高
- 集團內用 Kotlin 開發的人更多了，也有一些轉移到 Kotlin 的團隊
- 可以一併進行架構改善
- Java 工程師的話學習的成本低

**還有大家都想寫**

### 準備方式和資源

- 每週一次讀書會
  - Kotlin Koans 全 42 問
  - 在讀書會裡面分享和解題
  - 不是只有看書，自己做過一次會比較有感覺
- 關注 Kotlin 的 Advent Calendar

### 成員組成

- 建議裡面一定要有一個經驗者
- 功能開發和 Kotlin 移行同時進行
- 新功能直接使用 Kotlin

### 進行方式

- reviewer 一定要包含有經驗者

#### **問題：** 功能開發和導入 Kotlin 要平行進行非常困難

- 優先開發新功能就漸漸不寫 kotlin 了

#### **問題：** Nullable/NonNull 不知道是什麼東西和不知道怎麼應對

無法一個一個確定 API 裡面有哪些數值可能會是 Null，因為有一百三十四十左右支

#### **問題：** 寫法太自由

- 不知道該怎麼寫比較好
- Scope 方法不知道該怎麼用
  - `apply` - 變化 property 的時候可以用
  - `run`
  - `let` - nullable 常用
  - `also`
  
※ [Kotlin スコープ関数 用途まとめ (ngsw_taro)](https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e) / Kotlin Scope 方法使用方式總覽

### 總結

- 營運歷史更久的服務，程式碼的負債越多就越難導入
- 能夠集中導入就導入，避免要分心做新功能就忘記要導入
- Nullable anotation
- 解決因為寫法自由產生的問題
  - 團隊要有共識
  - 制定程式碼風格
- 搞清楚 Scope 變數

## RxJava1 -> RxJava2移行 / 從 RxJava1 升級到 RxJava2

**講者：** 清水 泰博　／　AWA株式会社

講題分兩個階段

- 不停止開發轉移到 RxJava2 的方法
- AWA 的做法

### 不停止開發轉移到 RxJava2 的方法

因為 1 和 2 差很多，所以不要一口氣升

可以用這個 Library 輔助升級

> RxJava2Interop

### AWA 的做法

主要有講到因為 App 本身有分層的架構，所以可以一層一層保留 Interface ，慢慢搭配 RxJava2Interop 從單層的內部轉移到 2 ，最後再去動之間 Interface 

另外也有推這個 library

- https://github.com/gojuno/koptional