请教Android内置应用Browser编译成APK的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教Android内置应用Browser编译成APK的问题相关的知识,希望对你有一定的参考价值。
在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进行调试; 参考技术A 你应该找的是这个文档吧?
请教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)
出好像是类校验错误,不知道各位有遇到同样问题吗?是如何解决的?本回答被提问者和网友采纳
请教多文件夹makefile问题
一般来讲,一个项目会有多个模块,源文件分别放在不同的目录文件夹中。这时候,Makefile就需要遍历不同目录下的C程序源文件,然后分别编译成目标文件、然后再链接成可执行程序。
更深入的教程,可以参考Makefile工程实践视频教程,里面对源文件、目标文件、库分别使用目录进行管理,存放在不同的文件目录下,如何编写Makefile实现上面的目的。 参考技术A 在有.C文件的文件夹里都有makefile的存在,makefile的作用就是控制编译流程。
uboot源码的根目录下就有一个makefile文件。如果你想学习uboot,可以先看board目录里的makefile文件,这个文件告诉你电路板上电后,哪个函数先被执行。
以上是关于请教Android内置应用Browser编译成APK的问题的主要内容,如果未能解决你的问题,请参考以下文章
请教一下大神,我使用android killer编译时出现了aapt已停止运行,是啥问题
typescript Angular 2应用程序角色访问装饰器,包装内置CanAccess功能。当用户角色不是ap时,防止视图转换
Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段
Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段