既存アプリの要修正箇所の特定 AndroidStudio編

## 既存アプリの簡単な修正作業のノウハウ AndroidStudio編
IT業界の技術者派遣の会社で、客先に常駐して働いている方はQiitaを見ている方の中にもたくさんいらっしゃるかと思います。
そのような環境で働く中、経験が浅い、実務経験がない、などの理由で現場で困っている方もいると思います。
私もそんな中の一人でした。ほぼ実務経験がない状態で、会社から一人で客先に常駐することになり、
慣れるまでは本当に大変でした。
今回はそんな方々を対象に、AndroidStudioを使ったAndroidアプリ改修業務を例に、少しでもお役に立てる内容を書いていければ、と思います。
Androidアプリを例にしていますが、考え方はAndroid以外の案件にも応用できるかと思います。

### ・経験が浅いことにより現場で困るケース

1. 修正作業を任されたが、まともなドキュメントが存在せず何がなんだかわからない
2. 前任者がすでに退場しており、現場も誰に聞いても修正箇所がわからない
3. そもそも質問できる人がいない
4. プロジェクトのコードが複雑すぎて要修正箇所の特定が困難

これらのケースは特に現場に入りたての時に発生することが多いです。
もしこれらの内容で困った時は、必ず以下のことを実行しましょう。

## **ググる！**
はい、ググりましょう。
ググるというのは「Googleで検索する」、という意味です。
まあ別に検索エンジンはGoogleにこだわる必要は特にありません。
つまりは「インターネットで検索する」ということを「ググる」と表現しています。
話が逸れたので戻します。
どんな案件においても、わからないことがあったらググりましょう。
ググっても解決出来ないと思った時は、頑張って現場の有識者に質問しにいきましょう。
私は悲しいことに、現場の方と一切会話をせずに1日を終えることが多いです。
しかし、それは大抵のことはググることによって解決できている、という事情があるからなのです。

では次に、Androidアプリの案件を例に、基本的な解決方法を挙げていきます。

### **アプリのテキストの文言修正を依頼されたが、要修正箇所が分からないケース**

Androidの場合、テキストはresディレクトリのstrings.xmlというファイルに全て記載しておき、
コードから必要な時に必要なテキストを指定して取り出す、といった手法が使われています。
中にはコードに直接テキストを書き込む人がいないとも限りません。
そんな時は自力で要修正箇所を特定することが困難です。
そこで、AndroidStudioの便利なショートカットを使いましょう。

#### **Ctrl(Macの場合はcommand) + Shift + F**
AndroidStudio上でCtrl + Shift + Fを押下すると、
Find in Pathと表示されたウィンドウが表示されます。
![スクリーンショット 2018-05-07 16.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/154882/ce348790-3a77-b48a-7bf4-efae22fcce55.png)

これは検索バーに入力した文字列を、プロジェクト全体から検索してくれる非常に便利なショートカットです。
既存プロジェクトの改修作業においては、これを使わなければお話になりません。
今回の例の場合は、検索バーに「修正前の文言」を日本語　で入力しましょう。
ヒットしたら、検索した文字列のある行と、それが記載されているファイル名が表示されます。
クリックするとファイル全体が表示され、ウィンドウ上で修正することができます。

修正前の文言がわかっている場合は修正箇所の特定はこれだけで行うことができます。
もしヒットしない場合は修正前の文言が間違っている可能性が高いので、担当者に確認を取りましょう。

### **ロジックの修正を依頼されたが、修正箇所が分からないケース**
テキストと違ってロジックの修正の場合は「修正前の文言で検索する」ということができません。
前任者がすでに退場している場合厄介で、修正箇所のメソッド名やクラス名すら、現場の誰も分からない、ということがあります。
自力で特定しなければいけないケースというのはどうしても出てきてしまいます。

### 1. **要修正箇所を文字列から特定できるパターン**

修正依頼を受けた際に、実際の画面画像を提示されている場合、
文字列から要修正箇所を特定できるパターンがあります。
文字列を含むViewのロジックを修正する時などが例に挙げられます。

**例: タブの背景色を動的に変更するようにする修正**

この場合、要修正箇所はタブなので、タブに表示されている文字列があるはずです。
その**文字列をCtrl + Shift + Fで検索しましょう。**
そうすると、タブに表示されている文字列が記載された箇所がヒットします。
文字列には引用するためのIDが設定されており、多くの場合は検索してヒットした文字列と同じ行に記載されているはずです。

今度はその**IDをCtrl + Shift + Fで検索しましょう。**
そうすることで、文字列を引用している箇所がヒットします。
これで、「タブの文字列をセットしているファイル」を特定することができます。
今回の例の場合はlayoutファイルかjavaまたはktファイルがヒットするでしょう。
ファイルの特定さえ出来てしまえば、あとはそのファイル内を検索することで具体的な修正箇所を割り出せます。

