我如何使用隐藏的和内部的API来构buildAndroid SDK?
我想重buildAndroid SDK(或者只是android.jar)来包含隐藏的和内部的API。
我找不到任何文件或讨论如何去做这件事。 我有一个Ubuntu的CyanogenMod生成环境已经可以build立cm7的设置。
现在,我读到使SDK将构buildSDK,但我想要构build一个SDK,其中包括使用@hide标记为隐藏的方法和字段。 这可能吗?
我想要做的是对使用隐藏API的应用程序进行更改,并为了重build它,我想使用修改的SDK。
这是我总是使用隐藏的API。
- 从https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yongbuild立回购或下载jar子;
- 复制出/目标/共同/ obj / JAVA_LIBRARIES / framework_intermediates / classes.jar(最好将其重命名为类似framework_all.jar)
- configuration你的项目构buildpath – >库 – >添加这个外部jar子。 在“订购”和“导出”中,将其上移到android.jar之前
我已经做了一些调查,我的结论就是: 这不能没有一点工作。 阅读本答案的其余部分,了解我所find的细节。
android.jar
实际上是由framework.jar
和core.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量是有点不同:
-
从棒棒糖设备获取/system/framework/arm/boot.oat
-
使用'java -jar oat2dex.jar boot boot.oat'
- 你会得到2个文件夹:dex和odex。 去dex并使'java -jar dex2jar.jar framework.dex'
- 将生成的framework.jar重命名为.zip,提取并find您需要的类
- 转到[sdk_path] / platforms / [target_platform]并提取android.jar(首先将其重命名为zip)。
- 将提取的框架文件复制到提取的android.jar中。 然后压缩到zip并重命名为.jar 🙂
PS:可能你需要重复步骤4-6“framework_classes2.dex”
试着看看这个 :
这些文章的最终目标是为开发者提供内部和隐藏API的权力,而不用反思。 如果您完成下面几个部分中描述的所有步骤,您将能够像使用公开的API一样使用Internal和Hidden API。 将不需要反思。
但是,如果你使用这些非公开的API,那么你应该知道你的应用程序有很大的风险。 基本上没有保证API将不会被下一次更新到Android操作系统中断。 甚至不能保证来自不同供应商的设备之间的一致行为。 你完全是你自己的。
有三种情况你可能要遵循:
- 启用内部和隐藏的 API(schemeA)
- 只启用隐藏的 API(schemeB)
- 只启用内部 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。 我能够像这样添加它:
-
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
-
添加新的类并重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 .