Why do big Android activity locks not work?

I am trying to create a unit-test for an Activity with a lot of methods for testing. But after about 31 tests, the application will be killed, because the heap is lost from memory.

1152 E SurfaceFlinger createSurface() failed, generateId = -12 1152 W WindowManager OutOfResourcesException creating surface 1152 I WindowManager Out of memory for surface! Looking for leaks... 1152 W WindowManager No leaked surfaces; killing applicatons! 1152 W ActivityManager Killing processes Free memory at adjustment 1 

I did a unit test with 40 identical simple test cases to find the problem. But it seems that the GC is not fast enough to clear memory during tests.

Here is my test test testTest:

 package my.app; import android.os.Debug; import android.test.ActivityInstrumentationTestCase2; import android.util.Log; public class leakTest extends ActivityInstrumentationTestCase2<TestActivityAndroid> { String TAG = "leakTest"; TestActivityAndroid mActivity = null; public leakTest() { super(TestActivityAndroid.class); } protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); mActivity = getActivity(); } protected void tearDown() throws Exception { super.tearDown(); } private void printHeapSize() { Log.e(TAG, "NativeHeapAllocatedSize = " + Debug.getNativeHeapAllocatedSize()); Log.e(TAG, "NativeHeapFreeSize = " + Debug.getNativeHeapFreeSize()); Log.e(TAG, "NativeHeapSIZE = " + Debug.getNativeHeapSize()); } public void test_1() { assertNotNull(mActivity); } public void test_2() { assertNotNull(mActivity); } public void test_3() { assertNotNull(mActivity); } public void test_4() { assertNotNull(mActivity); } public void test_5() { assertNotNull(mActivity); } public void test_6() { assertNotNull(mActivity); } public void test_7() { assertNotNull(mActivity); } public void test_8() { assertNotNull(mActivity); } public void test_9() { assertNotNull(mActivity); } public void test_10() { assertNotNull(mActivity); } public void test_11() { assertNotNull(mActivity); } public void test_12() { assertNotNull(mActivity); } public void test_13() { assertNotNull(mActivity); } public void test_14() { assertNotNull(mActivity); } public void test_15() { assertNotNull(mActivity); } public void test_16() { assertNotNull(mActivity); } public void test_17() { assertNotNull(mActivity); } public void test_18() { assertNotNull(mActivity); } public void test_19() { assertNotNull(mActivity); } public void test_20() { assertNotNull(mActivity); } public void test_21() { assertNotNull(mActivity); } public void test_22() { assertNotNull(mActivity); } public void test_23() { assertNotNull(mActivity); } public void test_24() { assertNotNull(mActivity); } public void test_25() { assertNotNull(mActivity); } public void test_26() { assertNotNull(mActivity); } public void test_27() { assertNotNull(mActivity); } public void test_28() { assertNotNull(mActivity); } public void test_29() { assertNotNull(mActivity); } public void test_30() { assertNotNull(mActivity); } public void test_31() { assertNotNull(mActivity); } public void test_32() { assertNotNull(mActivity); } public void test_33() { assertNotNull(mActivity); } public void test_34() { assertNotNull(mActivity); } public void test_35() { assertNotNull(mActivity); } public void test_36() { assertNotNull(mActivity); } public void test_37() { assertNotNull(mActivity); } public void test_38() { assertNotNull(mActivity); } public void test_39() { assertNotNull(mActivity); } public void test_40() { assertNotNull(mActivity); } } 

Testing activity that extends the action:

 package my.app; import android.app.Activity; import android.os.Bundle; public class TestActivityAndroid extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } 

It uses memory, where its own free space drops below 30 KB and than the application is killed.

  Applications Memory Usage (kB): Uptime: 3804373 Realtime: 3804373 ** MEMINFO in pid 7315 [my.app] ** native dalvik other total size: 4048 3271 N/A 7319 allocated: 3942 2306 N/A 6248 free: 105 965 N/A 1070 (Pss): 844 1590 1806 4240 (shared dirty): 1404 4120 2288 7812 (priv dirty): 736 672 992 2400 Objects Views: 0 ViewRoots: 0 AppContexts: 0 Activities: 0 Assets: 2 AssetManagers: 2 Local Binders: 11 Proxy Binders: 10 Death Recipients: 0 OpenSSL Sockets: 0 SQL heap: 0 memoryUsed: 0 pageCacheOverflo: 0 largestMemAlloc: 0 Asset Allocations zip:/data/app/my.app-1.apk:/resources.arsc: 1K 

Does anyone have a better solution that sleep snipe 2 seconds inside tearDown ()? I don't like the dream inside tearDown (). And since we have about 100 tests in our test suite, 2 s will be a huge delay.

I hope someone can help me, and if my question is not clear, let me know.

Thanks in advance.

+6
source share
1 answer

Why do you need to do gc after each Unit test?

If this is because you want to create a clean environment for your test, then live with a 2 second delay. tearDown does at least 2 gc and some finalization. This leaves a clean environment for your next test. If you read the Android source code, there are a few comments pointing to the critical need for callilng tearDown at the end of the test.

If your tests do not need a clean environment, then combine them. At the same time, 200 seconds of the process running behind the scenes is a small protection fee to be tested.

Our automated tests of our current large project take about 5 minutes. I never notice, because we automated our system to run tests at initial registration and bounce the view if they fail.

Several times they failed, I was really amazed that the code I changed mixed up the other sections of the application. We saved at least a few weeks and probably many months in maintaining and debugging our application with our automated tests.

+2
source

All Articles