android - 默认安卓浏览器的浏览器插件

标签 android plugins

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

谢谢,

最佳答案

我最近尝试制作一个 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,请从 .cmd 中删除 ndk-build.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"

安卓.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)

应用程序.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构建脚本将其复制到 app 目录中。然后你可以例如将项目导入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 插件来做您喜欢的事情。

关于android - 默认安卓浏览器的浏览器插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057050/

相关文章:

javascript - 如何获取 jQuery 插件附加的元素?

android - 如何展开和折叠 ListView 中的项目

android - Corona SDK音频在Android上不起作用

android - 结合 layout_weight 和 maxHeight

java - 如何通过 Maven pom.xml 安装 Grails 插件?

android - 如何扩展HERE map 库?

rest - 使用Restful-API插件上传Grails文件

android - 简单的ListActivity崩溃

android - 获取平铺位图/重复位图

css - 如何更改插件的 CSS