gpt4 book ai didi

android - 如何设置 gradle 任务来提取 dex jar 和 c 库?

转载 作者:行者123 更新时间:2023-11-30 00:15:39 24 4
gpt4 key购买 nike

我有一个带有单个 android 库模块的 android 项目,但我不想以常规方式使用它。

我现在所做的是组装库(使用 assemble gradle 任务)并对生成的 *.aar 文件进行后处理。

我想创建一个 gradle 任务:

  1. 构建 classes.jar 并dex它(类似于 dex --dx ...);
  2. 构建本地库;
  3. 将所有内容移动到我可以选择的文件夹中。

不幸的是,我只找到了一种构建 native 库的方法(使用嵌入式 gradle 任务 externalNativeBuildRelease)。

谁能帮我解决这个 groovy gradle 问题?

最佳答案

这是一个 build.gradle 文件,它可以完成大部分(如果不是全部)您想要从 this 中提取的内容。 .
我在this中使用了它答案。
另见The Gradle build system- TutorialWriting Custom Tasks .

这里是定义的任务:

  • 任务复制类
  • 任务 assembleExternalJar
  • 任务复制JarToOutputs

它应该给你灵感去做你想做的事:

import org.apache.tools.ant.taskdefs.condition.Os

//jrg
apply plugin: 'com.android.library'
//apply plugin: 'com.android.application'

android {
compileSdkVersion Integer.parseInt(COMPILE_SDK)
buildToolsVersion BUILD_TOOLS_VERSION

defaultConfig {
targetSdkVersion Integer.parseInt(TARGET_SDK)
minSdkVersion Integer.parseInt(MIN_SDK)
}
}
// Add the main project as a dependency for our library
dependencies {
compile project(':app')
}
// Define some tasks which are used in the build process
task copyClasses(type: Copy) { // Copy the assembled *.class files for only the current namespace into a new directory
// get directory for current namespace
def namespacePath = PLUGIN_NAMESPACE.replaceAll("\\.","/")
// set source and destination directories
from "build/intermediates/classes/release/${namespacePath}/"
into "build/intermediates/dex/${namespacePath}/"

// exclude classes which don't have a corresponding entry in the source directory
def remExt = { name -> name.lastIndexOf('.').with {it != -1 ? name[0..<it] : name} }
eachFile {details ->
def thisFile = new File("${projectDir}/src/main/java/${namespacePath}/", remExt(details.name)+".java")
if (!(thisFile.exists())) {
details.exclude()
}
}
}

task assembleExternalJar << {
// Get the location of the Android SDK
ext.androidSdkDir = System.env.ANDROID_HOME
if(androidSdkDir == null) {
Properties localProps = new Properties()
localProps.load(new FileInputStream(file('local.properties')))
ext.androidSdkDir = localProps['sdk.dir']
}
// Make sure no existing jar file exists as this will cause dx to fail
new File("${buildDir}/intermediates/dex/${PLUGIN_NAMESPACE}.jar").delete();
// Use command line dx utility to convert *.class files into classes.dex inside jar archive
String cmdExt = Os.isFamily(Os.FAMILY_WINDOWS) ? '.bat' : ''
exec {
commandLine "${androidSdkDir}/build-tools/${BUILD_TOOLS_VERSION}/dx${cmdExt}", '--dex',
"--output=${buildDir}/intermediates/dex/${PLUGIN_NAMESPACE}.jar",
"${buildDir}/intermediates/dex/"
}
copyJarToOutputs.execute()
}

task copyJarToOutputs(type: Copy) {
// Copy the built jar archive to the outputs folder
from 'build/intermediates/dex/'
into 'build/outputs/'
include '*.jar'
}


// Set the dependencies of the build tasks so that assembleExternalJar does a complete build
copyClasses.dependsOn(assemble)
assembleExternalJar.dependsOn(copyClasses)

关于android - 如何设置 gradle 任务来提取 dex jar 和 c 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47355578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com