Как я могу кодировать 64-битный Android APK с помощью Gradle Experimental Plugin? - PullRequest
0 голосов
/ 25 октября 2019

Я разрабатываю приложения для Android с использованием Open Frameworks, платформы C ++, которая поддерживает Android. Его проекты Android используют экспериментальный плагин Gradle для поддержки C ++. Мне удалось получить эти файлы для создания неподписанных APK, которые отлично работают (с использованием Android Studio 2.3.2, 3.0, 3.5 или 3.5.1, Experimental Gradle Plugin 0.9.3,Распределение Gradle 3.3.0). Но теперь мне нужно кодировать их и включать 64-битные версии , чтобы опубликовать их в Android Store.

Для экспериментального плагина Gradle всегда требовалась отдельная версия дистрибутива Gradle для каждого из них. свои версии. А на текущей странице документации для плагина говорится, что мы можем "продолжать использовать экспериментальный плагин 0.11.0 с Android Studio 3.0 или более поздней версии", но я, похоже, заблокирован от подписи кода вышеупомянутым в Android Studio3.5 и 3.5.1.

Когда я пытаюсь использовать последние версии Android Studio (версии 3.5 или 3.5.1) для «Создание подписанного APK», меня останавливает «Gradle версии 4.1требуется. ".

Когда я пытаюсь использовать более старые версии Android Studio (версии 2.3.2 или 3.0) для" Создать подписанный APK ", я могу создать 32-разрядные APK с кодовой подписью,но я не знаю, как создавать 64-битные APK. Документация, которую я нашел, похоже, не относится к файлам Gradle, которые есть в Open Frameworks.

Примечания о моих попытках получитьдескриптор этого:

(насколько я понимаю, версия Gradle Plugin отличается от версии дистрибутива Gradle, как показано в этой таблице .)

Единственный источникЯ нашел где-нибудь для какой версии Gradle распределение для использования с плагином Gradle Experimental 0.11.0, является ответом на связанный вопрос . Я спросил ответчика, какую версию Android Studio они использовали, и они ответили 3.1, но не упомянули о кодировке (сейчас я их об этом спрашивал).

Похоже, версия "Плагин для Android" являетсявсегда совпадает с версией Android Studio, поэтому кажется, что нет способа запустить Android Gradle Plugin версии 3.0 с Android Studio 3.5.1, верно?

Итак, основываясь на вышеизложенном,Я попробовал:

Android Studio (и, следовательно, версию Gradle Plugin) 2.3.2 с Experimental Gradle 0.9.3 с использованием Gradle-дистрибутива 3.3.0 (кодовые обозначения 32-битных APK-файлов - не знаю, как сделать 64-битную)

Android Studio (и, следовательно, версия Gradle Plugin) 3.0.0 с Experimental Gradle 0.9.3 с использованием распределения Gradle 3.3.0 (кодовые обозначения 32-битных APK-файлов - не знаю, как сделать 64-битную)

Android Studio (и, следовательно, версия Gradle Plugin) 3.0.0 с Experimental Gradle 0.11.0 с использованием Gradle-дистрибутива 4.1.0 - я получаю ошибку Gradle:

*Gradle sync failed: Exception thrown while executing model rule: BaseComponentModelPlugin.Rules#createVariantData(ModelMap<AndroidBinaryInternal>, ModelMap<AndroidComponentSpec>, TaskManager) > afterEach()
    Consult IDE log for more details (Help | Show Log) (21s 58ms)*

Я обнаружил, что долженпример того, как создать 64-битные подписанные APK с помощью Gradle ЗДЕСЬ , но формат, предложенный для перечисления фильтров ABI:

ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'

В результате возникла ошибка, и сборка проекта Open Frameworks. gradle пытается включить все ABI, как показано в разделе android.productFlavors в нижней части build.gradle, как показано ниже:

def ofRoot(){ return '../../../' }

// Load common functions
apply from: ofRoot()+"libs/openFrameworksCompiled/project/android/common-functions.gradle"

