sensorsdata / sa-sdk-android

神策数据官方 Android 埋点 SDK,是一款轻量级用于 Android 端的数据采集埋点 SDK,包含代码埋点、全埋点、点击图和可视化全埋点功能。全埋点通过配合神策官方 Android 埋点插件来实现,神策数据官方 Android 埋点插件使用字节码插桩(ASM)的技术实现 Android 端的全埋点(无埋点、无码埋点、无痕埋点、自动埋点)。
http://opensource.sensorsdata.cn
Other
1.31k stars 434 forks source link

encodeData 在低版本手機會出現OOM #104

Closed KingsleyWu closed 1 year ago

KingsleyWu commented 2 years ago

Device Version: android 7.0 Device Model:SM-G9250 Stacktrace:java.lang.OutOfMemoryError: Failed to allocate a 197416 byte allocation with 182464 free bytes and 178KB until OOM at libcore.util.CharsetUtils.toUtf8Bytes(Native Method)at java.lang.String.getBytes(String.java:879) at java.lang.String.getBytes(String.java:851) at com.sensorsdata.analytics.android.sdk.AnalyticsMessages.encodeData() at com.sensorsdata.analytics.android.sdk.AnalyticsMessages.sendData() at com.sensorsdata.analytics.android.sdk.AnalyticsMessages.access$000() at com.sensorsdata.analytics.android.sdk.AnalyticsMessages$Worker$AnalyticsMessageHandler.handleMessage() at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:154) at android.os.HandlerThread.run(HandlerThread.java:61)

` // AnalyticsMessages.java

private String encodeData(final String rawMessage) throws InvalidDataException {
    GZIPOutputStream gos = null;
    try {
        ByteArrayOutputStream os = new ByteArrayOutputStream(rawMessage.getBytes(CHARSET_UTF8).length);
        gos = new GZIPOutputStream(os);
        gos.write(rawMessage.getBytes(CHARSET_UTF8));
        gos.close();
        byte[] compressed = os.toByteArray();
        os.close();
        return new String(Base64Coder.encode(compressed));
    } catch (IOException exception) {
        // 格式错误,直接将数据删除
        throw new InvalidDataException(exception);
    } finally {
        if (gos != null) {
            try {
                gos.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
}

`

另外建議 rawMessage.getBytes(CHARSET_UTF8) 抽成一個變量,這個方法裡重複調用了兩次,本來不需要多申請內存的,現在申請了兩份。

dengshiwei commented 2 years ago

@KingsleyWu 我们内部看一下,进行优化

dengshiwei commented 1 year ago

@KingsleyWu v6.5.0 版本已优化