【问题标题】:How to build v4 support library from source如何从源代码构建 v4 支持库
【发布时间】:2015-06-21 08:20:30
【问题描述】:

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

gradle clean jar --stacktrace

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

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 中的注释以及 build-tools, tools, and platform-tools 的路径一样,我相信我是使用 android sdk 管理器下载的。我确认重启后使用printenv命令添加了路径。

我做错了什么?

【问题讨论】:

    标签: android gradle compilation android-support-library


    【解决方案1】:

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

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

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

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

    platform\frameworks\support\v4\gradle clean jar
    

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

    调用 gradle
    gradle clean jar
    

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

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

    您需要从 https://android.googlesource.com:

    • 平台/框架/支持
    • 平台/prebuilts/gradle-plugin
    • 平台/prebuilts/maven_repo/android
    • 平台/prebuilts/sdk
    • 平台/预建/工具

    请保持目录结构与 android 存储库相同。

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

      sudo apt-get install lib32stdc++6

      sudo apt-get install lib32z1

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

    3. 将存档解压到任意位置,然后导航到该位置,然后转到tools\

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

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

    通常这应该足以使用 gradle 构建支持库,但事实证明 git 存储库中 api 22 的 jar 文件实际上不是最新的,因为它不包含添加的新 AccessibilityInfo 方法在 api 22 中,是的,我对它进行了反编译以确定。所以再走几步。

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

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

    为了解决这些问题,我在 Fragment.java 的 #935 线上添加了一个演员表

    result.setFactory(mChildFragmentManager.getLayoutInflaterFactory());
    

    变成了这个

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

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

    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/找到 *有些步骤可能会丢失,因为这个过程花了我很长时间,而且我可能忘记了我做过的一些事情。

    【讨论】:

      【解决方案2】:

      试试这个:

       compile files('libs/your.jar')
      

      【讨论】:

        【解决方案3】:

        【讨论】:

        • “虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。”请参阅 stackoverflow help page 以创建高质量的答案
        猜你喜欢
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 2010-11-17
        相关资源
        最近更新 更多