> [Allocation Tracker Walkthrough](https://developer.android.com/intl/zh-cn/tools/performance/allocation-tracker/index.html)
# Allocation Tracker 能做什么?
追蹤內存分配信息,按順序排列,這樣我們就能清晰看出來某一個操作的內存是如何一步一步分配出來的。比如在有內存抖動的可疑點,我們可以通過查看其內存分配軌跡來看短時間內有多少相同或相似的對象被創建,進一步找出發生問題的代碼。
# Allocation Tracker使用條件
* Root手機
* 開發者選項可用
# Allocation Tracker面板

各名稱的含義如下:
| 名稱 | 意義 |
| --- | --- |
| Alloc Order | 分配序列 |
| Allocation Size | 分配的大小 |
| Allocated Class | 被分配的對象 |
| Thread Id | 線程id號 |
| Allocated in | 在哪個類分配的 |
| 第二個Allocated in | 在哪個方法分配的 |
# Allocation Tracker操作
1.首先進入你要追蹤的界面?
2.點擊`Start Tracking`按鈕,開始跟蹤內存分配軌跡?
3.操作你的界面,盡量時間短點?
4.點擊`Get Allocations`按鈕,抓去內存分配軌跡信息,顯示在右邊的面板中,默認以內存大小排序,你可以以分配順序排序或者仍以列排序。?
5.logcat中會顯示出這次的軌跡共抓到內存分配軌跡記錄數,可以簡單的理解分配了多少次內存,這個數值和Alloc order的最大值是相等的?
6.如果你不想看那么多亂七八糟的,你可以使用Filter來過濾,輸入包名就可以了。
# 實例
## 無任何操作時內存軌跡
打開首頁,點擊`Stop tracking`,然后點擊`Get Allocations`,會看到下面1~8的內存分配序列:?

再按一次`Get Allocations`會出現如下狀態:?
?
這些信息估計都是DDMS和app交互產生的內存,我們可以忽略
## 正常操作的內存軌跡
如果這個時候我們想單獨獲取某次操作的內存軌跡,首先一定要記得`Stop Tracking`再`Start Tracking`一下,讓追蹤點初始化一下,這個時候我們從首頁進入一個詳情頁,看一下我們的內存分配軌跡:?

追蹤到的內存分配3823次,看著是不是有點無從下手,沒關系,用Filter過濾下:

過濾后,就剩下了跟我們App源碼有關系的分配軌跡,我們隨便選擇一欄,可以看到其trace信息:
?
上圖中,我們可以看出來,在第2415次內存分配中,分配的是`DetailFragment`對象,占用內存272字節,處理線程Id為1,在`com.example.android.sunshine.app.DetailActivity`的`onCreate`方法中分配的。從trace信息可以看出來該方法一步一步被調用的信息。
然后我們回源碼中確認下,以下代碼就是我們上面選擇的內存分配的地方:
~~~
private final String LOG_TAG = DetailActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Log.d(LOG_TAG, "onCreate");
ActivityManager.getInstance().registerActivity(this);
if (savedInstanceState == null) {
// Create the detail fragment and add it to the activity
// using a fragment transaction.
Bundle arguments = new Bundle();
arguments.putParcelable(DetailFragment.DETAIL_URI, getIntent().getData());
DetailFragment fragment = new DetailFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.add(R.id.weather_detail_container, fragment)
.commit();
}
}
~~~