diff options
author | Ben Cheng <bccheng@android.com> | 2013-05-10 13:37:56 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@android.com> | 2013-05-29 15:03:12 -0700 |
commit | 50172ca00d02886088d3a80b0a3778cde20abbbd (patch) | |
tree | ce61b6735ffb0d48fd92926015a550e67f803dde /tutorials | |
parent | f2d1fca86d4f94207eee67f54ff3eb50192dcbad (diff) | |
download | android_development-50172ca00d02886088d3a80b0a3778cde20abbbd.tar.gz android_development-50172ca00d02886088d3a80b0a3778cde20abbbd.tar.bz2 android_development-50172ca00d02886088d3a80b0a3778cde20abbbd.zip |
New tutorial app for DDMS native heap tracker.
Change-Id: Ia8d35bc1ee44c6aaffe6fa10c6339edfa053aba4
Diffstat (limited to 'tutorials')
21 files changed, 568 insertions, 0 deletions
diff --git a/tutorials/MoarRam/Android.mk b/tutorials/MoarRam/Android.mk new file mode 100644 index 000000000..c3bace94c --- /dev/null +++ b/tutorials/MoarRam/Android.mk @@ -0,0 +1,31 @@ +# Copyright (C) 2013 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) + +include $(CLEAR_VARS) + +# We only want this apk build for tests. +LOCAL_MODULE_TAGS := optional + +# Include all test java files. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := MoarRam + +include $(BUILD_PACKAGE) + +include $(CLEAR_VARS) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tutorials/MoarRam/AndroidManifest.xml b/tutorials/MoarRam/AndroidManifest.xml new file mode 100644 index 000000000..ae48aceed --- /dev/null +++ b/tutorials/MoarRam/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.benchmark.moarram" + android:versionCode="1" + android:versionName="1.0" > + + <application + android:allowBackup="true" + android:icon="@drawable/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + <activity + android:name="com.android.benchmark.moarram.MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + +</manifest> diff --git a/tutorials/MoarRam/README.txt b/tutorials/MoarRam/README.txt new file mode 100644 index 000000000..028389b2b --- /dev/null +++ b/tutorials/MoarRam/README.txt @@ -0,0 +1,14 @@ +This is a simple app that can be used as a tutorial or reference benchmark +for the development of the DDMS native heap tracker feature. It contains 3 +unique paths to allocate heap chunks: + +1) Java_com_android_benchmark_moarram_MainActivity_add32ByteBlocksNative in + foo.c (libmoarram-foo.so). Each invocation will allocate 32 bytes. +2) Java_com_android_benchmark_moarram_MainActivity_add2MByteBlocksNative in + bar.c (libmoarram-bar.so). Each invocation will allocate 2M bytes. +3) Java_com_android_benchmark_moarram_MainActivity_addVariableSizedBlocksNative + in baz.c (libmoarram-baz.so). Each invocation will allocate 17 or 71 bytes, + depending on the active button in a radio group. + +Each allocation can be freed by clicking the corresponding free button in the +UI. diff --git a/tutorials/MoarRam/jni/Android.mk b/tutorials/MoarRam/jni/Android.mk new file mode 100644 index 000000000..933cbdf3c --- /dev/null +++ b/tutorials/MoarRam/jni/Android.mk @@ -0,0 +1,43 @@ +# Copyright (C) 2013 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) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := libmoarram-32 +LOCAL_SRC_FILES := foo.c +LOCAL_SHARED_LIBRARIES += liblog + +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := libmoarram-2M +LOCAL_SRC_FILES := bar.c +LOCAL_SHARED_LIBRARIES += liblog + +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := libmoarram-17_71 +LOCAL_SRC_FILES := baz.c +LOCAL_SHARED_LIBRARIES += liblog + +include $(BUILD_SHARED_LIBRARY) diff --git a/tutorials/MoarRam/jni/bar.c b/tutorials/MoarRam/jni/bar.c new file mode 100644 index 000000000..7b00e6299 --- /dev/null +++ b/tutorials/MoarRam/jni/bar.c @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 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> +#include <cutils/log.h> + +#if defined(LOG_TAG) +#undef LOG_TAG +#define LOG_TAG "MOARRAM" +#endif + +char *gPtr2; +static int num2MByteBlocks; + +void +Java_com_android_benchmark_moarram_MainActivity_add2MByteBlocksNative( + JNIEnv* env, + jobject this) +{ + char **ptr = malloc(2*1024*1024); + *ptr = gPtr2; + gPtr2 = (char *) ptr; + num2MByteBlocks++; + ALOGW("%d 2M-byte blocks allocated so far (just allocated %p)", + num2MByteBlocks, gPtr2); +} + +void +Java_com_android_benchmark_moarram_MainActivity_free2MByteBlocksNative( + JNIEnv* env, + jobject this) +{ + if (gPtr2 == NULL) { + ALOGW("All 2M-byte blocks are freed"); + return; + } + + char **ptr = (char **) gPtr2; + gPtr2 = *ptr; + free(ptr); + num2MByteBlocks--; + ALOGW("%d 2M-byte blocks allocated so far (just freed %p)", + num2MByteBlocks, ptr); +} diff --git a/tutorials/MoarRam/jni/baz.c b/tutorials/MoarRam/jni/baz.c new file mode 100644 index 000000000..1262e40fb --- /dev/null +++ b/tutorials/MoarRam/jni/baz.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2013 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> +#include <cutils/log.h> + +#if defined(LOG_TAG) +#undef LOG_TAG +#define LOG_TAG "MOARRAM" +#endif + +char *gPtr17; +char *gPtr71; +static int num17ByteBlocks; +static int num71ByteBlocks; + +void +Java_com_android_benchmark_moarram_MainActivity_addVariableSizedBlocksNative( + JNIEnv* env, + jobject this, + jint id) +{ + int size; + char **gPtr; + char **ptr; + if (id == 0) { + size = 17; + gPtr = &gPtr17; + } else { + size = 71; + gPtr = &gPtr71; + } + ptr = malloc(size); + *ptr = *gPtr; + *gPtr = (char *) ptr; + ALOGW("%d %d-byte blocks allocated so far (just allocated %p)", + id == 0 ? ++num17ByteBlocks : ++num71ByteBlocks, + size, ptr); +} + +void +Java_com_android_benchmark_moarram_MainActivity_freeVariableSizedBlocksNative( + JNIEnv* env, + jobject this, + jint id) +{ + int size; + char **ptr; + char **gPtr; + if (id == 0) { + size = 17; + gPtr = &gPtr17; + } else { + size = 71; + gPtr = &gPtr71; + } + if (*gPtr == NULL) { + ALOGW("All %d-byte blocks are freed", size); + return; + } + ptr = (char **) *gPtr; + *gPtr = *ptr; + free(ptr); + ALOGW("%d %d-byte blocks allocated so far (just freed %p)", + id == 0 ? --num17ByteBlocks : --num71ByteBlocks, + size, ptr); +} diff --git a/tutorials/MoarRam/jni/foo.c b/tutorials/MoarRam/jni/foo.c new file mode 100644 index 000000000..a318c748d --- /dev/null +++ b/tutorials/MoarRam/jni/foo.c @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 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> +#include <cutils/log.h> + +#if defined(LOG_TAG) +#undef LOG_TAG +#define LOG_TAG "MOARRAM" +#endif + +char *gPtr; +static int num32ByteBlocks; + +void +Java_com_android_benchmark_moarram_MainActivity_add32ByteBlocksNative( + JNIEnv* env, + jobject this) +{ + char **ptr = malloc(32); + *ptr = gPtr; + gPtr = (char *) ptr; + num32ByteBlocks++; + ALOGW("%d 32-byte blocks allocated so far (just allocated %p)", + num32ByteBlocks, gPtr); +} + +void +Java_com_android_benchmark_moarram_MainActivity_free32ByteBlocksNative( + JNIEnv* env, + jobject this) +{ + if (gPtr == NULL) { + ALOGW("All 32-byte blocks are freed"); + return; + } + + char **ptr = (char **) gPtr; + gPtr = *ptr; + free(ptr); + num32ByteBlocks--; + ALOGW("%d 32-byte blocks allocated so far (just freed %p)", + num32ByteBlocks, ptr); +} diff --git a/tutorials/MoarRam/res/drawable-hdpi/ic_launcher.png b/tutorials/MoarRam/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..288b66551 --- /dev/null +++ b/tutorials/MoarRam/res/drawable-hdpi/ic_launcher.png diff --git a/tutorials/MoarRam/res/drawable-mdpi/ic_launcher.png b/tutorials/MoarRam/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..6ae570b4d --- /dev/null +++ b/tutorials/MoarRam/res/drawable-mdpi/ic_launcher.png diff --git a/tutorials/MoarRam/res/drawable-xhdpi/ic_launcher.png b/tutorials/MoarRam/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..d4fb7cd9d --- /dev/null +++ b/tutorials/MoarRam/res/drawable-xhdpi/ic_launcher.png diff --git a/tutorials/MoarRam/res/drawable-xxhdpi/ic_launcher.png b/tutorials/MoarRam/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..85a608158 --- /dev/null +++ b/tutorials/MoarRam/res/drawable-xxhdpi/ic_launcher.png diff --git a/tutorials/MoarRam/res/layout/activity_main.xml b/tutorials/MoarRam/res/layout/activity_main.xml new file mode 100644 index 000000000..8319bd76e --- /dev/null +++ b/tutorials/MoarRam/res/layout/activity_main.xml @@ -0,0 +1,104 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="fill_parent" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:orientation="vertical" + tools:context=".MainActivity" > + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="horizontal"> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/add_32" + android:layout_weight="1" + android:onClick="add32ByteBlocks" /> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/free_32" + android:layout_weight="1" + android:onClick="free32ByteBlocks" /> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="horizontal"> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/add_2m" + android:layout_weight="1" + android:onClick="add2MByteBlocks" /> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/free_2m" + android:layout_weight="1" + android:onClick="free2MByteBlocks" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/linearLayout2" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="horizontal"> + + <RadioGroup + android:id="@+id/blockSize" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:orientation="horizontal" + android:gravity="center" > + + <RadioButton + android:id="@+id/radio17" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/_17byte" + android:checked="true" /> + + <RadioButton + android:id="@+id/radio71" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/_71byte" /> + </RadioGroup> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="horizontal"> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/add_variable" + android:layout_weight="1" + android:onClick="addVariableSizedBlocks" /> + + <Button + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/free_variable" + android:layout_weight="1" + android:onClick="freeVariableSizedBlocks" /> + </LinearLayout> +</LinearLayout> diff --git a/tutorials/MoarRam/res/menu/main.xml b/tutorials/MoarRam/res/menu/main.xml new file mode 100644 index 000000000..d227c4927 --- /dev/null +++ b/tutorials/MoarRam/res/menu/main.xml @@ -0,0 +1,9 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" > + + <item + android:id="@+id/action_settings" + android:orderInCategory="100" + android:showAsAction="never" + android:title="@string/action_settings"/> + +</menu>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values-sw600dp/dimens.xml b/tutorials/MoarRam/res/values-sw600dp/dimens.xml new file mode 100644 index 000000000..1ba777d65 --- /dev/null +++ b/tutorials/MoarRam/res/values-sw600dp/dimens.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- + Customize dimensions originally defined in res/values/dimens.xml (such as + screen margins) for sw600dp devices (e.g. 7" tablets) here. + --> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values-sw720dp-land/dimens.xml b/tutorials/MoarRam/res/values-sw720dp-land/dimens.xml new file mode 100644 index 000000000..eee741a51 --- /dev/null +++ b/tutorials/MoarRam/res/values-sw720dp-land/dimens.xml @@ -0,0 +1,9 @@ +<resources> + + <!-- + Customize dimensions originally defined in res/values/dimens.xml (such as + screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. + --> + <dimen name="activity_horizontal_margin">128dp</dimen> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values-v11/styles.xml b/tutorials/MoarRam/res/values-v11/styles.xml new file mode 100644 index 000000000..541752f6e --- /dev/null +++ b/tutorials/MoarRam/res/values-v11/styles.xml @@ -0,0 +1,11 @@ +<resources> + + <!-- + Base application theme for API 11+. This theme completely replaces + AppBaseTheme from res/values/styles.xml on API 11+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Holo.Light"> + <!-- API 11 theme customizations can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values-v14/styles.xml b/tutorials/MoarRam/res/values-v14/styles.xml new file mode 100644 index 000000000..f20e01501 --- /dev/null +++ b/tutorials/MoarRam/res/values-v14/styles.xml @@ -0,0 +1,12 @@ +<resources> + + <!-- + Base application theme for API 14+. This theme completely replaces + AppBaseTheme from BOTH res/values/styles.xml and + res/values-v11/styles.xml on API 14+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> + <!-- API 14 theme customizations can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values/dimens.xml b/tutorials/MoarRam/res/values/dimens.xml new file mode 100644 index 000000000..a6dd14032 --- /dev/null +++ b/tutorials/MoarRam/res/values/dimens.xml @@ -0,0 +1,7 @@ +<resources> + + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/res/values/strings.xml b/tutorials/MoarRam/res/values/strings.xml new file mode 100644 index 000000000..0c0031dea --- /dev/null +++ b/tutorials/MoarRam/res/values/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <string name="app_name">MoarRam</string> + <string name="action_settings">Settings</string> + <string name="hello_world">Hello world!</string> + <string name="enter_num">Enter a number</string> + <string name="add_32">Add 32 bytes</string> + <string name="free_32">Free 32 bytes</string> + <string name="add_2m">Add 2M bytes</string> + <string name="free_2m">Free 2M bytes</string> + <string name="add_variable">Add 17 or 71 bytes</string> + <string name="free_variable">Free 17 or 71 bytes</string> + <string name="_17byte">17 bytes</string> + <string name="_71byte">71 bytes</string> +</resources> diff --git a/tutorials/MoarRam/res/values/styles.xml b/tutorials/MoarRam/res/values/styles.xml new file mode 100644 index 000000000..4a10ca492 --- /dev/null +++ b/tutorials/MoarRam/res/values/styles.xml @@ -0,0 +1,20 @@ +<resources> + + <!-- + Base application theme, dependent on API level. This theme is replaced + by AppBaseTheme from res/values-vXX/styles.xml on newer devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Light"> + <!-- + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + --> + </style> + + <!-- Application theme. --> + <style name="AppTheme" parent="AppBaseTheme"> + <!-- All customizations that are NOT specific to a particular API-level can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tutorials/MoarRam/src/com/android/benchmark/moarram/MainActivity.java b/tutorials/MoarRam/src/com/android/benchmark/moarram/MainActivity.java new file mode 100644 index 000000000..aa83b8cbd --- /dev/null +++ b/tutorials/MoarRam/src/com/android/benchmark/moarram/MainActivity.java @@ -0,0 +1,64 @@ +package com.android.benchmark.moarram; + +import android.os.Bundle; +import android.app.Activity; +import android.view.Menu; +import android.view.View; +import android.widget.RadioGroup; + +public class MainActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + System.loadLibrary("moarram-32"); + System.loadLibrary("moarram-2M"); + System.loadLibrary("moarram-17_71"); + setContentView(R.layout.activity_main); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + public void add32ByteBlocks(View view) { + add32ByteBlocksNative(); + } + + public void free32ByteBlocks(View view) { + free32ByteBlocksNative(); + } + + public void add2MByteBlocks(View view) { + add2MByteBlocksNative(); + } + + public void free2MByteBlocks(View view) { + free2MByteBlocksNative(); + } + + public void addVariableSizedBlocks(View view) { + + RadioGroup sizeGroup = (RadioGroup) findViewById(R.id.blockSize); + + int sizeId = sizeGroup.getCheckedRadioButtonId(); + addVariableSizedBlocksNative(sizeId == R.id.radio17 ? 0 : 1); + } + + public void freeVariableSizedBlocks(View view) { + + RadioGroup sizeGroup = (RadioGroup) findViewById(R.id.blockSize); + + int sizeId = sizeGroup.getCheckedRadioButtonId(); + freeVariableSizedBlocksNative(sizeId == R.id.radio17 ? 0 : 1); + } + + public native void add32ByteBlocksNative(); + public native void free32ByteBlocksNative(); + public native void add2MByteBlocksNative(); + public native void free2MByteBlocksNative(); + public native void addVariableSizedBlocksNative(int sizeId); + public native void freeVariableSizedBlocksNative(int sizeId); +} |