java - ProGuard obfuscating classes even after `keep class` flag. Affecting Android WebView behavior -
i'm using proguard obfuscate android app.
i'm using webview
show webpage (an html walkthrough page) contains button close webview
. there function in javascript calls closewalkthrough()
method:
function closefunction() { myclass.closewalkthrough(); }
the releated java class looks this:
package com.myclass.android; import android.app.activity; import android.content.context; import android.webkit.javascriptinterface; public class javascriptinterface { context _context; javascriptinterface(context context) { _context = context; } @javascriptinterface public void closewalkthrough() { ((activity) _context).finish(); } }
i've added following flags in proguard file in hopes won't obfuscate javascriptinterface
class because, if understand correctly, javascript method myclass.closewalkthrough()
looking closewalkthrough()
found in javascriptinterface
java class.
... -keepattributes javascriptinterface -keep public class com.myclass.android.javascriptinterface { *; } ...
however, whenever @ mapping.txt
file, see com.myclass.android.javascriptinterface
gets obfuscated:
... com.myclass.android.javascriptinterface -> axf: android.content.context _context -> ...
i added -keep public class
flag file creates webview
still doesn't work.
any pointers on might doing wrong?
i should mention when don't use proguard, button works , closes webview
.
in case helps, here's complete proguard-project.txt
file (i'm using intellij):
# configuration file proguard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # optimization turned off default. dex not code run # through proguard optimize , preverify steps (and performs # of these optimizations on own). -dontoptimize -dontpreverify # note if want enable optimization, cannot # include optimization flags in own project configuration file; # instead need point # "proguard-android-optimize.txt" file instead of 1 # project.properties file. -keepattributes *annotation* -keep public class com.google.vending.licensing.ilicensingservice -keep public class com.android.vending.licensing.ilicensingservice # native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in views animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.view { void set*(***); *** get*(); } # want keep methods in activity used in xml attribute onclick -keepclassmembers class * extends android.app.activity { public void *(android.view.view); } # enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueof(java.lang.string); } -keep class * implements android.os.parcelable { public static final android.os.parcelable$creator *; } -keepclassmembers class **.r$* { public static <fields>; } # support library contains references newer platform versions. # don't warn in case app linking against older # platform version. know them, , safe. -dontwarn android.support.** #----------------------------------------------------------- # custom defined flags #----------------------------------------------------------- # note in order log hidden, must have optimization enabled. # source: https://groups.google.com/d/msg/adt-dev/60wpzrk8qmu/-9klgbznis4j -assumenosideeffects class android.util.log { public static int d(...); public static int w(...); public static int v(...); } #-repackageclasses '' #-allowaccessmodification -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; } -keep class org.codehaus.** { *; } -keep class com.facebook.** { *; } -keepattributes javascriptinterface -keep public class com.myclass.android.javascriptinterface { *; } -keep public class com.myclass.android.walkthroughactivity { *; } -dontwarn android.support.** -dontwarn com.facebook.** -dontwarn com.google.** -dontwarn com.google.android.gms.** -dontwarn com.google.code.** -dontwarn com.google.common.collect.minmaxpriorityqueue -dontwarn com.google.gdata.**, com.google.common.** -dontwarn com.ibm.icu.text.** -dontwarn com.sun.** -dontwarn demo.** -dontwarn java.awt.** -dontwarn java.awt.**,javax.security.**,java.beans.** -dontwarn java.beans.** -dontwarn java.lang.management.** -dontwarn javax.** -dontwarn javax.swing.** -dontwarn oauth.signpost.** -dontwarn org.apache.** -dontwarn org.apache.commons.codec.binary.** -dontwarn org.apache.commons.logging.** -dontwarn org.apache.log4j.** -dontwarn org.jasypt.encryption.pbe.** -dontwarn org.joda.time.** -dontwarn org.mortbay.** -dontwarn org.slf4j.** -dontwarn org.w3c.dom.bootstrap.** -dontwarn sun.misc.unsafe -dontwarn twitter4j.** -dontwarn org.codehaus.jackson.**
you can instruct proguard keep annotated methods:
-keepclassmembers class * { @android.webkit.javascriptinterface <methods>; }
this should part of default configuration in android sdk.
Comments
Post a Comment