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

如何使用隐藏和内部API构建Android SDK?,android,android-sdk-2.3,android-source,Android,Android Sdk 2.3,Android Source,我想重建AndroidSDK(或者只重建Android.jar),以包含隐藏的和内部的API 我找不到任何关于如何进行这项工作的文件或讨论。我已经安装了一个Ubuntu CyanogenMod构建环境,可以构建cm7 现在,我读到makesdk将构建SDK,但我想构建一个SDK,其中包含使用@hide标记为隐藏的方法和字段。这可能吗 我想做的是对使用隐藏API的应用程序进行更改,为了重建它,我想使用修改后的SDK。 索尼爱立信的Erik Hellman解释了如何访问隐藏的Android API:

我想重建AndroidSDK(或者只重建Android.jar),以包含隐藏的和内部的API

我找不到任何关于如何进行这项工作的文件或讨论。我已经安装了一个Ubuntu CyanogenMod构建环境,可以构建cm7

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

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

索尼爱立信的Erik Hellman解释了如何访问隐藏的Android API:

(嗯,链接似乎不起作用)

使用隐藏API 10:15转到向下滚动到,您可以在那里观看

链接正在消亡

我找到了这个:我不知道,还要多久

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

试着看看:

这些文章的最终目标是在不使用反射的情况下为开发人员提供内部和隐藏API的功能。如果您完成了下面几个部分中描述的所有步骤,您将能够像使用公共开放API一样使用内部和隐藏API。没有必要反省

但是如果您使用这些非公共API,那么您应该意识到您的应用程序面临着巨大的风险。基本上,我们不能保证API不会因为Android操作系统的下一次更新而被破坏。对于来自不同供应商的设备之间的一致行为,甚至没有任何保证。你完全靠自己。

您可能希望遵循以下三种情况:

  • 同时启用内部和隐藏API(场景A)
  • 仅启用隐藏API(场景B)
  • 仅启用内部API(场景C)
  • 场景A是B和C的总和。场景B是最简单的(不需要eclipse ADT插件修改)

    场景A:阅读部分

    场景B:阅读部分

    场景C:阅读部分


    我已经对此做了一些调查,我的结论很简单:如果没有大量的工作,这是不可能做到的。阅读此答案的其余部分,了解我发现的细节


    android.jar
    实际上由
    framework.jar
    core.jar
    的“公共api”组成,可在设备上的
    system/frameworks/
    中找到
    android.jar
    是一种我称之为Java库头的东西,实际字节码中的所有实现都只是一个
    抛出新的RuntimeException(“存根”),这允许您根据
    android.jar
    (例如在Eclipse中)进行构建,但必须在设备或模拟器上执行

    Android SDK的公共API由类/方法/字段定义,这些类/方法/字段的前缀不带
    @{hide}
    javadoc注释。也就是说,SDK中包含所有未注释的内容


    android.jar
    是从
    out/target/common/obj/JAVA\u LIBRARIES/android\u stubs\u current\u intermediates
    中的源代码构建的,它本身是由
    build/tools/DroidDoc
    中的工具DroidDoc生成的

    DroidDoc是生成实际Android SDK文档的工具(可能改编自javadoc或使用javadoc)。作为一个副作用,可能是因为它已经在解析所有的javadoc,它还输出了android存根,然后将这些存根编译到SDK中分发的
    android.jar

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

    然而,如果你想包括所有隐藏的部分,事情会变得复杂得多。您可以修改DroidDoc(相关源代码位于
    build/tools/DroidDoc/src/Stubs.java
    )以使未检测到任何隐藏内容。这非常简单,我已经尝试过了,但是随后生成的存根根本不编译

    我现在的结论是,这根本不可行。如果删除DroidDoc中检测隐藏注释的部分,则生成的存根是不可编译的,并且需要大量工作才能正确编译

    所以我对你的问题的回答是:不,不做很多工作,这是不可能的。对不起。


    关于
    mkstubs
    工具的旁注
    mkstubs
    用于构建SDK插件,即可以从供应商的Android SDK管理器中找到的插件,例如三星为您提供了针对三星手机的附加API
    mkstubs
    与DroidDoc stubs生成过程基本相同,但它不使用
    @hide
    注释,而是使用
    .defs
    文件描述
    adb pull /system/framework/core.jar .
    adb pull /system/framework/framework.jar .
    
    dex2jar core.jar
    dex2jar framework.jar
    
    The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class   files
    
    mkdir /tmp/framework
    cp framework.jar /tmp
    cd /tmp/framework
    jar xvf ../framework.jar
    mv android classes
    
    $ 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
    
    cd /tmp/framework
    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 .
    
    cd /tmp/framework
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes .
    cd classes
    jar cvf ../framework.jar .