Following up on my own post, the test I ran was not thorough enough,
and the following rules are the ones actually required to make WebView
callbacks work properly:

--------------------------
-keep public class com.trans_code.android.JavascriptCallback
-keep public class * implements com.trans_code.android.JavascriptCallback
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback {
    <methods>;
}
--------------------------


On Sun, Nov 7, 2010 at 7:17 PM, Stephen Jungels <sjung...@gmail.com> wrote:
> Thanks, I followed up on that idea by creating a placeholder
> interface; I am limiting this to the problem of WebView callbacks so I
> call it "JavascriptCallback".
>
> If I follow the convention of implementing this interface wherever
> appropriate, the following Proguard rules work:
>
> ---------------------
> -keep public class * implements com.trans_code.android.JavascriptCallback
> -keepclassmembers class * implements JavascriptCallback {
>    void on*(***)
> }
> ---------------------
>
> My Proguard knowledge is basic but this seems to be enough for the use
> cases I can think of, where a convention is assumed that callback
> methods will start with "on".
>
> I wonder if this placeholder interface or something similar should be
> in the framework as a general purpose tag for RPC-type callbacks to
> Java that should not be renamed by an obfuscator.
>
> --SJ
>
> On Sun, Nov 7, 2010 at 6:35 PM, Daniel Drozdzewski
> <daniel.drozdzew...@gmail.com> wrote:
>> On Sun, Nov 7, 2010 at 10:41 PM, Stephen Jungels <sjung...@gmail.com> wrote:
>>> I've recently started using the WebView Android / Javascript interface
>>> in my projects (and I think it's pretty cool; article here:
>>> http://developer.android.com/resources/articles/using-webviews.html).
>>>
>>> The problem is that when obfuscation is turned on, the callbacks from
>>> Javascript to my Android code no longer complete, because the language
>>> binding is unaware of the renaming performed by Proguard.
>>>
>>> I can fix this on a case-by case basis; for example in the very simple
>>> code I am using now, the following additional Proguard rules are
>>> enough:
>>>
>>> -----------------------
>>> -keep public class com.trans_code.android.JsCallback
>>> -keepclassmembers class * {
>>>    public void doneClicked();
>>> }
>>> ----------------------
>>>
>>> However the second rule seems too broad, and both rules are unique to
>>> each project that uses the Javascript callback.
>>>
>>> Any guidance on how a better rule can be written that catches every
>>> use of Android - Javascript bindings, and nothing else?
>>>
>>> Thanks,
>>>
>>> SJ
>>>
>>
>> Stephen,
>>
>> I am not sure, whether you would be more selective with not
>> obfuscating some classes, but you could do the following:
>>
>> - define a placeholder interface called say NonObfuscateable (I know
>> it sounds dreadful, but you get the gist)
>> - make all classes that you want to keep implement this interface
>> - tell Proguard to keep the classes that implemented your interface
>>
>> Daniel
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to android-developers@googlegroups.com
>> To unsubscribe from this group, send email to
>> android-developers+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to