【问题标题】:browser plugin for default android browser默认安卓浏览器的浏览器插件
【发布时间】:2011-08-28 18:16:03
【问题描述】:

我想为默认的 android 浏览器开发一个插件,它可以在 google 搜索结果中指定网站的类别。 android 浏览器没有明确显示插件架构。我想知道如何做到这一点以及与此相关的任何参考资料。

谢谢,

【问题讨论】:

    标签: android plugins


    【解决方案1】:

    我最近尝试制作一个 android 插件,发现很多关于 SO 的问题,但没有多少详细的答案,所以我想我会在这里分享我的研究,即使这个问题现在已经很老了。我不确定一个插件是否真的是你想要在这里做的,因为你可能会使用谷歌的 JSON/ATOM 自定义搜索 API 并解析它,但我仍然详细介绍了如何让插件在 Android 上运行。我希望它对其他人有用。

    如果你看这里:PluginManager.java,你会看到以下几行:

    // Only plugin matches one of the signatures in the list can be loaded
    // inside the WebView process
    private static final String SIGNATURE_1 = "308204c5..."
    

    此处使用的签名是用于 Adob​​e Flash 插件的签名(Adobe 现已放弃对它的支持。)

    再往下你会看到:

    if (SystemProperties.getBoolean("ro.secure", false)) {
                boolean signatureMatch = false;
                for (Signature signature : signatures) {
                    for (int i = 0; i < SIGNATURES.length; i++) {
                        if (SIGNATURES[i].equals(signature)) {
                            signatureMatch = true;
                            break;
                        }
                    }
                }
                if (!signatureMatch) {
                    return false;
                }
            }
    

    这意味着如果ro.secure=0 则不会检查签名 - 否则只会允许 Flash 插件。 ro.secure 是一个构建属性,如果您有设备的 root 权限或者您有开发构建(键入 adb shell getprop ro.secure 以了解您拥有的内容),您可以设置它。如有必要,您可以研究如何更改此设置。我使用的是 Qualcomm Snapdragon MDP8960,它是已经具有 ro.secure=0 的开发板。要将您的插件签名包含在 android 中,您必须与负责人交谈 - 不确定目前这是否可行。

    现在要编写一个插件 - 你可以在 android sourcetree 中找到一个名为 SampleBrowserPlugin 的示例(如果你想构建它,请确保你有一个 64 位 linux 机器 - 从源代码树根输入 make SampleBrowserPlugin。你可能需要首先使用 lunch 设置构建配置,您可以在 android 源代码树站点上找到说明)

    实际上,我从android source on github 获取了我需要的源代码,并对源代码进行了 NDK 构建,因为我比修改 android 构建脚本更熟悉如何执行此操作。它也将比下载整个 android 树快得多 - 您可以通过查看 Android.mk 中包含的内容来了解​​要下载的内容(见下文)。

    基本上,我从设备中提取了我需要的共享对象库,以确保我的插件兼容。它们位于我设备上的/system/lib 中:(例如,从您希望它们存储的目录中键入adb pull /system/libnativehelper.so 等) 得到以下内容:

    libnativehelper.so
    libandroid.so
    libutils.so
    libcutils.so
    libEGL.so
    libGLESv2.so
    libskia.so
    

    将它们放在SO_LIB_PATH 指向Android.mk 的位置(见下文并根据需要更改路径)。 然后在安装 NDK sdk 之后,您应该能够使用以下构建脚本 - 不需要 64 位机器 - (您可以安装 winbash、使用 cygwin 或 linux 虚拟机,例如 Oracle VM VirtualBox:

    (将这些文件放在C:/Path/BrowserPlugin/jni/ 并确保ndk-build 命令在您的路径上) (如果您使用的是 linux,请从 ndk-build.cmd 中删除 .cmd)

    build.sh:

    #!/bin/bash
    echo -e "Mode\t\t: Debug"
    OPTIM=debug
    
    ### ---------------- Generic Build Command ---------------- 
    # run NDK build
    ndk-build.cmd \
        -d \
        -B \
        NDK_DEBUG=1 \
        NDK_PROJECT_PATH=C:/Path/BrowserPlugin/jni \
        NDK_APPLICATION_MK=C:/Path/BrowserPlugin/jni/Application.mk \
        NDK_MODULE_PATH=C:/Path/BrowserPlugin/jni \
        NDK_APP_OUT=C:/Path/BrowserPlugin/jni/Out/ \
        APP_BUILD_SCRIPT=C:/Path/BrowserPlugin/jni/Android.mk \
        APP_OPTIM=$OPTIM
    
    cp C:/Path/BrowserPlugin/jni/Out/local/armeabi/libsampleplugin.so C:/Path/BrowserPlugin/libs/armeabi/.
    
    echo "copied libsampleplugin.so into PROJECT_ROOT/libs dir"
    

    Android.mk:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_SRC_FILES := \
        main.cpp \
        PluginObject.cpp \
        RenderingThread.cpp \
        animation/AnimationPlugin.cpp \
        animation/AnimationThread.cpp \
        audio/AudioPlugin.cpp \
        background/BackgroundPlugin.cpp \
        form/FormPlugin.cpp \
        navigation/NavigationPlugin.cpp \
        paint/PaintPlugin.cpp \
        video/VideoPlugin.cpp \
        jni-bridge.cpp \
    
    WEBCORE_PATH := C:/Path/AndroidBrowserPlugin/webkit/Source/WebCore
    
    LOCAL_C_INCLUDES += \
        $(JNI_H_INCLUDE) \
        $(LOCAL_PATH) \
        $(LOCAL_PATH)/animation \
        $(LOCAL_PATH)/audio \
        $(LOCAL_PATH)/background \
        $(LOCAL_PATH)/form \
        $(LOCAL_PATH)/navigation \
        $(LOCAL_PATH)/paint \
        $(LOCAL_PATH)/video \
        $(WEBCORE_PATH)/bridge \
        $(WEBCORE_PATH)/plugins \
        C:/Path/AndroidBrowserPlugin/webkit/Source/WebKit/android/JavaVM \
        C:/Path/AndroidBrowserPlugin/webkit/Source/WebKit/android/plugins \
        C:/Path/AndroidBrowserPlugin/platform_external_skia/include/core \
        C:/Path/AndroidBrowserPlugin/frameworks_native/include \
        C:/Path/AndroidBrowserPlugin/frameworks_native/libs \
        C:/Path/AndroidBrowserPlugin/frameworks_native/opengl/libs \
        C:/Path/AndroidBrowserPlugin/platform_system_core/include \
        C:/Path/AndroidBrowserPlugin/frameworks_native/opengl/include \
        C:/Users/user/android-ndk-r8c/platforms/android-14/arch-arm/usr/include \
        C:/Path/AndroidBrowserPlugin/BrowserPlugin/jni/libs/armeabi \
        C:/Path/AndroidBrowserPlugin/platform_bionic \
        C:/Path/AndroidBrowserPlugin/platform_bionic/libc/private \
        C:/Path/AndroidBrowserPlugin/platform_hardware_libhardware/include
    
    SO_LIB_PATH := C:/Path/AndroidBrowserPlugin/libs_qualcomm_MDP8960
    
    LOCAL_LDLIBS := \
        -L$(SO_LIB_PATH)/ -lnativehelper -landroid -lutils -lcutils -lEGL -lGLESv2 -lskia 
    
    LOCAL_CFLAGS += -fvisibility=hidden
    LOCAL_CFLAGS += -DHAVE_PTHREADS -DANDROID
    
    LOCAL_MODULE:= libsampleplugin
    
    LOCAL_MODULE_TAGS := optional
    
    include $(BUILD_SHARED_LIBRARY)
    

    Application.mk:

    # =============================================================================
    #
    # Main build file defining the project modules and their global variables.
    #
    # =============================================================================
    
    # Don't remove this - mandatory
    APP_PROJECT_PATH := $(call my-dir)
    
    # The only STL implementation currently working with exceptions
    APP_STL := gnustl_static
    
    # Don't optimize for better debugging
    APP_OPTIM := debug
    

    您可能还需要一些可以放置的头文件(例如JNIHelp.h),例如在您进行 ndk 构建的根目录中 BrowserPlugin/jni/。

    希望bash build.sh 应该构建您的libsampleplugin.so,构建脚本会将其复制到应用程序目录中。然后你可以例如将项目导入eclipse并构建应用程序。将其安装在设备上,然后例如使用 WAMP 服务器托管以下文件:

    index.html:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Test Plugin</title>
        </head>
        <body>
            <object type="application/x-testbrowserplugin" height=50 width=250 id="testPlugin">
                <param name="DrawingModel" value="Bitmap" />
                <param name="PluginType" value="Form" />
            </object>
        </body>
    </html>
    

    从您的主机运行ipconfig 以获取 IP 地址,例如192.168.x.x 然后将您的设备浏览器指向例如http://192.168.x.x/ 瞧,你应该会看到一个表单插件。

    我无法让动画插件正常工作,表单插件也不能完全正常工作,但至少插件被识别并加载正常。

    现在,您可以使用示例插件浏览器或其他 Internet 资源编写一个 webkit NPAPI 插件来做您喜欢的事情。

    【讨论】:

    • 您好,我知道这个问题太老了,但我想开发像 flash-player 这样的安卓浏览器插件。那么我该如何开始呢?以及如何为我的 android ndk 代码找到 npapi.h?如果有,请给我任何重要的提示或链接。谢谢
    • @BhadreshDevani 看到这个question
    【解决方案2】:

    这实际上是一个非常有趣的话题,最近在 blackhat 2014 (FakeID) 期间进行了讨论,但背景有所不同。他们在签名验证中发现了安全漏洞。

    在您的情况下,有两个有用的链接: 1)http://androidxref.com/4.3_r2.1/xref/frameworks/base/tests/BrowserTestPlugin/这是最新的webkit插件编写示例。尝试构建它 - 它需要静态链接 webkit 外部,否则您将收到“致命错误:android_npapi.h:没有这样的文件或目录” 2) http://androidxref.com/2.2.3/xref/development/samples/BrowserPlugin/ 这是较旧的示例,但它对“如何构建”浏览器插件有更广泛的描述

    结合使用这两个链接来开始你的插件开发

    但这并不能解决签名检查问题。即使插件被识别,它也不会被允许运行。我不确定谷歌做浏览器插件开发的过程是什么

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2014-08-05
      • 2014-08-10
      • 2020-05-05
      • 1970-01-01
      • 2014-06-06
      • 2012-07-19
      • 2012-01-29
      相关资源
      最近更新 更多