请教Android内置应用Browser编译成APK的问题

 我来答
百度网友a55450c
2015-01-22 · 超过13用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:31.2万
展开全部
在Eclipse创建一个Android工程,把android.webkit目录下的Java代码拷贝过来;
将/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/webkit下面的EventLogTags.java也拷贝到自己的工程;
因为android.webkit下的类会使用SDK中非公开的API,我们需要解决编译错误:
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
/home/roger/a41/out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates/classes.jar
创建一个User Library,并且勾选System Library的选项;
加入以下Jar包:
在Java Build Path/Order and Export把创建的库放在最前面;
因为在我们应用中的android.webkit包跟SDK中的重名,所以我们需要更改包名,可以改成android.webkit2;
我们需要重新编译libchromium_net.so和libwebcore.so,并且使用另外的名字,并且把其代码中使用的android/webkit/ JNI路径改成android/webkit2/保证JNI的正确性:
在/home/roger/a41/external/chromium下面,把所有源文件的android/webkit/路径改成android/webkit2/;
打开/home/roger/a41/external/chromium/Android.mk,修改库名为libchromium_net2,并且加多一行“LOCAL_MODULE_TAGS := optional“,具体内容见后;
重新编译chromium_net,得到libchromium_net2.so;
在/home/roger/a41/external/webkit/Source/WebKit/android下面,把所有源文件的android/webkit/路径改成android/webkit2/;
打开/home/roger/a41/external/webkit/Android.mk,将库名改成libwebcore2.so,并且加多一行“LOCAL_MODULE_TAGS := optional“(需要修改两个地方,静态库编译和动态库编译),另外还需要把导入库libchromium_net改成libchromium_net2,具体内容见后;
重新编译webcore,得到libwebcore2.so;
接下来我们可以把修改后的libwebcore2.so和libchromium_net2.so push到手机的rom里面,假设路径是/data/local(如果没有写权限,用Root Explorer修改);
然后我们需要修改Java的代码,让它去加载我们自己的库,修改的地方位于JniUtil.java和WebViewCore.java,具体内容见后(加载顺序需要改变,先加载libchromium_net2.so再加载libwebcore2.so);
最后加上我们自己的Test Shell的代码,运行就OK了,如果只修改了C++的代码,重编译后再Push到手机,然后重新运行Test Shell就可以马上生效,Java的代码可以在Eclipse里面很方便的调试,C++的代码理论上也可以通过GDB进行调试;
huanglenzhi
2015-01-22 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517194
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
你应该找的是这个文档吧?
请教Android内置应用Browser编译成APK的问题

  获取Browser应用源代码,使用android.bat生成ant编译脚本,编译时报告缺少
  com.google.android.googleapps.IGoogleLoginService
  查相关资料了解到 该包是google提供的可选包,可以在源码目录的以下位置找到:
  frameworks\opt
  我将opt目录下的client.jar 和 framework.jar 放在Project的libs目录下(即第三方jar包所在的目录下)。
  再执行编译时会报告以下错误:
  dex: [echo] Converting compiled files and external libraries into bin/classes.dex... [apply] UNEXPECTED TOP-LEVEL EXCEPTION: [apply] java.lang.IllegalArgumentException: already added: Lcom/google/android/googleapps/IGoogleLoginService$Stub$Proxy; [apply] at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) [apply] at com.android.dx.dex.file.DexFile.add(DexFile.java:143) [apply] at comand.dexer.Main.processClass(Main.java:299)
  再不知道为什么又会报告已经添加过了?
  于是我再从build.xml中的dex任务中排除掉以上jar包。此时编译正常了。安装编译的apk时也正常,但运行是出现以下错误:
  W/dalvikvm( 849): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) E/AndroidRuntime( 849): Uncaught handler: thread main exiting due to uncaught exception E/AndroidRuntime( 849): java.lang.VerifyError: com.android.browser.BrowserProvider E/AndroidRuntime( 849): at java.lang.Class.newInstanceImpl(Native Method) E/AndroidRuntime( 849): at java.lang.Class.newInstance(Class.java:1472) E/AndroidRuntime( 849): at android.app.ActivityThread.installProvider(ActivityThread.java:3842) E/AndroidRuntime( 849): at android.app.ActivityThread.installContentProviders(ActivityThread.java:3659) E/AndroidRuntime( 849): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3618)
  出好像是类校验错误,不知道各位有遇到同样问题吗?是如何解决的?
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式