如何从源代码构建 v4 支持库

How to build v4 support library from source

我正在尝试从源代码构建 v4 支持库,因为我修改了库的一部分。我正在尝试使用 gradle 在 ubuntu 13.10 上执行此操作。我按照 answer 中的说明进行操作,但现在卡住了。我使用 gradle 1.10 和 ubuntu,因为当我尝试在 windows 上构建它时,它说 windows 不受支持,在 ubuntu 上使用 gradle 2.4 它说 gradle 1.10 是受支持的版本。当我尝试使用

构建时
gradle clean jar --stacktrace

我不断收到 IllegalStateException:缺少 llvm-rs-cc,这是我不断收到的堆栈跟踪的一部分

Caused by: java.lang.IllegalStateException: llvm-rs-cc is missing
    at com.android.builder.AndroidBuilder.compileAllRenderscriptFiles(AndroidBuilder.java:1281)
    at com.android.builder.AndroidBuilder$compileAllRenderscriptFiles.call(Unknown Source)
    at com.android.build.gradle.tasks.RenderscriptCompile.taskAction(RenderscriptCompile.groovy:99)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:533)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:516)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)

整个堆栈跟踪是here

我尝试查看 AndroidBuilder.java 上的源代码,但没有发现任何问题。 我什至尝试将上述 llvm-rs-cc 文件从 android-sdk-linux/build-tools 复制到尽可能多的文件夹。我已经将 llvm-rs-cc 二进制文件的路径添加到我的路径中,就像 BuildToolInfo.java 中的评论一样,还有我相信我使用 android 下载的 build-tools, tools, and platform-tools 的路径SDK 管理器。我确认路径是在重启后使用printenv命令添加的。

我做错了什么?

原来我需要编辑plaform/frameworks/support中的local.properties文件来添加sdk目录,即

sdk.dir=/path/to/android-sdk-linux/

添加这个实际上让整个 llvm-rs-cc 恶作剧消失了但是......还有更多

我关注的 Whosebug 回答说要使用这个命令

platform\frameworks\support\v4\gradle clean jar

我将其解释为导航到 v4 目录,然后使用

调用 gradle
gradle clean jar

这是我遵循的*完整步骤,以防有人也想构建支持库。

  1. 首先,按照answer中的说明进行操作:

You need to checkout additional repositories from https://android.googlesource.com:

  • platform/frameworks/support
  • platform/prebuilts/gradle-plugin
  • platform/prebuilts/maven_repo/android
  • platform/prebuilts/sdk
  • platform/prebuilts/tools

Please, keep the directory structure as in android repository.

  1. 安装软件包 lib32stdc++6lib32z1,我使用的是 apt-get

    sudo apt-get install lib32stdc++6

    sudo apt-get install lib32z1

  2. 从android开发者网站下载android sdk here

  3. 将存档解压缩到任何位置,然后导航到它,然后导航到 tools\

  4. 运行 ./android 这应该启动 sdk 管理器,然后下载这些包(如果尚未下载)

    • 所有 android api 从 api 4 到 api 22(您可能需要显示过时的包)。
    • 构建工具 19.01(您可能需要显示过时的包)和最新的构建工具
    • 最新的平台工具
    • 最新的 SDK 工具

通常这应该足以构建 gradle 的支持库,但事实证明 git 存储库中的 jar 文件 api 22 实际上不符合日期,因为它不包含 api 22 中添加的新 AccessibilityInfo 方法,是的,我反编译了它以确保。所以还要多走几步。

  1. 将您从 git 存储库下载的 platform/prebuilts/sdk/current 中的 andoid.jar 文件替换为 android-sdk-linux/platforms/android-22/
  2. 中的文件

我们差不多完成了,但还有两个问题。如果您现在尝试构建库,Fragment.javaFragmentActivity.java 中会出现两个编译错误,请随意修复这些错误,因为我不确定我对这些修复的正确性.

为了解决这些问题,在 #935 行的 Fragment.java 中,我添加了一个转换,所以

result.setFactory(mChildFragmentManager.getLayoutInflaterFactory());

变成了这个

result.setFactory((LayoutInflater.Factory)mChildFragmentManager.getLayoutInflaterFactory());

对于另一个修复,在 #299 行的 FragmentActivity.java 中,我替换了

final View v = mFragments.onCreateView(name, context, attrs);

有了这个

final View v = mFragments.onCreateView(null, name, context, attrs);

添加null的原因是因为在以前的版本中第一个参数View parent不存在并且在onCrateView方法中parent被声明并初始化为null。

生成的 jar 文件可以在 platform/out/host/gradle/frameworks/support/support-v4/build/libs/ 中找到 *有些步骤可能会遗漏,因为这个过程花了我很长时间,我可能忘记了我做过的一些事情。

eclipse help linkv4 support library help for building gradle

试试这个:

 compile files('libs/your.jar')