diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java index 0b608b28..2a51c89e 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java @@ -34,6 +34,7 @@ import org.jf.dexlib2.ValueType; import org.jf.dexlib2.iface.Annotation; import org.jf.dexlib2.iface.Field; import org.jf.dexlib2.iface.value.EncodedValue; +import org.jf.dexlib2.util.EncodedValueUtils; import org.jf.util.IndentingWriter; import java.io.IOException; @@ -45,15 +46,16 @@ public class FieldDefinition { int accessFlags = field.getAccessFlags(); if (setInStaticConstructor && - AccessFlags.STATIC.isSet(accessFlags) && - AccessFlags.FINAL.isSet(accessFlags) && - initialValue != null && - ( //it's a primitive type, or it's an array/reference type and the initial value isn't null - field.getType().length() == 1 || - initialValue.getValueType() != ValueType.NULL - )) { - - writer.write("#the value of this static final field might be set in the static constructor\n"); + AccessFlags.STATIC.isSet(accessFlags) && + AccessFlags.FINAL.isSet(accessFlags) && + initialValue != null) { + if (!EncodedValueUtils.isDefaultValue(initialValue)) { + writer.write("# The value of this static final field might be set in the static constructor\n"); + } else { + // don't write out the default initial value for static final fields that get set in the static + // constructor + initialValue = null; + } } writer.write(".field "); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java new file mode 100644 index 00000000..8638cf00 --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.jf.dexlib2.util; + +import org.jf.dexlib2.ValueType; +import org.jf.dexlib2.iface.value.*; + +public class EncodedValueUtils { + public static boolean isDefaultValue(EncodedValue encodedValue) { + switch (encodedValue.getValueType()) { + case ValueType.BOOLEAN: + return !((BooleanEncodedValue)encodedValue).getValue(); + case ValueType.BYTE: + return ((ByteEncodedValue)encodedValue).getValue() == 0; + case ValueType.CHAR: + return ((CharEncodedValue)encodedValue).getValue() == 0; + case ValueType.DOUBLE: + return ((DoubleEncodedValue)encodedValue).getValue() == 0; + case ValueType.FLOAT: + return ((FloatEncodedValue)encodedValue).getValue() == 0; + case ValueType.INT: + return ((IntEncodedValue)encodedValue).getValue() == 0; + case ValueType.LONG: + return ((LongEncodedValue)encodedValue).getValue() == 0; + case ValueType.NULL: + return true; + case ValueType.SHORT: + return ((ShortEncodedValue)encodedValue).getValue() == 0; + } + return false; + } + +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java index dbc88879..20a67a68 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java @@ -31,6 +31,8 @@ package org.jf.dexlib2.util; +import org.jf.dexlib2.iface.value.EncodedValue; + public class TypeUtils { public static boolean isWideType(String type) { char c = type.charAt(0);