#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
.