##### まとめ

1.　まずは要修正箇所のViewなどに表示されている文字列をプロジェクト内検索する
2.　次に、1でヒットした文字列のIDをプロジェクト内検索する
3.　最後に、2でヒットしたファイルを開き、ファイル内検索する

このように、Ctrl + Shift + Fを駆使することで、文字列から簡単に要修正箇所を特定することが出来ます。
簡単ですが、実は結構色々なパターンの修正依頼で役に立ちます。


### 2. **要修正箇所を文字列から特定できないパターン**
Viewの修正であれば先述したように文字列から要修正箇所を特定することも出来ますが、
そうでない場合はどうやって特定したらいいのでしょうか。

**例: 複数の画面上で現在時刻を表示しているが、とある画面上では表示しないようにしたい**

こういった修正の場合、文字列からの特定が出来ません。
なので、**関連メソッドでプロジェクト内検索を行います。**

今回の例での考え方は以下になります。

現在時刻を表示している箇所を表示しないようにする
↓
現在時刻を表示している部分を削除する
↓
現在時刻を表示している部分を特定する
↓
特定するには現在時刻を表示しているメソッドをプロジェクト内検索する
↓
現在時刻を表示しているメソッドって何？
↓
**ググる**
↓
new Date(System.currentTimeMillis());で現在時刻が取得できることがわかった！
↓
Ctrl + Shift + Fで「System.currentTimeMillis」をプロジェクト内検索をする

まず修正するには、具体的に何をしている箇所を修正するかを考えます。
そこが割り出せたら、それを実現するためにはどのよう記述すればいいのかをググります。
そうすることで、ある程度要修正箇所に近くことができます。

今回の例で注意してほしいのは「**とある画面上では、表示しないようにしたい**」の部分です。
「とある画面上では」とあるので、現在時刻を取得している箇所を割り出したあとは、「とある画面」を特定する必要があります。
だいたいはファイル名から特定することができますが、
めちゃくちゃなファイル名で全く内容が推測できない、というパターンも考えられます。
その場合は

**画面を開いたらログを出力するようにして、実際に画面を開いてみましょう。**

Activityであれば、候補となるActivity全てのonCreateにsystem.out.printlnなどのログ出力メソッドを追加し、表示時にログを表示するようにします。
自分がわかりやすいメッセージを表示するようにして、コンソールでログを確認しながら画面を開きます。
こうすることで「とある画面」を特定することができます。

**「System.currentTimeMillis」をプロジェクト内検索してヒットしたが、
一つのメソッド内に記載されており、そこから色々なクラスで使用されている**

というケースも考えられます。
ここで現在時刻を表示している箇所を削除すると、全ての画面から現在時刻表示が消えてしまいます。
このメソッドが使用されているファイルの中から「とある画面」を特定する必要があります。
ここで、もう一つ、AndroidStudioの便利なショートカットを紹介します。

#### **Ctrl(Macの場合はcommand) + B or メソッド名クリック**
Ctrlを押しながらメソッド名をクリック
またはメソッド名を一度クリックしてカーソルを合わせた後にCtrl + Bを押下
こうすると、そのメソッドが使われている箇所に自動的に飛んでくれます。
複数の箇所で使用されている場合は一覧で表示され、一覧のファイル名をクリックすると使用箇所に飛んでくれます。

今回の例の場合、
**System.currentTimeMillisでプロジェクト内検索した結果、一つのメソッドがヒットし、それが複数のファイルから使われている**
というケースなので、Ctrlを押しながらメソッド名をクリックすると、複数ファイルが一覧で表示されます。
その一覧のファイル全てに、先述したようにログ表示を仕込みましょう。
そうすることで、要修正箇所にあたるファイルを特定することができるでしょう。

今回紹介させていただくのは以上になります。
長くなったので以下にまとめます。


## **まとめ**
**1. わからない箇所はググれ！
2. 基本的にはCtrl + Shift + Fでプロジェクト内検索をすればなんとかなる！
3. 文字列からの特定が困難な場合は、要修正箇所の関連メソッドをググってプロジェクト内検索を行う！
4. メソッドが特定できたらCtrl + メソッド名クリック（またはB）で使用ファイルを表示できる！
5. 確実にファイルを特定したければ該当箇所にログ表示を仕込み、実際に動かして確認しよう！**

基礎の基礎しか書いていませんが、これさえ意識しておけば、
経験が浅かったり言語の知識がなかったりしても客先でなんとかやっていけるかと思います！