我如何使用隐藏的和内部的API来构buildAndroid SDK?

我想重buildAndroid SDK(或者只是android.jar)来包含隐藏的和内部的API。

我找不到任何文件或讨论如何去做这件事。 我有一个Ubuntu的CyanogenMod生成环境已经可以build立cm7的设置。

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

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

这是我总是使用隐藏的API。

  1. https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yongbuild立回购或下载jar子;
  2. 复制出/目标/共同/ obj / JAVA_LIBRARIES / framework_intermediates / classes.jar(最好将其重命名为类似framework_all.jar)
  3. configuration你的项目构buildpath – >库 – >添加这个外部jar子。 在“订购”和“导出”中,将其上移到android.jar之前

我已经做了一些调查,我的结论就是: 这不能没有一点工作。 阅读本答案的其余部分,了解我所find的细节。


android.jar实际上是由framework.jarcore.jar中的“public api”组成的,它在设备上的system/frameworks/android.jar是一种我所谓的Java库头,所有在实际字节码中的实现都只是throw new RuntimeException("stub");一个throw new RuntimeException("stub"); ,这可以让你build立对android.jar (例如在Eclipse中),但执行必须在设备或模拟器上执行。

Android SDK的公共API是由@{hide} javadoc注释为前缀的类/方法/字段定义的。 即所有注释的东西都包含在SDK中。

android.jar是由位于out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates中的源码 build/tools/droiddoc ,它本身是由位于build/tools/droiddoc的工具DroidDoc生成的。

DroidDoc是生成实际的Android SDK文档的工具(可能适用于javadoc,或者使用javadoc)。 作为一个副作用,可能是因为它已经parsing了所有的javadoc,它也会将android stub编码到SDK中分发的android.jar中。

因此,要包含隐藏的内容,如果只想包含特定的部分,只需删除@hide注释并重新@hide SDK即可。

但是,如果你想包括所有的隐藏部分事情变得更加复杂。 你可以修改DroidDoc (相关源代码在build/tools/droiddoc/src/Stubs.java ),这样就没有任何东西被隐藏。 这是相当微不足道的,我已经尝试过,但是,然后生成的存根不会编译。

我现在的结论是,这根本不可行。 如果删除检测隐藏注释的DroidDoc部分,那么生成的存根(Stub)是不可编译的,而且需要相当多的工作才能正确编译。

所以我对你的问题的回答是:不,这不能做,没有做很多工作。 抱歉。


关于mkstubs工具的一个mkstubs 。 当你build立一个SDK插件时 ,你可以使用mkstubs ,也就是你可以在供应商的Android SDKpipe理器中find的插件,例如三星为你提供了三星手机专用的API。 mkstubs与DroidDoc存根生成过程非常相似,但是它不使用@hide注释,它使用描述哪些包/类/字段包含或从SDK插件中排除的.defs文件。

然而,这与这个问题无关,因为Android SDK构build不使用mkstubs工具。 (不幸。)

我们可以从Android平台重build* .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格式的* .jar转换为真正的JAR:

 dex2jar core.jar dex2jar framework.jar 

然后使用“添加外部JARs …”(假设您使用的是Eclipse ADT)

  • 右键点击Project→Properties→Java Build Path→Libraries→Add External JAR …→(从上面selectcore-dex2jar.jar和framework-dex2jar.jar)。

这将使您能够使用内部和一些Java 7 API。 (据我所知,生成的APK不包含来自JAR的实际代码。)

DroidCon 2011

Sony Ericson的Erik Hellman解释了如何访问隐藏的Android API:

http://vimeo.com/30180393 (嗯链接似乎不工作)。

转到DroidCon网页第2天向下滚动到使用隐藏的API 10:15 ,你可以在那里看。

链接正在死亡!

我find了这个: http ://skillsmatter.com/podcast/os-mobile-server/hidden-api不知道多久它会

