如何从源代码构建 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
这是我遵循的*完整步骤,以防有人也想构建支持库。
- 首先,按照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.
安装软件包 lib32stdc++6
和 lib32z1
,我使用的是 apt-get
sudo apt-get install lib32stdc++6
sudo apt-get install lib32z1
从android开发者网站下载android sdk here
将存档解压缩到任何位置,然后导航到它,然后导航到 tools\
运行 ./android
这应该启动 sdk 管理器,然后下载这些包(如果尚未下载)
- 所有 android api 从 api 4 到 api 22(您可能需要显示过时的包)。
- 构建工具 19.01(您可能需要显示过时的包)和最新的构建工具
- 最新的平台工具
- 最新的 SDK 工具
通常这应该足以构建 gradle 的支持库,但事实证明 git 存储库中的 jar 文件 api 22 实际上不符合日期,因为它不包含 api 22 中添加的新 AccessibilityInfo 方法,是的,我反编译了它以确保。所以还要多走几步。
- 将您从 git 存储库下载的
platform/prebuilts/sdk/current
中的 andoid.jar
文件替换为 android-sdk-linux/platforms/android-22/
中的文件
我们差不多完成了,但还有两个问题。如果您现在尝试构建库,Fragment.java
和 FragmentActivity.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')
我正在尝试从源代码构建 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 clean jar
这是我遵循的*完整步骤,以防有人也想构建支持库。
- 首先,按照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.
安装软件包
lib32stdc++6
和lib32z1
,我使用的是 apt-getsudo apt-get install lib32stdc++6
sudo apt-get install lib32z1
从android开发者网站下载android sdk here
将存档解压缩到任何位置,然后导航到它,然后导航到
tools\
运行
./android
这应该启动 sdk 管理器,然后下载这些包(如果尚未下载)- 所有 android api 从 api 4 到 api 22(您可能需要显示过时的包)。
- 构建工具 19.01(您可能需要显示过时的包)和最新的构建工具
- 最新的平台工具
- 最新的 SDK 工具
通常这应该足以构建 gradle 的支持库,但事实证明 git 存储库中的 jar 文件 api 22 实际上不符合日期,因为它不包含 api 22 中添加的新 AccessibilityInfo 方法,是的,我反编译了它以确保。所以还要多走几步。
- 将您从 git 存储库下载的
platform/prebuilts/sdk/current
中的andoid.jar
文件替换为android-sdk-linux/platforms/android-22/
中的文件
我们差不多完成了,但还有两个问题。如果您现在尝试构建库,Fragment.java
和 FragmentActivity.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')