如何构建具有隐藏和内部API的Android SDK?

Tho*_*ann 82 android android-source android-sdk-2.3

我想重建Android SDK(或者更确切地说只是android.jar)以包含隐藏和内部API.

我找不到任何关于如何解决这个问题的文档或讨论.我已经设置了一个能够构建cm7的Ubuntu CyanogenMod构建环境.

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

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

小智 65

这是我经常使用隐藏的api.

  1. https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong建立仓库或下载罐子
  2. 复制出/ t​​arget/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar(最好将其重命名为framework_all.jar)
  3. 配置项目构建路径 - >库 - >添加此外部jar.在Order and Export中,将其向上移动并在android.jar之前

  • 此方法适用于所有设备,还是仅适用于目标设备? (2认同)

Bja*_*sen 41

我已经对此做了一些调查,我的结论很简单:如果没有相当多的工作,这是不可能完成的.阅读本答案的其余部分,了解我所发现的详细信息.


android.jar实际上由"公共API"的framework.jarcore.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.jarSDK中分发的存根.

因此,要包含您可能隐藏的内容,如果您只想包含特定部分,只需删除@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工具.(不幸.)

  • @ThomasHofmann:关于`$(hide)`,你自己很困惑.`$(hide)`只是makefile中的一个前缀,用于隐藏正在执行的程序的实际命令行,仅此而已,它几乎可以在任何地方使用.**它与Android SDK或源代码中的`@ hide`注释没有任何关系.** (2认同)

ken*_*ytm 29

我们可以从Android平台重建*.jar文件.

首先,将ADB连接到您的设备.然后运行:

adb pull /system/framework/core.jar .
adb pull /system/framework/framework.jar .
Run Code Online (Sandbox Code Playgroud)

core.jar包含标准的Java库(java.*)和framework.jar包含了Android库(android.*).这还不可用,因为实际文件是DEX格式,而不是JAR格式.

我们可以使用dex2jar等工具将这些DEX格式的*.jars转换为真正的JAR :

dex2jar core.jar
dex2jar framework.jar
Run Code Online (Sandbox Code Playgroud)

然后使用"添加外部JAR ..."(假设您正在使用Eclipse ADT)拉入这些罐子

  • 右键点击Project ? Properties ? Java Build Path ? Libraries ? Add External JARs...→(选择core-dex2jar.jarframework-dex2jar.jar从上面).

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

  • 重要的是要注意,这种方法仍适用于ICS和后来的系统,但需要更多的杂耍.相关文件是`/ system/framework/core.odex`,`/ system/framework/framework.odex`,可能还有更多.这些可以是deodexed(`java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core`)和reodexed(`java -jar smali-2.0.3.jar - x -o core.dex core`),只有在`dex2jar core.dex`完成它的工作之后. (7认同)

dev*_*ant 16

对于Lollipop来说,流程略有不同:

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

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

  3. 您将获得两个文件夹:dex和odex.转到dex并制作'java -jar dex2jar.jar framework.dex'
  4. 将生成的framework.jar重命名为.zip,提取并查找所需的类
  5. 转到[sdk_path]/platforms/[target_platform]并解压缩android.jar(首先将其重命名为zip).
  6. 将文件从提取的框架复制到解压缩的android.jar.然后压缩到zip并重命名为.jar :)

ps:可能你需要为'framework_classes2.dex'重复步骤4-6

  • 所以看起来最近版本的 dex2jar 已经改变了下载的格式。只需解压缩下载文件,而不是“java -jar ...”,直接在 framework.dex 文件上运行脚本“d2j-dex2jar.sh”或“d2j-dex2jar.bat”,具体取决于您的平台 (2认同)

Blu*_*ell 15

DroidCon 2011

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

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

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

链接正在消失!

我发现了这个:http://skillsmatter.com/podcast/os-mobile-server/hidden-api dunno它会持续多长时间

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


Zor*_*orb 12

试着看看这个:

这些文章的最终目标是为开发人员提供内部和隐藏API的强大功能,而无需使用反射.如果您完成了下面几个部分中描述的所有步骤,您将能够使用内部隐藏 API,就像它们是公共开放API一样.不需要反思.

但是,如果您使用这些非公共API,那么您应该意识到您的应用程序存在很大风险.基本上无法保证下次更新Android操作系统时不会破坏API.甚至不保证来自不同供应商的设备之间的一致行为.你完全靠自己.

您可能想要遵循三种方案:

  1. 启用内部 API 和隐藏 API(方案A)
  2. 仅启用隐藏的 API(方案B)
  3. 仅启用内部 API(方案C)

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

方案A:读取部件1,2,3,4,5

方案B:读取部件1,2,3,5

方案C:读取部件1,2,3,4,5

  • 我已经读过那篇博文了.它提到了这一点:"1)Android是一个开源项目.我们可以下载源代码并自定义构建系统,因此它不会从android.jar中排除内部和隐藏类.这是一个很难的方法." 不幸的是,它没有详细说明. (3认同)
  • 转到博客文章的最后一部分(https://devmaze.wordpress.com/2011/01/19/using-com-android-internal-part-5-summary-and-example/),有一个链接( https://github.com/inazaruk/android-sdk/tree/master/platforms)预先构建包含所有隐藏和内部API的Android API. (3认同)

Ang*_*i H 12

您可以android.jar从此存储库下载已修改以用作隐藏API .按照那里的说明.

  • 应该更多地回答这个答案,因为它是最简单的解决方案.人们,如果你正在寻找一个解决方案 - 知道其他人已经这样做了,并为那个github仓库提供了解决方案.使用它,享受!)) (2认同)