默认android浏览器的浏览器插件

时间:2011-05-19 10:11:30

标签: android plugins

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

谢谢,

2 个答案:

答案 0 :(得分:6)

我最近尝试制作一个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..."

此处使用的签名是Adobe 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以查找您拥有的内容),则可以设置该属性。您可以研究如何在必要时进行更改。我使用的是高通Snapdragon MDP8960,它是开发板,已经有ro.secure = 0。为了让您的插件包含在Android中,您必须与负责人交谈 - 不确定目前这是多么可行。

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

我实际上从android source on github获取了我需要的源代码并创建了源代码的NDK构建,因为我比修改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"

<强> 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),例如BrowserPlugin/jni/}在你正在进行ndk构建的根bash build.sh

希望libsampleplugin.so应构建构建脚本复制到app目录的<!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> 。你可以,例如将项目导入eclipse并构建应用程序。将其安装在设备上,然后例如使用WAMP服务器来托管以下文件:

<强>的index.html:

ipconfig

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

我无法使动画插件正常工作,并且表单插件无法完全正常工作,但至少插件已被识别并加载正常。

现在,您可以使用示例插件浏览器作为指南或其他互联网资源编写webkit NPAPI插件来执行您喜欢的操作。

答案 1 :(得分:0)

这实际上是非常有趣的话题,最近在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/这是较旧的样本,但它有更广泛的描述&#34;如何构建&#34;浏览器插件

使用两个链接的组合来开始插件开发

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