A bit of an intrusive hack, but I worked around this issue by introducing a "unique token" and implementing the WebViewClient
with a shouldInterceptRequest
override.
First, change the URL from file:///android/asset
to a relative path with a uniquely identifying token:
<script src="**injection**www/scripts.js"></script>
Then, override shouldInterceptRequest
as follows:
// Injection token as specified in HTML source
private static final String INJECTION_TOKEN = "**injection**";
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = super.shouldInterceptRequest(view, url);
if(url != null && url.contains(INJECTION_TOKEN)) {
String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length());
try {
response = new WebResourceResponse(
"application/javascript",
"UTF8",
getContext().getAssets().open(assetPath)
);
} catch (IOException e) {
e.printStackTrace(); // Failed to load asset file
}
}
return response;
}
});
This is likely to degrade WebView performance slightly as we are calling the contains()
on each resource which is attempted to be loaded, but it's the only workaround I've found to this issue.