首页 > 解决方案 > 如何完全关闭android应用程序以便回收所有内存?

问题描述

我正在开发一个只有 1 个主要活动的应用程序。

该应用程序创建一个执行 C++ 代码的新线程,一旦线程返回,我需要完全关闭该应用程序,因此当用户尝试从手机中的任何位置再次使用它时,该应用程序将在没有内存的情况下打开 - 就像以前一样从后台删除并重新开始。

调用activity.finish()应用程序时没有完全销毁,所以我System.exit(1)在方法的末尾添加了OnDestroy,但这导致了来自谷歌播放的罕见ANR报告,我无法重现。

我的问题是:

我如何才能以正确的方式完全关闭应用程序而不会导致任何 anr/stuck 部分锁定或其他任何事情?

在anr报告中,c ++线程不存在-它返回了-因此我非常确定它是由应用程序关闭逻辑引起的

anr 日志:

#00  pc 00000000000177ac  /system/lib/libc.so (syscall+28)
#01  pc 00000000000b643d  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
#02  pc 00000000003f045b  /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+230)
#03  pc 00000000003f034b  /system/lib/libart.so (_ZN3art12JniMethodEndEjPNS_6ThreadE+8)
#04  pc 000000000062c225  /system/framework/arm/boot-framework.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+152)
at android.os.BinderProxy.transactNative (Native method)
at android.os.BinderProxy.transact (Binder.java:615)
at jz.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:2)
at xm.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at xi.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:6)
at no.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:3)
at on.b (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:10)
at on.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:1)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:1)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:19)
at com.google.android.gms.ads.safebrowsing.b.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:7)
at pb.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:53)
- locked <0x06c91611> (a java.lang.Object)
at op.g (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:11)
at op.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:30)
at pe.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:7)
at oa.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:3)
at rw.m_ (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at rj.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:14)
at rb.c (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at rc.handleMessage (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060:35)
at android.os.Handler.dispatchMessage (Handler.java:102)
at vw.a (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
 at vw.dispatchMessage (com.google.android.gms.policy_ads_fdr_dynamite@20461004@20461004.264725060.264725060)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6317)
at java.lang.reflect.Method.invoke! (Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762)

标签: android

解决方案


这是部分答案;

如果您需要擦除的内存部分属于 c++ 代码,并且您可以在 c++ 代码中对其进行管理:只需编写一个 jni 函数,将相关内存和指针清零(在 c++ 中是允许的)并在 activity.finish 之前调用它;

如果您需要擦除的内存部分属于 c++ 代码,而您无法在 c++ 代码中对其进行管理;在新进程中分叉并运行代码;这将使您能够通过调用以下方法从父进程的 java 代码中杀死它(擦除内存):

android.os.Process.killProcess(the_childs_process_id)

推荐阅读