Android SDK中的官方API通常足以满足大多数正常的应用程序。 但是,有时开发人员需要访问未在官方API中发布的内部系统服务,API和资源。 幸运的是,这些API仍然可以通过一些聪明的技巧获得,而且在Android上开发新的创新解决scheme时通常会很有用。 在本次会议中,您将学习如何访问和使用这些隐藏和保护的API,其使用限制和一些tips'n'trick如何在多个供应商设备和Android版本中以安全和控制的方式使用它们。 观众将看到几个您通常无法使用Android的高级演示。 期待一个相当先进的会议,在Android平台的内部有很多的见解。

对于棒棒糖stream量是有点不同:

  1. 从棒棒糖设备获取/system/framework/arm/boot.oat

  2. 使用'java -jar oat2dex.jar boot boot.oat'

  3. 你会得到2个文件夹:dex和odex。 去dex并使'java -jar dex2jar.jar framework.dex'
  4. 将生成的framework.jar重命名为.zip,提取并find您需要的类
  5. 转到[sdk_path] / platforms / [target_platform]并提取android.jar(首先将其重命名为zip)。
  6. 将提取的框架文件复制到提取的android.jar中。 然后压缩到zip并重命名为.jar 🙂

PS:可能你需要重复步骤4-6“framework_classes2.dex”

试着看看这个 :

这些文章的最终目标是为开发者提供内部和隐藏API的权力,而不用反思。 如果您完成下面几个部分中描述的所有步骤,您将能够像使用公开的API一样使用InternalHidden API。 将不需要反思。

但是,如果你使用这些非公开的API,那么你应该知道你的应用程序有很大的风险。 基本上没有保证API将不会被下一次更新到Android操作系统中断。 甚至不能保证来自不同供应商的设备之间的一致行为。 你完全是你自己的。

有三种情况你可能要遵循:

  1. 启用内部隐藏的 API(schemeA)
  2. 只启用隐藏的 API(schemeB)
  3. 只启用内部 API(schemeC)

场景A是B和C的总和。场景B是最简单的一个(不需要eclipse ADT插件修改)。

情景A :阅读第1,2,3,4,5部分

情景B :阅读第1,2,3,5部分

情景C :阅读第1,2,3,4,5部分

你可以下载修改后的android.jar作为隐藏的API从这个仓库中使用 。 按照那里的指示。

我曾经编写过一些Groovy脚本,用于从http://source.android.com/的repo checkout中提取java文件,然后编译它们而不需要完整的工具链来编译所有的android源代码,包括所需的其他步骤包装,生成资源等)。

他们可以在这里find:

https://github.com/thoutbeckers/CollectAndroid

肯定这将需要更新姜饼后的任何东西,主要是通过在configuration文件(CollectConfig.groovy)中的“rootdirs”中设置正确的目录。

在那个时候,我经常使用这个开发包含所有隐藏的API和源代码(当时也存在问题)。

正如其他地方所提到的,由于访问规则的限制,com / android / internal / **仍然会隐藏在ADT的最新版本中。

在索尼爱立信网页上有一篇博客文章,里面有Erik Hellmans的谈话和代码,以及一些我认为对你有用的参考资料。

亲切的问候
/约翰

我不能评论,但这基本上是@ KennyTM的评论( https://stackoverflow.com/a/13550030/2923406 )优秀的答案:

如果您发现自己在Eclipse中出现以下错误:

 The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class files 

(即android.internal。*不可用)

那么一个可能的解决scheme是对/system/framework/framework2.jar应用相同的方法。 使用Android模拟器SDK19我有这个额外的jar。 在我的HTC One甚至有一个framework3.jar。

龙的答案为我工作,但我仍然缺less一些我需要的类,特别是android.provider.Telephony。 我能够像这样添加它:

  1. findclass级的位置

     $ cd /path/to/out/target/common/obj/JAVA_LIBRARIES $ find . | grep "/Telephony.class" ./telephony-common_intermediates/classes/android/provider/Telephony.class ./android_stubs_current_intermediates/classes/android/provider/Telephony.class 
  2. 添加新的类并重build框架JAR文件

     cd /path/to/temp/folder cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes . cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/classes . cd classes jar cvf ../framework.jar . 

或者你可以懒惰,并将所有的类包含到一个巨大的jar文件中:

 cd /path/to/temp/folder cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes . cd classes jar cvf ../framework.jar .