当前位置: 首页 > 知识库问答 >
问题:

奇怪的支持地图碎片行为

隆飞驰
2023-03-14

如果我们使用<code>系统使用本机库。loadLibrary()然后<code>SupportMapFragment。它在没有任何stacktrace的情况下实现了这一点。这是我能收集到的最好的日志:

06-10 02:10:01.063 22787-23766/com.myapp.staging E/DynamiteModule: Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.android.gms.googlecertificates.ModuleDescriptor" on path: DexPathList[[zip file "/data/app/com.myapp.staging-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.staging-1/lib/arm, /data/app/com.myapp.staging-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
06-10 02:10:01.063 22787-23766/com.myapp.staging W/ResourcesManager: getTopLevelResources: /data/app/com.google.android.gms-1/base.apk / 1.0 running in com.myapp.staging rsrc of package com.google.android.gms
06-10 02:10:01.063 22787-23766/com.myapp.staging I/DynamiteModule: Considering local module com.google.android.gms.googlecertificates:0 and remote module com.google.android.gms.googlecertificates:1
06-10 02:10:01.063 22787-23766/com.myapp.staging I/DynamiteModule: Selected remote version of com.google.android.gms.googlecertificates, version >= 1
06-10 02:10:01.153 23793-23793/? I/dex2oat: /system/bin/dex2oat --debuggable --compiler-filter=speed --dex-file=/data/user/0/com.google.android.gms/app_chimera/m/00000000/DynamiteModulesA_GmsCore_prodmnc_alldpi_release.apk --oat-file=/data/dalvik-cache/arm/data@user@0@com.google.android.gms@app_chimera@m@00000000@DynamiteModulesA_GmsCore_prodmnc_alldpi_release.apk@classes.dex
06-10 02:10:01.153 23793-23793/? E/dex2oat: Failed to create oat file: /data/dalvik-cache/arm/data@user@0@com.google.android.gms@app_chimera@m@00000000@DynamiteModulesA_GmsCore_prodmnc_alldpi_release.apk@classes.dex: Permission denied
06-10 02:10:01.153 23793-23793/? I/dex2oat: dex2oat took 721.250us (threads: 4) 
06-10 02:10:01.153 5853-5853/? E/audit: type=1701 msg=audit(1465506601.153:5185): auid=4294967295 uid=10329 gid=10329 ses=4294967295 subj=u:r:untrusted_app:s0:c512,c768 pid=23766 comm="androidmapsapi-" reason="memory violation" sig=11
06-10 02:10:01.153 3542-4463/? D/libgps: OnGpsExtensionMessage: message_id(1), data(0x7f95455e44), size(2432)
06-10 02:10:01.153 3542-4463/? D/libgps: GpsiHook: API: gpsSvStatusCb(GpsiHookStateGps: e,c,g)
06-10 02:10:01.153 3542-4463/? D/libgps: proxy__gps_sv_status_cb : called
06-10 02:10:01.173 3542-3607/? I/PassiveLocTracker: GPS Satllite Status
06-10 02:10:01.243 3542-4368/? I/WindowState: WIN DEATH: Window{ae4e596 u0 d0 com.myapp.staging/com.myapp.ui.activity.FrameActivity}
06-10 02:10:01.243 3067-4605/? D/libEGL: eglTerminate EGLDisplay = 0x7f6bae1f88
06-10 02:10:01.243 3067-4605/? D/libEGL: eglTerminate EGLDisplay = 0x7f6bae1f88
06-10 02:10:01.243 3542-4286/? D/GraphicsStats: Buffer count: 21
06-10 02:10:01.253 3542-4368/? D/InputDispatcher: Focus left window: 22787
06-10 02:10:01.253 3542-4639/? I/AppOps: sendInfoToFLP, code=41 , uid=10329 , packageName=com.myapp.staging , type=finishOp
06-10 02:10:01.253 3542-4120/? I/ActivityManager: Process com.myapp.staging (pid 22787)(adj 0) has died(114,1020)
06-10 02:10:01.253 3542-3564/? I/WindowState: WIN DEATH: Window{6ba02d0 u0 d0 com.myapp.staging/com.myapp.ui.activity.VisitActivity}
06-10 02:10:01.253 3542-4227/? I/AppOps: sendInfoToFLP, code=42 , uid=10329 , packageName=com.myapp.staging , type=finishOp
06-10 02:10:01.263 3542-4120/? D/ActivityManager: isAutoRunBlockedApp:: com.myapp.staging, Auto Run ON
06-10 02:10:01.263 3542-4120/? W/ActivityManager: Force removing ActivityRecord{6796427 u0 com.myapp.staging/com.myapp.ui.activity.FrameActivity t5324}: app died, no saved state

