Squeak.ru - шаблоны программирования

Использование исполняемого файла jar из gradle в android studio build.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, подпишите apk с файлом jar, используя мой сертификат, затем подпишите процесс сборки и 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 и поместить его в файл в корневом каталоге моих проектов. Таким образом, когда я использую кнопку воспроизведения, чтобы запустить его на устройстве, студия имеет контекст для пути к файлу и не использует какой-то дурацкий, которого не существует.

23.09.2014

  • Я также вижу, что задача запускается в первый раз, прежде чем что-либо будет установлено для моего определения apkLocation, как вы это проверили? 23.09.2014
  • В общем, вы никогда не должны вызывать task#execute(), так как это внутренний API Gradle. вместо этого вы должны определить зависимость задачи, используя runApkSigTool#dependsOn(assembleDebug). Также используйте метод file() для создания файловых объектов вместо нового File(), поскольку file() всегда работает относительно каталога вашего проекта, а «new File()» — нет. 23.09.2014
  • Я использую system.out.println для размещения сообщений в консоли во время выполнения сборки, чтобы я мог видеть выполнение своей задачи до того, как начнется остальная часть процесса сборки Android. Затем, поскольку я заставляю задачу запускаться снова, я вижу ошибку, которая по сути такая же, как если бы я запускал свою задачу вручную из командной строки без добавления аргументов для выполнения jar. Я пытался использовать зависимости от, но, возможно, я попробую еще раз, чтобы увидеть, смогу ли я получить желаемый результат. 23.09.2014
  • Мое окончательное решение для этого находится здесь stackoverflow.com/questions/26048396/ 29.09.2014

Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...