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

时间:2015-06-21 08:20:30

标签: android gradle compilation android-support-library

我正在尝试从源sice构建v4支持库,我修改了库的一部分。我正在尝试使用gradle在ubuntu 13.10上执行此操作。我按照answer中的说明进行操作,但现在我卡住了。我使用gradle 1.10和ubuntu,因为当我尝试在windows上构建它时,它表示不支持windows,而在使用gradle 2.4的ubuntu上,它表示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的源代码并且没有任何消息。 我甚至尝试将android-sdk-linux/build-tools中的llvm-rs-cc文件复制到尽可能多的文件夹中。我已经将llvm-rs-cc二进制文件的路径添加到我的路径中,就像BuildToolInfo.java中的注释一样,以及我认为我使用android sdk管理器下载的build-tools, tools, and platform-tools路径。我确认在重新启动后使用printenv命令添加了路径。

我做错了什么?

3 个答案:

答案 0 :(得分:9)

事实证明,我需要编辑local.properties中的plaform/frameworks/support文件以添加sdk目录,即

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

添加这实际上使整个llvm-rs-cc shenenigans消失但是......还有更多

我跟随的stackoverflow回答说使用这个命令

platform\frameworks\support\v4\gradle clean jar

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

调用gradle
gradle clean jar

以下是我所遵循的*完整步骤,以防任何人想要构建支持库。

  1. 首先,请按照此answer
  2. 中的说明操作
      

    您需要从中检出其他存储库   https://android.googlesource.com

         
        
    • platform / frameworks / support
    •   
    • platform / prebuilts / gradle-plugin
    •   
    • 平台/ prebuilts / MAVEN_REPO /机器人
    •   
    • 平台/ prebuilts / SDK
    •   
    • 平台/ prebuilts /工具
    •   
         

    请保持目录结构与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工具
    5. 通常这应该足以使用gradle构建支持库,但事实证明,api 22的git存储库中的jar文件实际上并不是最新的,因为它不包含新的AccessibilityInfo方法在api 22中添加了,是的我反编译它确定。还有一些步骤。

      1. 将您从git存储库下载的andoid.jar中的platform/prebuilts/sdk/current文件替换为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方法中父类被声明并初始化为null。

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

答案 1 :(得分:0)

试试这个:

 compile files('libs/your.jar')

答案 2 :(得分:-1)