buildscript {
    apply from: "../../../libs/openFrameworksCompiled/project/android/ndk-verify.gradle"

    repositories {
        jcenter()
    }
    dependencies {
        // Using the gradle-experimental version that supports c++
        classpath 'com.android.tools.build:gradle-experimental:0.9.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

apply plugin: 'com.android.model.application'

model {
    android {
        // openFrameworks currently only supports compiling against SDK 19
        compileSdkVersion = 23
        buildToolsVersion = "25.0.3"

        defaultConfig.with {
            minSdkVersion.apiLevel    = 23
            targetSdkVersion.apiLevel = 28
            versionCode     =  4
            versionName     = "0.1.1"
        }
    }

    android.ndk {
        moduleName = ofAppModuleName()
        toolchain  = buildToolchain()
        stl        = compilerStl()
        platformVersion = "21"
    }

    android.sources {
        main {
            jni {
                source {
                    srcDirs= appSrcDirs(ofRoot())

                    includes = srcIncludes(ofRoot())
                    excludes = srcExcludes(ofRoot())
                }

                // Link to openFrameworks
                dependencies {
                    project ":openFrameworksProject"  linkage "static"
                }
            }

            manifest {
                source {
                    srcDirs = [ "." ]
                }
            }
            res {
                source {
                    srcDirs = [ "res" ]
                }
            }
            java {
                source {
                    srcDirs = [ "srcJava" ]
                }
            }
            aidl {
                source{
                    srcDirs = ['srcJava']
                }
            }
            renderscript{
                source{
                    srcDirs = ['srcJava']
                }
            }
            jniLibs {
                source {
                    srcDirs = ['libs']
                }
            }
            assets {
                source {
                    srcDirs = ['bin/data'] + addonData(ofRoot())
                }
            }
        }
    }

    android.lintOptions {
        abortOnError  = false
    }

    android.buildTypes {
        release {
            minifyEnabled = false
        }
    }

    // Setup the different types of flavors (arm / x86),
    // and add linker flags based on that
    android.productFlavors {
        getAbis().each { abi ->
            create(getFlavorName(abi)) {
                ndk {
                    abiFilters.add(abi)

                    cppFlags.addAll(coreCppFlags(abi, ofRoot()))
                    cppFlags.addAll(addonCppFlags(abi, ofRoot()))

                    ldLibs.addAll(coreLdLibs(abi, ofRoot()))
                    ldLibs.addAll(addonLdLibs(abi, ofRoot()))

                    ldFlags.addAll(coreLdFlags(abi, ofRoot()))
                    ldFlags.addAll(addonLdFlags(abi, ofRoot()))
                }
            }
        }
    }
}


dependencies {
    addonJavaDependencies(ofRoot()).each { dep ->
        compile(project(path: dep[1] ))
    }
    compile project(path: ':ofAndroidLib')
}

Но это приводит только к 32-битному параметру Arm и 386 параметрам ABI вмастер CodeSign APK.

Кто-нибудь может подсказать, как создать 64-битный APK с кодовой подписью, используя Android Studio (любая версия) для плагина Experimental?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Мне удалось в итоге заставить его работать после многих дней головокружительных ударов, с помощью на форуме Open Frameworks. Это включало не только подписывание кода, но и использование версии OpenFrameworks, которая поддерживает 64-битные сборки, и большое количество конкретных настроек и шагов.

Мои заметки о шагах, версиях и настройках, которые наконец-то сработали, находятся здесь: https://forum.openframeworks.cc/t/notes-on-steps-i-took-to-successfully-get-a-64-bit-apk-published-to-the-google-app-store/33722

Между тем, если у кого-то есть другая полезная информация по теме, пожалуйста, поделитесь ею в ответе здесь. Я дам награду за самый полезный / релевантный ответ, кроме моего.

1 голос
/ 30 октября 2019

Существуют инструменты для подписи apk с помощью командной строки и с помощью zipalign. Вот документация

https://developer.android.com/studio/build/building-cmdline#sign_manually

Я считаю, что зипалин все еще будет работать с использованием эксперимента. или вы можете использовать стороннее приложение, которое может подписывать 64-битные приложения, такие как

https://github.com/patrickfav/uber-apk-signer

этот плагин подписывает приложение с 64-битной архитектурой.

...