愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

続 のび太とwindow.gc on Android

http://d.hatena.ne.jp/zentoo/20120501/1335848528

↑この記事で、WebView#setJsFlagsが@hideなので、window.gcを使えるようにできないよーって書いてましたが

よく考えたら、@hideだろうがなんだろうがreflectionを使えば問題なく呼べるので、以下の様なコードを書けば

        try {
            Class<WebView> c = (Class<WebView>) webView.getClass();
            Method m = c.getDeclaredMethod("setJsFlags", String.class);
            m.setAccessible(true);
            m.invoke(webView, "--expose_gc");
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

setJsFlags、呼べちゃうんですよね。文句言われずに。


僕の試した所だと、Android2.3.3はダメでしたがAndroid4.0で(どちらもエミュレータ

window.gc

というfunctionが生えていることをJS Layerから確認できました。callすることも可能なようです。実際にgcが走ってるか、までは調べてませんが。


というわけで、window.gcは頑張ればcallできます。興味のある人はためしてみるとよいかもしれません。


(追記: Android4.1.1とかだとなくなっているっぽい? -> http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/core/java/android/webkit/WebView.java)