2017-11-17 3 views
1

Ich habe ein Android-Projekt mit einem einzigen Android-Bibliothek-Modul, aber ich möchte es nicht auf herkömmliche Weise verwenden.Wie kann ich eine Grapple-Aufgabe einrichten, um dex jar und c Bibliotheken zu extrahieren?

Was ich jetzt mache, ist die Assembly der Bibliothek (mit der Assembly Großbuchstaben Aufgabe) und Post-Prozess der resultierenden * .aar-Datei.

Ich möchte eine gradle Aufgabe erstellen, dass:

  1. die classes.jar bauen und dex es s (ähnlich dex --dx ...);
  2. bauen Sie die nativen Bibliotheken;
  3. verschieben Sie alles in einem Ordner, den ich wählen kann.

Leider fand ich nur einen Weg, um nur die nativen Bibliotheken zu bauen (mit der eingebetteten gradle Aufgabe externalNativeBuildRelease).

Kann mir jemand mit diesem groovigen Megaproblem helfen?

Antwort

2

Hier ist eine build.gradle Datei, die am meisten, wenn nicht alles was Sie möchten extrahiert aus this.
Ich habe es in this Antwort verwendet.
Siehe auch The Gradle build system- Tutorial und Writing Custom Tasks.

Hier sind die definierten Aufgaben:

  • Aufgabe copyClasses
  • Aufgabe assembleExternalJar
  • Aufgabe copyJarToOutputs

Es sollten Sie die Inspiration geben zu tun, was Sie wollen:

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) 
Verwandte Themen