在android studio build.gradle中使用gradle中的可执行jar文件

时间:2014-09-23 05:51:29

标签: android jar gradle

我有一个Android应用程序,我试图在我的构建过程运行后用自定义任务签署apk。我已经到了事后运行任务的地步但在控制台中我得到以下错误:

Error: Invalid command syntax
  java -jar apksigtool.jar <apk-file> <private-key-file-der-format> <certificate-x509-file>

现在我可以从命令行运行这个可执行文件没问题,但是在构建文件生成apk文件后我无法运行任务。

我试图使用build.gradle文件完成的是:

创建一个未签名的apk 使用我的证书用jar文件签署apk 然后有构建过程签名和zipalign apk

这是我到目前为止所拥有的

import java.text.SimpleDateFormat
import java.util.regex.Pattern

apply plugin: 'com.android.application'


def buildTime() {
    def df = new SimpleDateFormat("yyyyMMdd'-'HHmm")
    df.setTimeZone(TimeZone.getDefault())
    return df.format(new Date())
}

def apkName = "MyApp"
def apkLocation

task (runApkSigTool , dependsOn: android, type: JavaExec) {

    classpath files('apksigtool.jar')
    main 'com.widevine.tools.android.apksigtool.ApkSigTool'
    args[0] = apkLocation
    args[1] = 'private_key.der'
    args[2] = 'my.crt'
    System.out.println(apkLocation);
}



android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"


signingConfigs{

    debug{
        storeFile file("debug.keystore")
        storePassword "android"
        keyAlias "androiddebugkey"
        keyPassword "android"

    }

    release{
        storeFile file("debug.keystore")
        storePassword "android"
        keyAlias "androiddebugkey"
        keyPassword "android"

    }

}


buildTypes {

    debug{

    }

    release {

        signingConfig signingConfigs.release
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        assembleDebug.doLast{
           runApkSigTool.execute()
        }

        zipAlign true

    }

    debug{

        signingConfig signingConfigs.debug
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        assembleDebug.doLast{
            runApkSigTool.execute()
        }

        zipAlign false

    }


    android.applicationVariants.all { variant ->

        def manifestFile = file("C:\\path\\app\\src\\main\\AndroidManifest.xml")
        def pattern = Pattern.compile("versionName=\"(.+)\"")
        def manifestText = manifestFile.getText()
        def matcher = pattern.matcher(manifestText)
        matcher.find()
        def versionName = matcher.group(1)
        pattern = Pattern.compile("versionCode=\"(.+)\"")
        matcher = pattern.matcher(manifestText)
        matcher.find()
        def versionCode = matcher.group(1)

        if (variant.zipAlign) {
            variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+"-unaligned.apk");
            variant.zipAlign.inputFile = variant.outputFile
            variant.zipAlign.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");
        } else {

            apkLocation = "apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk";
            variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");

            System.out.println("CREATED UNSIGNED APK---------------")

        }

    }

}
lintOptions {
    abortOnError false
    ignoreWarnings true
    checkAllWarnings false
}



}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:20.0.0'
compile 'com.android.support:mediarouter-v7:20.0.0'
compile 'com.google.android.gms:play-services:5.0.89'
}

我还可以看到,在为apkLocation的定义设置任何内容之前,该任务第一次运行。另一件事是我不知道我是否在我的任务中正确使用参数来首先运行jar文件。实际上没有任何现成的文档能够完成我需要完成的工作,所以希望有人可以提供帮助。

更新的 我在我的项目中找到了apk文件最终的根目录。但是,当我使用运行按钮来执行调试构建时,我发现它试图从错误的路径安装apk。

第二次更新
我已将部分构建文件替换为此

if (variant.zipAlign) {
            def buildTime = buildTime();
            new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+"-unaligned.apk");
            variant.outputFile = file("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+"-unaligned.apk");
            variant.zipAlign.inputFile = variant.outputFile
            new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+".apk");
            variant.zipAlign.outputFile = file("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+".apk");
        } else {
            def buildTime = buildTime();
            new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+".apk");
            apkLocation = projectRoot+"apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+".apk";
            variant.outputFile = file("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime+".apk");

            System.out.println("CREATED UNSIGNED APK---------------")

        }


这给了我确切的结果,它允许我创建apk并将其放在我的项目根目录中的文件中。这样,当我使用播放按钮将其启动到设备工作室时,文件路径的上下文并没有使用一些不存在的古怪。

0 个答案:

没有答案