【问题标题】:How can I codesign a 64-bit Android APK using the Gradle Experimental Plugin?如何使用 Gradle Experimental Plugin 对 64 位 Android APK 进行代码设计?
【发布时间】:2019-10-25 20:00:04
【问题描述】:

我正在使用 Open Frameworks 开发一个 Android 应用程序,这是一个支持 Android 的 C++ 框架。它的 Android 项目使用 Gradle 实验插件来允许 C++。 我已经能够得到这些来构建运行良好的 未签名 APK (使用 Android Studio 2.3.2、3.0、3.5 或 3.5.1,实验性 Gradle 插件 0.9。 3,和 Gradle 分布 3.3.0)。 但现在我需要对它们进行代码设计并包含 64 位版本,以便将它们发布到 Android 商店。

Gradle Experimental Plugin 一直要求每个版本都有一个特定的 Gradle 分发版本。 current doc page for the plugin 说我们可以“在 Android Studio 3.0 或更高版本中继续使用实验性插件 0.11.0”,但我似乎无法在 Android Studio 3.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 -bit APKs。我找到的文档似乎不适用于我从 Open Frameworks 获得的 Gradle 文件。

关于我尝试处理此问题的说明:

(据我所知,Gradle 插件版本与映射 in this table 的 Gradle 分发版本不同。)

我在任何地方找到的与 Gradle Experimental 插件 0.11.0 一起使用的 Gradle 发行版 版本的唯一来源是 this answer to a related question。我问回答者他们使用的是什么版本的 Android Studio,他们说是 3.1,但没有提到代码设计(我现在已经问过他们了)。

看起来“Android Gradle Plugin”版本总是和Android Studio版本一样,所以似乎没有办法用Android Studio 3.5.1运行Android Gradle Plugin 3.0版本,对吧?

所以基于以上,我尝试了:

Android Studio(以及 Gradle 插件版本)2.3.2 和 Experimental Gradle 0.9.3 使用 Gradle 分发版 3.3.0(代码设计 32 位 APK - 不知道如何做 64 位)

Android Studio(以及 Gradle 插件版本)3.0.0 和 Experimental Gradle 0.9.3 使用 Gradle 发行版 3.3.0(代码设计 32 位 APK - 不知道如何做 64 位)

Android Studio(以及 Gradle 插件版本)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)*

我找到了有关如何使用 Gradle HERE 创建 64 位签名 APK 的假定文档,但建议列出 ABI 过滤器的格式:

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

导致错误,Open Frameworks 的项目 build.gradle 尝试包含所有 ABI,如 build.gradle 底部附近的 android.productFlavors 部分所示,如下所示:

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')
}

但这会导致代码设计 APK 向导中只有 32 位 Arm 和 386 ABI 选项。

谁能告诉我如何使用 Android Studio(任何版本)为实验性插件构建代码签名的 64 位 APK?

【问题讨论】:

    标签: android android-studio android-gradle-plugin code-signing gradle-experimental


    【解决方案1】:

    有一些工具可以使用命令提示符和使用 zipalign 对 apk 进行签名。这是文档

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

    我相信 zipaline 仍然可以在实验中使用。 或者您可以使用可以签署此类 64 位应用程序的 3rd 方应用程序

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

    此插件使用 64 位架构签署应用程序。

    【讨论】:

    • 非常感谢!事实证明,代码设计部分只是问题的一部分。更大的问题是首先构建一个 64 位 APK,并且需要获得最新的 OpenFrameworks 构建,它增加了对这样做的支持。一旦正确设置(考虑到 Android Studio 中的所有缺陷并不容易)并且设置各种版本的所有不同位置都有正确的数字,那么 Android Studio 将对其进行代码设计。等等。似乎有大约三十个细节没有真正记录在案,以使其正常工作。我今天仍在努力把它全部到位!
    【解决方案2】:

    在 Open Frameworks 论坛上的帮助下,经过多天的努力,我终于让它工作起来了。它不仅涉及代码签名,还涉及使用支持 64 位构建的 OpenFrameworks 版本以及大量特定设置和步骤。

    我对最终起作用的步骤、版本和设置的注释在这里:https://forum.openframeworks.cc/t/notes-on-steps-i-took-to-successfully-get-a-64-bit-apk-published-to-the-google-app-store/33722

    同时,如果有人对此主题有任何其他有用的信息,请在此处的答案中分享。除了我的以外,我会奖励最有用/最相关的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多