H5页面框架
Android:一个实用的WebView浏览网页,可直接使用
webView造成的内存泄漏解决办法:
Android H5页面内存溢出优化
如果应用还需要成为最高级的系统应用,即在androidManifest中使用了android:sharedUserId=“android.uid.system” 的应用,
还需要hook这个webView,否则会崩溃。
在自定义的Application中的onCreate()方法中
if (!ProcessUtils.isMainProcess()) {//如果你的H5页面运行在其他进程,则加上这个判断当前是否是主进程
hookWebView();
return;
}
/**
* 解决系统应不能使用webView的问题
*/
private void hookWebView() {
int sdkInt = Build.VERSION.SDK_INT;
try {
Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
Field field = factoryClass.getDeclaredField("sProviderInstance");
field.setAccessible(true);
Object sProviderInstance = field.get(null);
if (sProviderInstance != null) {
return;
}
Method getProviderClassMethod;
if (sdkInt > 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
} else if (sdkInt == 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
} else {
return;
}
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass);
if (providerConstructor != null) {
providerConstructor.setAccessible(true);
Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance());
field.set("sProviderInstance", sProviderInstance);
}
} catch (Throwable e) {
}
}