Android 浏览器独立 apk编译流程
第 1 节. 原理篇 .............................................................................................................................................. 1
1.简介: ......................................................................................................................................................... 1
2.源码组成: ................................................................................................................................................. 1
4.原理: ......................................................................................................................................................... 2
第 2 节. 编译操作篇: .................................................................................................................................. 2
1.条件准备: ................................................................................................................................................. 2
2.编译 java 层 ............................................................................................................................................... 2
3.编译 so 库 ................................................................................................................................................... 3
4.完成编译并运行测试代码 ......................................................................................................................... 5
第 3 节. 系统兼容篇: .................................................................................................................................. 6
1.原理: ......................................................................................................................................................... 6
2.操作步骤: ................................................................................................................................................. 6
3.libchromium_net2.so 的链接静态库: ...................................................................................................... 8
4.libwebcore2.so 链接静态库: ................................................................................................................... 8
5.编译出错问题的 log 及解决措施: ........................................................................................................ 10
总结: .......................................................................................................................................................... 13
本文主要对从 Android 系统源码中抽取出 Browser相关源码进行单独编译的流程进行说明。
第1节. 原理篇
1.简介:
Android原生的 Browser本质上是WebView的一个 demo,通过进一步定制就可以拿来商用,
同时本身具有很高的实用价值。本文通过抽取 Android 原生代码中与 Browser相关的源代码进
行单独编译,让其不再受 Android的不同版本差异的影响。
2.源码组成:
相关 android源代码主要有以下四个部分组成:
1].Browser.Apk 一个全功能浏览器 Demo。
2].android.webkit framework 适配层的 Java部分代码,对外提供了封装好的WebView
3].libwebcore.so 包括 WebKit的代码和平台适配层 C++部分的代码,
4].libchromium_net.so Chrome 的网络堆栈
3.目的:区分系统自带的 libwebcore.so,libchromium_net.so 库,将 framework层的代码提取到
Browser应用中,使 Browser应用不再依赖系统 framework 层的WebView,以达到让 Browser
独立的目的。
4.原理:
由于WebView包含两个部分,一部分是上层的 Java代码,包括若干 Java类,用于对外提供接
口;另一部分是下层的 C++代码,包括两个 so库(libwebcore.so 和 libchromium_net.so),用
于网页的解析和渲染。两个部分之间通过 JNI进行交互。
因此,编译WebView也需要分成两部分,一部分是编译 Java代码,另一部分是将 C++代码编
译成 so库。另外,由于 WebView的 Java代码中会使用到很多系统的隐藏 API,所以我们还需
要编译安卓系统,并从中获取几个 jar包。
第2节. 编译操作篇:
1.条件准备:
条件一:我们需要下载并编译任意一个版本的安卓系统源码,这里使用 Android4.3,具体步骤
可以参见《下载安卓系统源码教程》和《安卓系统源码编译教程》。
条件二:搭建好 eclipse+adt android 开发环境,我们这里使用 adt-bundle-windows-x86-
20131030,在 Android 开发官网上提供的一个 eclipse开发环境的集合包,只要在安装 sdk,就
可以运行,自带最新的 adt和一些需要的工具,同时还自带当时最新的 sdk,很方便(自己配
的话还是比较麻烦的)。
备注:不能使用 Intellij IDEA,因为之后添加 library的时候无法设置为 system library
2.编译 java 层
步骤一:将 Android源代码中的 package/apps/Browser的代码导入 Android
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
,此时我们就
有一个 BrowserActivity的工程,修改工程名称为 Browser(最后编译成的应用为 Browser.apk)
步骤二:在 src目录下创建一个 com.browser.webkit的包。然后将源码目录下的
frameworks/base/core/java/android/webkit目录下的所有文件拷贝到新创建的包中,此时 eclipse中
会出现大量的错误,不要惊慌,请接着向下操作
备注:大量的错误的原因主要是,1.包名错误 2.隐藏接口 3.类不存在 4.类型转换异常
步骤三:由于其中有一个缺少的类是编译之后生成的,所以我们还需要从编译完的源码目录
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/webkit 中
将 EventLogTags.java类也拷贝到新建的包中。
步骤四:接下来需要在工程中加入包含系统隐藏 API的 jar包,将以下三个 jar包重命名(名
称随意)后拷贝到工程的 lib 目录下(最好不要用 libs目录,因为 libs目录会被 eclipse自动识
别后将该目录下的 jar包自动导入,然后生成 apk的时候,都打包到其中,但是 apk运行时,
这些 jar包并不是必须的,为了减小 apk的大小,编译成 apk的时候,是不带这些 jar包的):
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates/classes.jar
将 jar包重名为 framework.jar, core.jar, bouncycastle.jar。如果还缺其他的 jar包,可以根据
提示到 out/target/common/obj/JAVA_LIBRARIES/ 搜索相应的文件名,然后提取 classes.jar文件
即可。
步骤五:Eclipse中打开工程的 Properties->Java Build Path->Libraries->Add Externel Jars, 找到
lib目录下的 jar包全部选中,点击 OK,三个 jar包就加到工程中了。
步骤六:添加完 Library之后,切换到 Order and Export选项卡,将刚刚新加入的 jar包调整到
最前面,确保隐藏 API不会被系统 API覆盖(由于包名相同),选择 OK。另外,还要把
Android Private Libraries库前的勾取消掉,否则之后运行会报错。
步骤七:由于我们的 java 文件都放到了 com.browser.webkit包下,我们已经不再使用系统的
WebView, 所以需要将工程中的所有 android.webkit字符串,替换成 com.browser.webkit. 使用
菜单中的 Search命令批量替换即可。完成替换后,刷新一下工程,会发现所有的错误都没
了。
注意:有可能还会提示 minSdkVersion 版本太低,直接按要求修改 AndroidManifest.xml文件即
可,由于不需要支持 android2.3 等低版本 Android平台,可以讲 minSdkVersion设置的高一
些。
小结:通过以上步骤,我们就已经初步得到了一个与 framework webkit无关的 Browser应用
了,从操作过程中,我们发现,尽管代码从 framework 移动到 Browser应用中,但是他们作为
系统应用所使用的一些隐藏的 API
3.编译 so库
此时我们的 Eclipse工程已经可以编译运行了,但是启动的时候会闪退,因为我们还没有加入
so库。下面我们就来编译 so库。
步骤一:进入到安卓源码的 external/chromium目录下,在终端执行以下命令:
$ sudo sed -i "s#android/webkit#com/browser/webkit2#g" `grep android/webkit -rl *`
可以将源码中的 android/webkit都替换成 com/browser/webkit,确保与我们的 java代码包名相
同。
步骤二:
打开 external/chromium目录下的 Android.mk文件,将其中的 libchromium_net 都替换成
libchromium_net2,同时增加一行 LOCAL_MODULE_TAGS := optional,修改部分如下:
LOCAL_MODULE := libchromium_net2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_TAGS := optional
INTERMEDIATES := $(call local-intermediates-dir)
步骤三:
回到安卓源码根目录,运行以下命令:
$ source build/envsetup.sh
$ mmm external/chromium
编译成功后可以在 out/target/product/generic/obj/lib 目录下找到 libchromium_net2.so文件。
步骤四: 编译 libwebcore2.so
进入到安卓源码的 external/webkit/Source/WebKit/android 目录下,在终端执行以下命令:
$ sudo sed -i "s#android/webkit#com/browser/webkit#g" `grep android/webkit -rl *`
同样可以将源码中的 android/webkit都替换成 com/browser/webkit,确保与我们的 java 代码包
名相同。
注意:可能会将 Android.mk 文件中的目录 android/webkit修改为 com/browser/wekbit导致编译
的时候找不到文件,修改回去就可以了。
步骤五:
打开 external/webkit目录下的 Android.mk 文件,将其中的 libwebcore都替换成 libwebcore2
(三个地方),并且增加一行 LOCAL_MODULE_TAGS := optional,另外还要将
LOCAL_SHARED_LIBRARIES 里面的 libchromium_net改成 libchromium_net2。修改部分如
下:
# Define our module and find the intermediates directory
LOCAL_MODULE := libwebcore2
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
base_intermediates := $(call local-intermediates-dir)
...
LOCAL_SHARED_LIBRARIES := \
libEGL \
libGLESv2 \
libandroid \
libandroidfw \
libandroid_runtime \
libchromium_net2 \
libcrypto \
...
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libwebcore2
LOCAL_MODULE_TAGS := optional
LOCAL_LDLIBS := $(WEBKIT_LDLIBS)
LOCAL_SHARED_LIBRARIES := $(WEBKIT_SHARED_LIBRARIES)
LOCAL_STATIC_LIBRARIES := libwebcore2 $(WEBKIT_STATIC_LIBRARIES)
LOCAL_LDFLAGS := -fvisibility=hidden
步骤六:
回到安卓源码根目录,运行以下命令:
$ source build/envsetup.sh
$ mmm external/webkit
编译成功后可以在 out/target/product/generic/obj/lib目录下找到 libwebcore2.so文件。
4.完成编译并运行测试代码
步骤一:
下面我们将以上编译生成的两个 so文件(libchromium_net2.so 和 libwebcore2.so)放到我们工
程的 libs/armeabi目录下。
这里我们直接 push 到手机或者虚拟机的/system/lib目录下
备注:如果没有写权限,用 Root Explorer修改
步骤二:
再修改工程 com.browser.webkit包下的 JniUtil.java和WebViewCore.java 文件,将其中的
static {
System.loadLibrary("webcore");
System.loadLibrary("chromium_net");
}
改为(注意,顺序也颠倒了)
static {
System.loadLibrary("chromium_net2");
System.loadLibrary("webcore2");
}
步骤三:缺少一些资源需要补上:(我在编译过程中没有缺少这些文件,情况不明这步放在这
里供后续参考)
首先将安卓源码目录下的 frameworks/base/core/res/res/values/styles.xml中的
粘贴到我们工程目录下的 res/values/styles.xml中。
然后再将 frameworks/base/core/res/res/layout/zoom_magnify.xml 文件复制到我们工程目录下的
res/layout中。
接着将 frameworks/base/core/res/res/drawable/btn_zoom_page.xml文件复制到我们工程目录下的
res/drawable中。
最后将 frameworks/base/core/res/res下的 drawable-ldpi、drawable-mdpi、drawable-hdpi、
drawable-xhdpi目录下的 btn_zoom_page_normal.png和 btn_zoom_page_press.png文件复制到我
们工程目录 res下的相应文件夹中。
步骤四:
编译最新的 Browser.apk, 再次运行,即可任意滑动浏览器了.
总结:至此我们的一个源代码相同 Android平台的版本是可以正常运行了,在本版本的浏览器
中包含了需要使用的 libchromium_net2.so 和 libwebcore2.so,使以后工程编译无需再次编译这
两个库,节省了很多工程编译的时间。同时也为 Android 项目的浏览器模块独立化迈出了第一
步。但是,这个版本在其他版本的安卓系统上可能会闪退,原因是缺少一些 so库,或者一些
引用。接下来的第二篇文章,我们主要来解决该问题
第3节. 系统兼容篇:
我们最后编译出来的版本只能在对应系统版本的模拟器或者真机才能运行,下面我们就需要解
决各个版本的兼容问题。仔细分析不同版本运行时报的错误。
1.原理:
兼容性问题解决例如运行时会出现很多如下类似的错误提示:
E/AndroidRuntime(523): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_librar
y[1285]: 36 cannot locate 'ucnv_setFromUCallBack_48'...
原因描述:编译出来的 4.3版本的 so库, 需要加载一些系统自带的动态库,而 Android不同版本
自带的动态库的接口却不尽相同,相互之间好多接口不兼容,或者根本就没有那个动态库,这
些问题都导致了 so库运行时异常。
解决措施:
1.添加相应的 so 动态库
1. 将其中有问题的 so库改为静态编译
2. 修改系统的接口,使其兼容旧的动态库接口
2.操作步骤:
举例:
E/AndroidRuntime(523): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_librar
y[1285]: 36 cannot locate 'ucnv_setFromUCallBack_48'...
步骤一:log分析:
分析上述 log,我们发现没有定义 setFromUCallBack
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
导致,但是我们并不知道
reloc_library库的源代码在哪里,也不明白 ucnv是什么意思,所以只能从定义
setFromUCallBack的方法 C 文件入手。
步骤二:类库定位:
回到工程根目录,只想如下命令:
#grep “setFromUCallBack” –risn ./
将报错的函数在源码目录中搜索可知,这个函数位于 external/icu4c/common目录下的一个文件
中,查看 Android.mk 文件可知,这个文件在库 libicuuc中。
步骤三:将动态库修改为静态库编译:
现在我们就将 libicuuc库静态编译为.a文件。
在 external/icu4c/common/Android.mk 文件中,local_ldlibs := -lpthread -lm这行之后,加入以下
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
:
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(src_files)
LOCAL_C_INCLUDES := $(c_includes) \
abi/cpp/include
LOCAL_CFLAGS := $(local_cflags) -DPIC -fPIC
LOCAL_RTTI_FLAG := -frtti
LOCAL_SHARED_LIBRARIES += libgabi++
LOCAL_LDLIBS += $(local_ldlibs)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libicuuc
include $(BUILD_STATIC_LIBRARY)
在终端中打开源码根目录,输入以下命令编译 icu4c模块:
mmm external/icu4c
内核数够的话,可以再加上-j4,编译速度会快很多。
步骤四:编译出的静态库位置:
编译完成之后,可以在
out/target/product/xxxx/obj/STATIC_LIBRARIES/libicuuc_intermediates/libicuuc.a
目录下找到编译出来的静态库。
3.libchromium_net2.so的链接静态库:
除了 libicuuc库外,libicui18n 库也需要进行静态编译。在 external/icu4c/i18n/Android.mk 文件
中,同样在 local_ldlibs := -lpthread -lm这行之后加入以下内容:
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(src_files)
LOCAL_C_INCLUDES := $(c_includes) \
abi/cpp/include
LOCAL_CFLAGS := $(local_cflags) -DPIC -fPIC
LOCAL_RTTI_FLAG := -frtti
LOCAL_SHARED_LIBRARIES += libicuuc libgabi++
LOCAL_LDLIBS += $(local_ldlibs)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libicui18n
include $(BUILD_STATIC_LIBRARY)
编译完成之后,同样可以在
out/target/product/xxxxx/obj/STATIC_LIBRARIES/libicui18n_intermediates/libicui18n.a
目录下找到编译出来的静态库。
下面我们将编译出来的静态库静态链接到 libchromium_net2.so。先打开 external/chromium目录
下的 Android.mk 文件,
增加一行 LOCAL_STATIC_LIBRARIES := libicui18n libicuuc
(注意顺序不能颠倒,否则会导致 libicuuc中的部分函数找不到),
同时在 LOCAL_SHARED_LIBRARIES 中将 libicui18n libicuuc删除,并加上 libgabi++。修改
完的内容如下:
LOCAL_WHOLE_STATIC_LIBRARIES += libevent modp_b64 dmg_fp libcutils
LOCAL_STATIC_LIBRARIES := libicui18n libicuuc
LOCAL_SHARED_LIBRARIES := libstlport libexpat libcrypto libssl libz libsqlite libcutils libdl li
bgabi++
修改完毕后,编译 libchromium_net2.so
$ source build/envsetup.sh
$ mmm external/chromium
4.libwebcore2.so 链接静态库:
通过测试我们发现 libwebcore2.so 需要如下的静态库 libicui18n、libskia、libft2、libgui、
libmedia、 libicuuc、libui、libutils,所以这几个库采用类似的方法进行静态编译。
编译完成之后,修改 external/webkit下的 Android.mk 文件中的 LOCAL_SHARED_LIBRARIES
和 LOCAL_STATIC_LIBRARIES 如下:
LOCAL_SHARED_LIBRARIES := \
libEGL \
libGLESv2 \
libandroid \
libandroidfw \
libandroid_runtime \
libchromium_net2 \
libcrypto \
libdl \
libmedia_native \
libnativehelper \
libsqlite \
libssl \
libstlport \
libz \
libgabi++ \
libemoji \
libbinder \
libhardware \
libhardware_legacy \
liblog \
libcorkscrew \
libsonivox \
libcamera_client \
libstagefright_foundation \
libaudioutils \
libexpat
LOCAL_STATIC_LIBRARIES := libxml2 libxslt libhyphenation libskiagpu libv8 libicui18n libskia li
bft2 libgui libmedia libicuuc libui libutils
备注:某些版本的手机运行在 Android4.4上回出现 AUTOFILL空指针,解决方法如下:
该功能在中国基本是没有用的,禁掉该功能就可以了,具体方法如下:
步骤一:
External/webkit目录下的 Android.mk 中将 ENABLE_AUTOFILL字段修改如下所示
ENABLE_AUTOFILL = false
步骤二:
步骤一后,编译会出错,大概意思是
external/webkit/Source/WebKit/android/jni/WebCoreFrameBridge.cpp该文件会提示几个函数找不
到,解决措施添加相应函数的引用即可,具体方法如下:
在WebCoreFrameBridge.h 中添加如下代码
#include "base/memory/scoped_vector.h"
步骤三:此时就可以编译了,顺利的话就可以编译出 libwebcore2.so了。
$ source build/envsetup.sh
$ mmm external/webkit
5.编译出错问题的 log及解决措施:
1. 运行的时候提示:
Dx 1 error; aborting
onversion to Dalvik format failed with error 1
将 Order and Export选项卡中的 Android Private Libraries库前的勾取消掉,再次运行即可
2. 编译 libchromium_net2.so 或 libwebcore2.so库时,提示错误:
make: *** No rule to make target `out/target/product/generic/obj/SHARED_LIBRARIES/libc_interm
ediates/export_includes', needed by `out/target/product/generic/obj/STATIC_LIBRARIES/libevent_int
ermediates/import_includes'. Stop.
由于未指定 target引起的,先执行以下命令再继续编译即可:
$ lunch xxxx
3. Eclipse中运行报错:
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 172 could not lo
ad needed library 'libchromium_net2.so' for 'libwebcore2.so' (load_library[1093]: Library 'libchromiu
m_net2.so' not found)
将 chromium_net2 和 webcore2 的加载顺序颠倒即可:
static {
System.loadLibrary("chromium_net2");
System.loadLibrary("webcore2");
4.运行时提示
java.lang.NoSuchMethodError: android.app.ActivityManager.isHighEndGfx
是由于虽然我们引入了系统编译出来的 jar包,但是加载的时候还是加载当前系统的 jar包,导
致找不到这个隐藏的方法。解决方法:1]可以将该函数改为反射调用即可。2]使用系统签名, 3]
将带隐藏方法的 jar包编译到 Browser.apk中
5.
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1306]: 172 cannot loc
ate 'u_charDirection_50'...
解决措施:见问题 8
6.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN6icu_488Collator14createIn
stanceER10UErrorCode" referenced by "libchromium_net2.so"...
解决措施:见问题 8
7.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN6icu_4814MessagePattern5
clearEv" referenced by "libchromium_net2.so"...
解决措施:见问题 8
8.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "usearch_open_48" referenced by
"libwebcore2.so"...
问题 5,6, 7, 8问题解决措施:
缺少 libicuuc.so 的某些接口,需要编译静态库,如兼容性举例:
Lib 路径:external/icu4c/common
缺少 libicui18n.so的某些接口
Lib 路径:external/icu4c/i18n
9.
java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libmedia_native.so" needed by "
libwebcore2.so"; caused by library "libmedia_native.so" not found
lib库路径 frameworks/av/media/ libmedia_native Android4.3 以后就没有 libmedia_native.so 了,
反正使用的静态库,灵活编译就可以了。
10.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_Z19SkCreateRLEPixelRefRK8
SkBitmap" referenced by "libwebcore2.so"...
libskia.so中的某些接口变更导致
静态变异 libskia.a
Lib路径:external/skia
11.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN7android21SurfaceCompose
rClient14getDisplayInfoEiPNS_11DisplayInfoE" referenced by "libwebcore2.so"...
需要将 libgui.so编译成静态库,然后链接到 libwebcore2.so 中
lib库路径:frameworks/native/libs/gui
12.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN7android6Tracer4initEv" ref
erenced by "libwebcore2.so"...
需要将 libutils.so编译成静态库,然后链接到 libwebcore2.so 中
lib库路径:frameworks/native/libs/utils
13.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNK7android10AudioTrack7la
tencyEv" referenced by "libwebcore2.so"...
lib库路径 frameworks/av/media/libmedia
14.
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNK7android6Region5writeEP
vj" referenced by "libwebcore2.so"...
15.
E/AndroidRuntime( 1946): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol
"_ZN7android7SnifferC1Ev" referenced by "libwebcore2.so"...
由于高通项目修改了 frameworks\av\include\media\stagefright中的 DataSource.h添加了 Sniffer
类导致该问题,原始 android 代码中是没有该类的。解决措施使用 Android 原生代码进行编
译。
16.
java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_relocate(linker.cpp:992): cannot locate
symbol "__strchr_chk" referenced by "libchromium_neth.so"
这个异常,在网上找到的解决方法是使用最新的 ndk进行编译,可以解决该问题,但是还没有
实验,而此问题也只出现在比 Android4.2的手机上(我使用的是 Andriod4.3)的工程。
17.
E/dalvikvm( 2921): dlopen("/system/lib/libwebcore2.so") failed: dlopen failed: cannot locate symbol
"_ZN11GraphicsJNI12createBitmapEP7_JNIEnvP8SkBitmapbP11_jbyteArrayi" referenced by
"libwebkit.so"...
18.
需要将静态编译 libemoji.so
Lib路径:frameworks/opt/emoji
19.
静态编译 libv8.so
Lib路径:external/v8
20.
其他缺少引用的或者编译出现的问题,请参考以上解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,进行解决,举一反三,多尝试是
一个法宝,当然度娘是人类最好的朋友。^_^
总结:
编译兼容性的 Browser.apk让我痛苦不堪,首先使用高通提供的平台代码,其中他们修改了好
多 C层的代码,导致不同的 Android版本根本不兼容,与原生的 Android 源代码有较大的差
异,如 Skia中关于字体的某些代码被屏蔽掉,而去使用高通自己编译的一个库。V8根本就无
法修改为静态编译,高通提供了一个已经编译好的 libv8.so库供我们使用,坑爹啊。在
Android4.4上运行 Android4.2.2编译出的动态库,缺少的不仅仅是引用,还缺少函数的定义等
等,简直是让人抓狂。
环境很重要,对于一个菜鸟级的人去编译该内容,尽管是照着网上的两篇文章进行操作的,但
还是出现了许多问题,让后接着百度,不断尝试,锲而不舍,最后还是没有实现目标—使用
Android4.2或者 Android4.3 平台上编译出可以再 Android4.4平台上运行的浏览器。
最后的成果是,解决了大部分运行时问题,最后问题出现在 skia库的运行时异常,大概是字体
显示时使用 skia渲染有问题。
感悟:尽管经历更多的错误是走向“专家”的重要道路,但是名师指路更加重要。路漫漫,我
们还需继续求索。
下次编译一定要使用 Andriod 原始的代码,因为百度,谷歌上还有参考资料。最起码可以给我
脆弱的心灵以安慰。^_^