工欲善其事,必先利其器!
成都创新互联是一家专注于网站制作、成都网站建设与策划设计,颍泉网站建设哪家好?成都创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:颍泉等地区。颍泉做网站价格咨询:18980820575
Android Apk 的推荐开发环境是Eclipse + ADT,它的调试、代码检查、分析、重构等功能为应用程序的开发提供了极大的方便。但对于象浏览器这样的内置应用,由于使用了一些Framework层的隐藏API,在Import到Eclipse工程时会报告很多错误。本文分析和解决了使用Eclipse建立浏览器Apk的开发环境的一系列问题。
问题:为什么使用Eclipse Import 浏览器目录建立的工程有很多错误
分析:查看这些错误,大部分都是类或者方法无法找到。这是因为浏览器作为内置应用,它使用了Framework里的一些隐藏API,这些API在代码中使用@hide标记,ADT 使用的Android.jar文件中没有包含这些隐藏API,导致在Eclipse工程中报告错误。
问题:这些隐藏的API可以使用吗?
分析:当然,既然浏览器可以在手机上运行,说明它使用的这些隐藏的API在运行环境是可用的。事实上,这些隐藏API都是被编译进入Framework的运行库的。为什么将它们@hide掉而且从android.jar中去除呢?这是个接口与实现的问题,APK应该依赖于Framework的接口,而不是实现,但作为内置应用,它是可以依赖实现的。
问题:如何在Eclipse工程中使用这些隐藏API?
分析:其实就像普通的Java工程一样,你想在工程中使用这些API,那就将它们的Jar包添加到你的工程Build Path中去即可。所以这里需要做的就是找到包含我们需要的API的Jar包。
问题:如何找到我们需要的Jar包?
分析:使用Android 源代码工程,可以在编译的中间文件中查找你需要的Jar包;或者可以在手机的/system/framework/下pull出来你需要的Jar文件,不过这个Jar文件是dex格式的,可以使用dex2jar工具转换为jar文件,不过,在手机上找这些Jar文件不太好判断是哪个文件,我曾经在4.2和4.3上比较容易地找到,不过在4.4上找了半天也没有找到common和google-common,如果你使用4.4,建议在Android源代码工程的编译中间文件夹中查找。
具体步骤:
首先说明,这里使用的是Android 4.4 版本。
第一步,Import Browser 代码,建立Eclipse 工程
使用Eclipse的Import Existing Android Code Into WorkSpace将/packages/apps/Browser目录Import到Eclipse中,建立工程。(代码里还有一个Test工程,这里没有使用)
这个时候打开工程,看到当前有619个错误:
随便打开一个源文件,比如com.android.browser.AddBookmarkPage.java,里面的错误如:
The import … cannot be resolved, … cannotbe resolved to a variable等都是文件或者方法找不到的错误。
第二步,根据错误提示,在工程的编译中间文件夹中查找我们需要的Jar包
注意这些目录下由于都是临时文件夹,Jar文件需要将它们重命名到恰当的名字。
比如在BrowserActivity文件中提示找不到这个文件:
com.google.common.annotations.VisibleForTesting
于是我们到编译的out/target中去find这个类,找到它的目录:
将这个class-jarjar.jar文件重命名为googlecommon.jar。
第三步,将前面找到的Jar文件都添加到工程的Java Build Path,注意,需要设置这些类的顺序在Android.jar(Android 4.4 dependency)之前,否则优先使用Android.jar中的类,导致某些方法找不到。
第四步:添加Android-support v13.jar到 Java Build Path.
从错误提示中可以看到需要support v13,这个jar包可以在SDK的sdk\extras\android\support\v13目录中找到。
第五步,修改AndroidManifest.xml,添加SDK Version
有一些错误检查是由于SDK版本,修改AndroidManifest.xml,添加SDK版本声明:
第六步:修改LogTag.java
将这个类的三个方法的内容删掉,我们不需要它们。
另外,有一些注解类也可以不要,比如在view.ScrollerView 中的错误:The annotation @ViewDebug.ExportedProperty must define the attributeflagMapping,将出错的这一句@ViewDebug.ExportedProperty(category= "layout")删掉即可。
OK,太棒了,所有的错误都消失了,现在我们有了一个没有编译错误的Android Apk工程了!