4

I have a problem that im searching for a solution since two days ago. After frustrating searchs, i will post here:

I have created a sample app that have a webview and this webview open a url that have a link to call a android function. I follow it: http://developer.android.com/guide/webapps/webview.html#BindingJavaScript

Im using last AndroidStudio version and im using a galaxy s4 mini for test.

When i debug it, everything works correct and a toast is showed.

The problem is when i generate a RELEASE application with command: ~/Server/gradle-1.8/bin/gradle assembleRelease

The application open, but when i touch the link that call my native function, it dont work and nothing happen. But with debug mode, it works.

Can anyone help me?

An image to understand better:

enter image description here

Paulo Coutinho
  • 705
  • 1
  • 7
  • 15

2 Answers2

6

If Gradle is configured to use ProGuard, the @JavascriptInterface annotations need to be explicitly preserved.

-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
}
-keepattributes JavascriptInterface

See here for details.

Community
  • 1
  • 1
Nachi
  • 4,218
  • 2
  • 37
  • 58
2

At AndroidStudio 0.8.4 it create a file called proguard-rules.pro at the root of your app module when create a new App Project. And its contain the following message (which is the solution):

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\Android\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
-keepclassmembers class com.package.YourWebViewJavaInterfaceClasse {
   public *;
}
Renan Franca
  • 3,438
  • 1
  • 18
  • 17