Удаление объектных массивов varargs с помощью ProGuard

#java #android #logging #proguard #android-proguard

#java #Android #ведение журнала #proguard #android-proguard

Вопрос:

Я пытаюсь удалить журналы из своего приложения с помощью 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:

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