猿问

如何使用可用的隐藏API和内部API构建Android SDK?

我想重建Android SDK(或更确切地说,仅是android.jar)以包括隐藏的和内部的API。

我找不到有关如何执行此操作的任何文档或讨论。我已经安装了一个能够构建cm7的Ubuntu CyanogenMod构建环境。

现在,我读到make SDK将构建SDK,但我想构建一个SDK,其中包含使用@hide标记为隐藏的方法和字段。这可能吗?

我想要做的是对使用隐藏API的应用程序进行更改,为了重建它,我想使用修改后的SDK。


牧羊人nacy
浏览 535回答 3
3回答

智慧大石

我已经对此进行了一些调查,而我的结论很简单:没有大量工作就无法完成。阅读此答案的其余部分,以详细了解我所发现的内容。android.jar实际上由“公共API”的framework.jar和core.jar被发现在system/frameworks/该设备上。android.jar我称之为Java库标头,实际字节码中的所有实现都只是一个throw new RuntimeException("stub");,这使您可以针对它android.jar(例如在Eclipse中)进行构建,但是必须在设备或仿真器上执行。Android SDK的公共API由未以@{hide}javadoc注释为前缀的类/方法/字段定义。也就是说,所有未注释的内容都包含在SDK中。android.jar从位于源中内置out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates本身由工具生成DroidDoc位于build/tools/droiddoc。DroidDoc是生成实际Android SDK文档的工具(可能是从javadoc改编而成,或使用javadoc改编而成)。作为副作用,可能是因为它已经解析了所有javadoc,所以它还会喷出android存根,然后将android.jar其编译为在SDK中分发的。因此,要包含隐藏的内容,如果只想包含特定部分,则可以删除@hide注释并重新构建SDK。但是,如果要包括所有隐藏部分,事情会变得复杂得多。您可以修改DroidDoc(相关资源在中build/tools/droiddoc/src/Stubs.java),以使任何内容都不会被检测为隐藏。这相当琐碎,我已经尝试过了,但是随后生成的存根根本无法编译。我现在的结论是,这根本不可行。如果删除DroidDoc中检测隐藏注释的部分,则生成的存根将无法编译,并且需要大量工作才能正确编译。因此,我对您的问题的回答是:不,如果不做很多工作就无法完成。抱歉。有关该mkstubs工具的旁注。mkstubs在构建SDK插件时使用,即您可以在Android SDK管理器中从供应商处找到的插件,例如Samsung为您提供针对Samsung手机特定内容的附加API。mkstubs与DroidDoc存根生成过程几乎相同,但是它不使用@hide注释,它使用一个.defs文件来描述要从SDK插件中包含或排除哪些程序包/类/字段。然而,这一切无关的问题,如在Android SDK构建并不能使用该mkstubs工具。(不幸。)

噜噜哒

我们可以从Android平台重建* .jar文件。首先,将ADB连接到您的设备。然后运行:adb pull /system/framework/core.jar .adb pull /system/framework/framework.jar .在core.jar包含标准的Java库(java.*)和framework.jar包含了Android库(android.*)。由于实际文件是DEX格式而不是JAR格式,因此尚不可用。我们可以使用诸如dex2jar之类的工具将这些DEX格式的* .jars转换为真实的JAR :dex2jar core.jardex2jar framework.jar然后使用“添加外部JAR ...”拉入这些jar(假设您正在使用Eclipse ADT)右键单击Project → Properties → Java Build Path → Libraries → Add External JARs...→(从上方选择core-dex2jar.jar和framework-dex2jar.jar)。这将使您能够使用内部和某些Java 7 API。(据我所知,生成的APK不包含JAR中的任何实际代码。)
随时随地看视频慕课网APP

相关分类

Android
我要回答