Android性能优化(1)---webview优化篇

简介: 写这篇文章的主要是因为在实际应用的时候遇到了很多棘手的问题(文章最后部分,交流一下遇到的问题),在这里分享出来让人少走一些弯路,如果有不对的地方直接留言即可相信一般做Android开发的同学都会或多或少的使用webview,(由于不太了解js,js交...

写这篇文章的主要是因为在实际应用的时候遇到了很多棘手的问题(文章最后部分,交流一下遇到的问题),在这里分享出来让人少走一些弯路,如果有不对的地方直接留言即可

相信一般做Android开发的同学都会或多或少的使用webview,(由于不太了解js,js交互的部分暂时没有)相信有不少人的使用过程是这样的

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </WebView>
</LinearLayout>

使用

    //设置webview
    WebSettings websettings = webView.getSettings();
    websettings.setJavaScriptEnabled(true);
    websettings.setDomStorageEnabled(true);
    websettings.setJavaScriptCanOpenWindowsAutomatically(true);
    websettings.setBuiltInZoomControls(false);// 
    webView.loadUrl(url);

上边这样使用,在使用量少的情况下可能没有问题,但是也给程序留下了不少隐患--内存泄漏,由于webview并没有完全清除掉,一直持有对应的上下文,导致内存无法被回收

说道这里就有了第一种的优化

优化一

既然说没有主动回收,那我们就手动回收在,activity的onDestroy方法中清除webview

public void onDestroy() {
    super.onDestroy();
    webView.clearHistory();
    webView.clearView();
    webView.removeAllViews();
    webView.destroy();
}

当你做完这些操作后,退出当前的activity,发现内存好像并没有减少(或者浮动不大)原因请参考
http://blog.csdn.net/u013085697/article/details/53259116

优化二

在需要用到webview的地方直接new一个出来,而不是在.xml文件中定义webview

布局

在布局需要使用webview的地方使用一个FrameLayout代替(其他的容器也可以)

使用
/**
*创建webview并添加到布局容器中
*/
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   WebView webView = WebviewUtil.createNewWebView(context);
   FrameLayout frameLayout  = findViewById(R.id.xxx);
   frameLayout.addView(mWebView);
}
...
/**
*创建webview公共方法
*/
public static android.webkit.WebView createNewWebView(Context context){
    android.webkit.WebView webView = new android.webkit.WebView(context.getApplicationContext());
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, new Paint());
    webView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    return webView;
}

/**
*清除webview
*/
public void onDestroy() {
 if (null != webView) {
        try {
            webView.removeJavascriptInterface("xx");
            webView.getSettings().setJavaScriptEnabled(false);
            webView.loadUrl("about:blank");
            webView.loadDataWithBaseURL(null, "", "text/html", "uft-8", null);
            ViewParent parent = webView.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(webView);
            }
            webView.clearHistory();
            webView.clearView();
            webView.removeAllViews();
            webView.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    super.onDestroy();
   
}

但是通过以上操作,查看内存并没有被回收.........

优化三 -- 开进程

当你的webview需要的内存很大,但是主进程申请不到更多的内存的情况下可以使用。

此方法各大主流APP基本都是这样操作的,在打开webview页面后,查看此应用的进程是否多开了一个。

开进程的方法也很简单只需要在你需要的activity在AndroidManifest中注册的时候添加“process”属性即可,但是注意进程间的通信;当关闭此activity时杀掉此进程不然内存不能被回收,下次进入时内存累加,最终会导致溢出

    <activity
        android:name=".Activity"
        android:process=":remoteView"
       />

如果打开进程的速度慢可以先进行进程的预加载,先启动一个和上边activity同一个进程的service,然后再打开activity

优化四--使用第三方

腾讯的x5内核,具体的优势可以参考腾讯官方文档

最后,再来说说我遇到的问题吧,首先需求是这样的一个页面需要多个统计图(百度的echarts,为了保持两端一致性和多样化的图表需求)每一个图表都需要一个对应的webview

没办法,产品提出来了

1开始使用第一种,崩溃,卡顿问题不断

2使用方法二,解决了大部分的机型,只有蓝绿大厂不行(吐槽中OPPO、vivo)
会出现无故的崩溃,查看logo日志(包括sdk底层logo日志)都只能找到一个内存地址的错误,比如:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9ffffffff in tid 30218 (Thread-708)

没有其他任何提示,腾讯的bugly,友盟也没有抓取到相关的信息,崩溃中
后来查到两点问题

1、echarts的问题,其中有一个svg渲染(官方是beta版),是为了给低性能设备使用,看情况使用,有些图表会出现点击蓝屏闪烁(只是在webview范围之内),不过亲测内存降低了太多,没有使用前一个带滑块的图表达到了快200M,改为svg之后一直维持在30+M,提升明显,如果使用请自行测试多种机型

2、还是echarts 的问题,数据返回后多次向webview传入了数据导致崩溃,改为一次后暂未发现

以上两个问题目前只在OPPO和vivo手机发现,希望有此需求的小伙伴注意此问题

相关文章
|
20天前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
32 2
|
5天前
|
程序员 开发工具 Android开发
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
15 2
|
15天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
36 4
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
15天前
|
存储 缓存 网络协议
5个Android性能优化相关的深度面试题
本文涵盖五个Android面试题及其解答,包括优化应用启动速度、内存泄漏的检测与解决、UI渲染性能优化、减少内存抖动和内存溢出、优化网络请求性能。每个问题都提供了详细的解答和示例代码。
18 2
|
19天前
|
监控 测试技术 Android开发
掌握安卓性能优化的关键策略
【10月更文挑战第7天】 在移动应用开发领域,性能优化是一项至关重要的任务。本文将探讨安卓应用性能优化的重要性、关键策略以及实际操作建议,帮助开发者提升应用的用户体验和竞争力。通过深入浅出的方式,我们将从背景介绍到具体实践,全面解析安卓性能优化的各个维度。
|
2月前
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【9月更文挑战第12天】在Android开发领域,深入了解其底层机制对提升应用性能至关重要。本文详述了从早期Dalvik虚拟机到现今Android Runtime(ART)的演变过程,揭示了ART通过预编译技术实现更快启动速度和更高执行效率的奥秘。文中还介绍了ART的编译器与运行时环境,并提出了减少DEX文件数量、优化代码结构及合理管理内存等多种性能优化策略。通过掌握这些知识,开发者可以从全新的角度提升应用性能。
59 11
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
54 2
|
2月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
67 0