我花了几天时间试图了解导致它的原因,似乎如果我们删除System.loadLibrary()调用,即不使用我们的本机lib,那么SupportMapFragment就可以正常工作。有什么方法可以在不删除我们的本机lib的情况下解决它吗?

编辑:我创建了一个示例应用程序来重现这个问题,在上述日志之后,我还得到了一些似乎有用的东西:

06-14 13:17:28.415 5756-5756/? E/audit: type=1701 msg=audit(1465892248.405:4500): auid=4294967295 uid=10332 gid=10332 ses=4294967295 subj=u:r:untrusted_app:s0:c512,c768 pid=6431 comm="androidmapsapi-" reason="memory violation" sig=11

编辑2:

地图活动.java

public class MapsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Go.init(this);
    setContentView(R.layout.activity_maps);
}

public void showMap(View view) {
    getSupportFragmentManager().beginTransaction().replace(R.id.container, new MapFragment()).commit();
}
}

MapFragment.java

public class MapFragment extends android.support.v4.app.Fragment implements OnMapReadyCallback {

private GoogleMap mMap;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.map_frag, null, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
            .findFragmentById(R.id.maps);
    mapFragment.getMapAsync(this);

}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}

出发.java

public final class Go {
// init loads libgojni.so and starts the runtime.
public static void init(final Context ctx) {
    if (Looper.myLooper() != Looper.getMainLooper()) {
        Log.wtf("Go", "Go.init must be called from main thread (thread="+Thread.currentThread().getName()+")");
    }
    if (running) {
        return;
    }
    running = true;

    // TODO(crawshaw): context.registerComponentCallbacks for runtime.GC

    System.loadLibrary("gojni");
    Go.run(ctx);
    new Thread("GoReceive") {
        public void run() { Seq.receive(); }
    }.start();
}

private static boolean running = false;

private static native void run(Context ctx);
}

这是文件夹结构:

共有1个答案

楚威
2023-03-14

据我所知,gmaps-api中记录了一些关于内存泄漏的问题,最新的是问题8596。追溯到其他相关问题,这个问题已经在问题4766中提到的最新版本的谷歌地图Android API中得到解决,但是,在其他版本中仍然会遇到相同的问题。

除此之外,MapFraank还提到了当持有超出视图生命周期的对象时导致的内存泄漏,因为视图无法释放。

而且,这篇SO帖子 - 谷歌地图Android API v2 SupportMapFragment内存泄漏也可能有所帮助。

 类似资料:
  • 我试图实现BFS算法,以找到图中的所有路径(从src和dp)。我使用一个切片来模拟一个队列,但是当我在for循环中追加多个元素时,切片会损坏(追加没有按预期工作)。我不知道为什么。我是新来戈兰的

  • 我有问题加载一个谷歌地图在我的片段。一切都从一个循环器视图适配器开始,该适配器启动活动“ViatGedetAllViewActivity”: 这是我的DetallViewActivity: =2 03-24 02:55:53.881 639-7362/com.example.usuari.MyApplication3 w/ResourcesManager:GetTopleVelResources:

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 以下代码是尝试使用lodash fp制作我的2048版本(游戏)的开始。我习惯了普通的洛达斯,但这是我第一次接触fp口味。 它使用两个功能实现将一行的瓷砖向右推的操作: 将该行向右推,前提是有空格(由值0表示)。实际上,这相当于把所有的零放在左边。 合并成对的相同值的连续磁贴,生成一个空空间和一个值加倍的新磁贴。(从那一步)。 这些函数使用方法,该方法从右向左遍历磁贴。 似乎工作正常。例如,将转换

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处