Удалите массивы объектов varargs с помощью ProGuard - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь удалить логи из моего приложения с помощью ProGuard.Я просматриваю эту страницу документации , но, к сожалению, мне не удалось удалить объект [], созданный с помощью varargs.


Java-код

Мой пользовательскийПример регистратора выглядит так:

public final class MyLogger {

    private static final StringBuilder V_STRING_BUILDER = new StringBuilder(0);

    private MyLogger() {
        //no instance
    }

    public static void v(@NonNull String tag, @NonNull String method, @NonNull Object... message) {
        final String processedMessage;

        synchronized (V_STRING_BUILDER) {
            processedMessage = createMessage(V_STRING_BUILDER, message);
        }

        Log.v(tag.concat(method), processedMessage);
    }

    @NonNull
    private static String createMessage(@NonNull final StringBuilder builder,
                                        @NonNull final Object... messages) {

        builder.setLength(0);

        //noinspection ForLoopReplaceableByForEach
        for (int i = 0, size = messages.length; i < size; i++) {
            builder.append(messages[i]);
        }

        return builder.toString();
    }
}

И я записываю информацию следующим образом:

MyLogger.v(TAG, "myMethod", "The list of parameter");

Файл Proguard

-optimizations code/removal/advanced
-optimizationpasses 5
-allowaccessmodification

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
    public static int wtf(...);
}

-assumenoexternalsideeffects class java.lang.StringBuilder {
    public java.lang.StringBuilder();
    public java.lang.StringBuilder(int);
    public java.lang.StringBuilder(java.lang.String);
    public java.lang.StringBuilder append(java.lang.Object);
    public java.lang.StringBuilder append(java.lang.String);
    public java.lang.StringBuilder append(java.lang.StringBuffer);
    public java.lang.StringBuilder append(char[]);
    public java.lang.StringBuilder append(char[], int, int);
    public java.lang.StringBuilder append(boolean);
    public java.lang.StringBuilder append(char);
    public java.lang.StringBuilder append(int);
    public java.lang.StringBuilder append(long);
    public java.lang.StringBuilder append(float);
    public java.lang.StringBuilder append(double);
    public java.lang.String toString();
}

-assumenoexternalreturnvalues public final class java.lang.StringBuilder {
    public java.lang.StringBuilder append(java.lang.Object);
    public java.lang.StringBuilder append(java.lang.String);
    public java.lang.StringBuilder append(java.lang.StringBuffer);
    public java.lang.StringBuilder append(char[]);
    public java.lang.StringBuilder append(char[], int, int);
    public java.lang.StringBuilder append(boolean);
    public java.lang.StringBuilder append(char);
    public java.lang.StringBuilder append(int);
    public java.lang.StringBuilder append(long);
    public java.lang.StringBuilder append(float);
    public java.lang.StringBuilder append(double);
}

-assumenosideeffects class com.asousa.testing.proguard.MyLogger {
    public static void v(...);
}


Окончательный результат

Когда я выполняю обратный инжиниринг моего APK, я могу проверить из моего примера, что в моем исходном коде содержится следующая инструкция:

new Object[1][0] = "The list of parameter";

Хотя журнал не записывается в logcat устройства,Массив объектов сохраняется.

Есть ли способ сообщить ProGuard и этим массивам?

1 Ответ

0 голосов
/ 20 мая 2019

Вы используете MyLogger вместо Log, поэтому вам нужно сначала добавить правила для MyLogger.

...