diff options
| author | 2018-02-16 14:22:27 +0000 | |
|---|---|---|
| committer | 2018-02-16 14:22:27 +0000 | |
| commit | d937c49b19a6005cf94e23d464415be47e995d9b (patch) | |
| tree | a92fec4d5198d1e56b9c1f5e0ba000869191dc3b | |
| parent | 2b7e1c6d04930361bafbd4959966341fa7c4a097 (diff) | |
| parent | 2b5a65db5018f5d04c558bca9c42f7ecdf59cbcc (diff) | |
Merge changes I609c26d3,Id7aa1375,I3e39924c,I154ec761
* changes:
AMM: Add graphics models.
AMM: Add SoCode model.
AMM: Add Bitmap model.
Initial checkin of actionable memory metric.
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | tools/amm/AmmTest/AndroidManifest.xml | 17 | ||||
| -rw-r--r-- | tools/amm/AmmTest/aahat.png | bin | 0 -> 6904 bytes | |||
| -rw-r--r-- | tools/amm/AmmTest/jni/ammtest.c | 228 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/BitmapUse.java | 33 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/MainActivity.java | 46 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/SoCodeUse.java | 30 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/SurfaceViewUse.java | 71 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/TextureViewUse.java | 69 | ||||
| -rw-r--r-- | tools/amm/AmmTest/src/com/android/amm/test/ThreadedRendererUse.java | 64 | ||||
| -rw-r--r-- | tools/amm/Android.mk | 34 | ||||
| -rw-r--r-- | tools/amm/README.md | 16 | ||||
| -rw-r--r-- | tools/amm/models/Bitmap.md | 15 | ||||
| -rw-r--r-- | tools/amm/models/DexCode.md | 17 | ||||
| -rw-r--r-- | tools/amm/models/Graphics.md | 22 | ||||
| -rw-r--r-- | tools/amm/models/JavaHeap.md | 8 | ||||
| -rw-r--r-- | tools/amm/models/SoCode.md | 17 |
17 files changed, 688 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk index a6eb0be77c..2489308c02 100644 --- a/Android.mk +++ b/Android.mk @@ -79,6 +79,7 @@ include $(art_path)/build/Android.cpplint.mk include $(art_path)/oatdump/Android.mk include $(art_path)/tools/Android.mk include $(art_path)/tools/ahat/Android.mk +include $(art_path)/tools/amm/Android.mk include $(art_path)/tools/dexfuzz/Android.mk include $(art_path)/libart_fake/Android.mk diff --git a/tools/amm/AmmTest/AndroidManifest.xml b/tools/amm/AmmTest/AndroidManifest.xml new file mode 100644 index 0000000000..16529bc054 --- /dev/null +++ b/tools/amm/AmmTest/AndroidManifest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest + xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.amm.test"> + + <application + android:label="AmmTest" + android:debuggable="true"> + + <activity android:name="com.android.amm.test.MainActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tools/amm/AmmTest/aahat.png b/tools/amm/AmmTest/aahat.png Binary files differnew file mode 100644 index 0000000000..01b92f4ebc --- /dev/null +++ b/tools/amm/AmmTest/aahat.png diff --git a/tools/amm/AmmTest/jni/ammtest.c b/tools/amm/AmmTest/jni/ammtest.c new file mode 100644 index 0000000000..9d4847526e --- /dev/null +++ b/tools/amm/AmmTest/jni/ammtest.c @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jni.h" + +// A large uninitialized array gets put in the .bss section: +char uninit[3 * 4096]; + +// A large initialized array gets put in the .data section: +char init[2 * 4096] = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.." + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.."; + +// A large constant initialized array gets put in the .rodata section: +const char cinit[1 * 4096] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.." + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.."; + +JNIEXPORT jint JNICALL +Java_com_android_amm_test_SoCodeUse_nGetANumber(JNIEnv* env, jclass cls) { + (void) env; + (void) cls; + + uninit[4096] = init[123] + cinit[123]; + return 42; +} + diff --git a/tools/amm/AmmTest/src/com/android/amm/test/BitmapUse.java b/tools/amm/AmmTest/src/com/android/amm/test/BitmapUse.java new file mode 100644 index 0000000000..d8eba2ea20 --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/BitmapUse.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +/** + * Exercise loading of a bitmap. + */ +class BitmapUse { + + private Bitmap mBitmap; + + public BitmapUse() { + ClassLoader loader = BitmapUse.class.getClassLoader(); + mBitmap = BitmapFactory.decodeStream(loader.getResourceAsStream("aahat.png"), null, null); + } +} diff --git a/tools/amm/AmmTest/src/com/android/amm/test/MainActivity.java b/tools/amm/AmmTest/src/com/android/amm/test/MainActivity.java new file mode 100644 index 0000000000..4577f4b062 --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/MainActivity.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.LinearLayout; + +public class MainActivity extends Activity { + + private BitmapUse mBitmapUse; + private SoCodeUse mSoCodeUse; + private TextureViewUse mTextureViewUse; + private SurfaceViewUse mSurfaceViewUse; + private ThreadedRendererUse mThreadedRendererUse; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mBitmapUse = new BitmapUse(); + mSoCodeUse = new SoCodeUse(); + + LinearLayout ll = new LinearLayout(this); + mTextureViewUse = new TextureViewUse(this, ll, 200, 500); + mSurfaceViewUse = new SurfaceViewUse(this, ll, 240, 250); + setContentView(ll); + + mThreadedRendererUse = new ThreadedRendererUse(this, 122, 152); + } +} + diff --git a/tools/amm/AmmTest/src/com/android/amm/test/SoCodeUse.java b/tools/amm/AmmTest/src/com/android/amm/test/SoCodeUse.java new file mode 100644 index 0000000000..9636c0f96c --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/SoCodeUse.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +class SoCodeUse { + private int value; + + public SoCodeUse() { + // TODO: Figure out how to cause the native library to be unloaded when + // the SoCodeUse instance goes away? + System.loadLibrary("ammtestjni"); + value = nGetANumber(); + } + + private static native int nGetANumber(); +} diff --git a/tools/amm/AmmTest/src/com/android/amm/test/SurfaceViewUse.java b/tools/amm/AmmTest/src/com/android/amm/test/SurfaceViewUse.java new file mode 100644 index 0000000000..0c17c77c3f --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/SurfaceViewUse.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +import android.content.Context; +import android.graphics.Canvas; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.ViewGroup; + +class SurfaceViewUse { + + private SurfaceView mSurfaceView; + + /** + * Constructs a SurfaceView object with given dimensions. + * The surface view is added to the given ViewGroup object, which should be + * included in the main display. + */ + public SurfaceViewUse(Context context, ViewGroup vg, int width, int height) { + mSurfaceView = new SurfaceView(context); + vg.addView(mSurfaceView, width, height); + mSurfaceView.post(new CycleRunnable()); + } + + // To force as many graphics buffers as will ever be used to actually be + // used, we cycle the color of the surface view a handful of times right + // when things start up. + private class CycleRunnable implements Runnable { + private int mCycles = 0; + private int mRed = 255; + private int mGreen = 0; + private int mBlue = 255; + + public void run() { + if (mCycles < 10) { + mCycles++; + updateSurfaceView(); + mSurfaceView.post(this); + } + } + + private void updateSurfaceView() { + SurfaceHolder holder = mSurfaceView.getHolder(); + Canvas canvas = holder.lockHardwareCanvas(); + if (canvas != null) { + canvas.drawRGB(mRed, mGreen, mBlue); + int tmp = mRed; + holder.unlockCanvasAndPost(canvas); + mRed = mGreen; + mGreen = mBlue; + mBlue = tmp; + } + } + } +} + diff --git a/tools/amm/AmmTest/src/com/android/amm/test/TextureViewUse.java b/tools/amm/AmmTest/src/com/android/amm/test/TextureViewUse.java new file mode 100644 index 0000000000..51ffcd244f --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/TextureViewUse.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +import android.content.Context; +import android.graphics.Canvas; +import android.view.TextureView; +import android.view.ViewGroup; + +class TextureViewUse { + + private TextureView mTextureView; + + /** + * Constructs a TextureView object with given dimensions. + * The texture view is added to the given ViewGroup object, which should be + * included in the main display. + */ + public TextureViewUse(Context context, ViewGroup vg, int width, int height) { + mTextureView = new TextureView(context); + vg.addView(mTextureView, width, height); + mTextureView.post(new CycleRunnable()); + } + + // To force as many graphics buffers as will ever be used to actually be + // used, we cycle the color of the texture view a handful of times right + // when things start up. + private class CycleRunnable implements Runnable { + private int mCycles = 0; + private int mRed = 255; + private int mGreen = 255; + private int mBlue = 0; + + public void run() { + if (mCycles < 10) { + mCycles++; + updateTextureView(); + mTextureView.post(this); + } + } + + private void updateTextureView() { + Canvas canvas = mTextureView.lockCanvas(); + if (canvas != null) { + canvas.drawRGB(mRed, mGreen, mBlue); + int tmp = mRed; + mTextureView.unlockCanvasAndPost(canvas); + mRed = mGreen; + mGreen = mBlue; + mBlue = tmp; + } + } + } +} + diff --git a/tools/amm/AmmTest/src/com/android/amm/test/ThreadedRendererUse.java b/tools/amm/AmmTest/src/com/android/amm/test/ThreadedRendererUse.java new file mode 100644 index 0000000000..9c25612881 --- /dev/null +++ b/tools/amm/AmmTest/src/com/android/amm/test/ThreadedRendererUse.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.amm.test; + +import android.content.Context; +import android.view.WindowManager; +import android.widget.TextView; + +class ThreadedRendererUse { + + private TextView mTextView; + + /** + * Cause a threaded renderer EGL allocation to be used, with given + * dimensions. + */ + public ThreadedRendererUse(Context context, int width, int height) { + mTextView = new TextView(context); + mTextView.setText("TRU"); + mTextView.setBackgroundColor(0xffff0000); + + // Adding a view to the WindowManager (as opposed to the app's root view + // hierarchy) causes a ThreadedRenderer and EGL allocations under the cover. + // We use a TextView here to trigger the use case, but we could use any + // other kind of view as well. + WindowManager wm = context.getSystemService(WindowManager.class); + WindowManager.LayoutParams layout = new WindowManager.LayoutParams(); + layout.width = width; + layout.height = height; + wm.addView(mTextView, layout); + + mTextView.post(new CycleRunnable()); + } + + // To force as many graphics buffers as will ever be used to actually be + // used, we cycle the text of the text view a handful of times right + // when things start up. + private class CycleRunnable implements Runnable { + private int mCycles = 0; + + public void run() { + if (mCycles < 10) { + mCycles++; + mTextView.setText("TRU " + mCycles); + mTextView.post(this); + } + } + } +} + diff --git a/tools/amm/Android.mk b/tools/amm/Android.mk new file mode 100644 index 0000000000..47030c5a7a --- /dev/null +++ b/tools/amm/Android.mk @@ -0,0 +1,34 @@ +# Copyright (C) 2017 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + +# --- ammtestjni.so ------------- +include $(CLEAR_VARS) +LOCAL_MODULE := libammtestjni +LOCAL_SRC_FILES := $(call all-c-files-under, AmmTest/jni) +LOCAL_SDK_VERSION := current +include $(BUILD_SHARED_LIBRARY) + +# --- AmmTest.apk -------------- +include $(CLEAR_VARS) +LOCAL_PACKAGE_NAME := AmmTest +LOCAL_MODULE_TAGS := samples tests +LOCAL_SRC_FILES := $(call all-java-files-under, AmmTest/src) +LOCAL_SDK_VERSION := current +LOCAL_JNI_SHARED_LIBRARIES := libammtestjni +LOCAL_JAVA_RESOURCE_FILES := $(LOCAL_PATH)/AmmTest/aahat.png +LOCAL_MANIFEST_FILE := AmmTest/AndroidManifest.xml +include $(BUILD_PACKAGE) + diff --git a/tools/amm/README.md b/tools/amm/README.md new file mode 100644 index 0000000000..17f94a8d44 --- /dev/null +++ b/tools/amm/README.md @@ -0,0 +1,16 @@ +# Actionable Memory Metric + +The goal of the actionable memory metric (AMM) is to provide a view of an +application's memory use that application developers can track, understand, +and control. AMM can be thought of as a Java heap dump augmented with models +for non-Java allocations that app developers have some control of. + +There are two components of the actionable memory metric: +1. The value of the metric. +2. An actionable breakdown of the value of the metric. + +The metric is made up of a collection of separate models for different +categories of memory use. Each model contributes to the value and actionable +breakdown of the overall metric. + +See models/ for a list of models proposed for the actionable memory metric. diff --git a/tools/amm/models/Bitmap.md b/tools/amm/models/Bitmap.md new file mode 100644 index 0000000000..49a0b9d79a --- /dev/null +++ b/tools/amm/models/Bitmap.md @@ -0,0 +1,15 @@ +# Bitmap Model + +The value of the Bitmap model is the sum of bytes used for native pixel data +of instances of `android.graphics.Bitmap`. It is calculated by summing for +each instance `x` of `android.graphics.Bitmap`: + + x.getAllocationByteCount() + +The actionable breakdown of the Bitmap model is a breakdown by +`android.graphics.Bitmap` instance, including width, height, and ideally a +thumbnail image of each bitmap. + +For example, an 800 x 600 bitmap instance using the `ARGB_8888` pixel format +with native pixel data will be shown as an 800 x 600 bitmap instance taking up +1875 kB. diff --git a/tools/amm/models/DexCode.md b/tools/amm/models/DexCode.md new file mode 100644 index 0000000000..a907280db9 --- /dev/null +++ b/tools/amm/models/DexCode.md @@ -0,0 +1,17 @@ +# Dex Code Model + +The value of the Dex Code model is the sum of the original uncompressed file +sizes of all loaded dex files. It is calculated using the best approximation +of the dex file size available to us on device. On Android O, for example, +this can be approximated as the virtual size of the corresponding memory +mapped `.vdex` file read from `/proc/self/maps`. Different Android platform +versions and scenarios may require different approximations. + +The actionable breakdown of the dex code model is a breakdown by +`dalvik.system.DexFile` instance. Further breakdown of individual dex files +can be achieved using tools such as dexdump. + +For example, for an application `AmmTest.apk` that has a single `classes.dex` file +that is 500 KB uncompressed, the `DexFile` instance for +`/data/app/com.android.amm.test-_uHI4CJWpeoztbjN6Tr-Nw==/base.apk` is shown as +Taking up 500 KB (or the best available approximation thereof). diff --git a/tools/amm/models/Graphics.md b/tools/amm/models/Graphics.md new file mode 100644 index 0000000000..b327961a64 --- /dev/null +++ b/tools/amm/models/Graphics.md @@ -0,0 +1,22 @@ +# Graphics Models + +There are three components to the graphics model, each modeling EGL memory +use: +1. For each `android.view.TextureView` instance: + 2 * (4 * width * height) + +2. For each `android.view.Surface$HwuiContext` instance: + 3 * (4 * width * height) + +3. For each initialized `android.view.ThreadedRenderer`: + 3 * (4 * width * height) + +Note: 4 is the number of bytes per pixel. 2 or 3 is the maximum number of +buffers that may be allocated. + +The actionable breakdown is the breakdown by `TextureView`, +`Surface$HwuiContext` and `ThreadedRenderer` instance, with further details +about the width and height associated with each instance. + +For example, an application with a single 64x256 `TextureView` instance will +be shown as taking up 128 KB. diff --git a/tools/amm/models/JavaHeap.md b/tools/amm/models/JavaHeap.md new file mode 100644 index 0000000000..c34c1865c0 --- /dev/null +++ b/tools/amm/models/JavaHeap.md @@ -0,0 +1,8 @@ +# Java Heap Model + +The value of the Java heap model is the sum of bytes of Java objects allocated +on the Java heap. It can be calculated using: + + Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() + +A Java heap dump is used for an actionable breakdown of the Java heap. diff --git a/tools/amm/models/SoCode.md b/tools/amm/models/SoCode.md new file mode 100644 index 0000000000..5d3184ebbf --- /dev/null +++ b/tools/amm/models/SoCode.md @@ -0,0 +1,17 @@ +# Shared Native Code Model + +The value of the Shared Native Code model is the sum of the virtual memory +sizes of all loaded `.so` files. It is calculated by reading `/proc/self/maps`. + +The actionable breakdown of the shared native code model is a breakdown by +library name. Unfortunately, due to technical limitations, this does not +include information about what caused a library to be loaded, whether the +library was loaded by the app or the platform, the library dependency graph, +or what is causing a library to remain loaded. Individual `.so` files can be +further broken down using tools such as `readelf`. + +For example, for an application `AmmTest.apk` that includes `libammtestjni.so` as a +native library that loads 36 KB worth of memory regions, `BaseClassLoader` will +be shown with library +`/data/app/com.android.amm.test-_uHI4CJWpeoztbjN6Tr-Nw==/lib/arm64/libammtestjni.so` +taking up 36 KB. |