当前位置: 首页 > 知识库问答 >
问题:

如何使用分级实验插件对 64 位Android APK 进行编码?

昌勇锐
2023-03-14

我正在使用开放框架开发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 实验性插件始终要求每个版本都有一个特定的 Gradle 发行版版本。该插件的当前文档页面说我们可以“继续使用实验性插件0.11.0与Android Studio 3.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位apk。我发现的文档似乎不适用于我从开放框架中获得的Gradle文件。

关于我试图处理这个问题的笔记:

(据我所知,Gradle Plugin版本与此表中映射的Gradle发行版不同。)

我在任何地方找到的与Gradle实验插件0.11.0一起使用哪个版本的Gradle发行版的唯一来源是对一个相关问题的回答。我问回答者他们使用的是什么版本的Android Studio,他们说是3.1,但没有提到协同设计(我现在已经问过他们了)。

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

基于以上,我尝试:

Android Studio(因此是Gradle插件版本)2.3.2,实验Gradle 0.9.3,使用Gradle发行版3.3.0(代码设计,32位APK-不知道如何做64位)

Android Studio(因此是渐变插件版本)3.0.0,使用渐变分发3.3.0的实验性渐变0.9.3(编码32位APK - 不知道如何做64位)

Android Studio(因此是渐变插件版本)3.0.0,使用渐变分发4.1.0的实验性渐度0.11.0 - 我收到一个渐变错误:

*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创建64位签名APK的假设文档,但是列出ABI过滤器的建议格式:

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

结果出现错误,Open Framework的项目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吗?

共有2个答案

益稳
2023-03-14

在开放框架论坛上的帮助下,经过多日的努力,我最终设法让它工作起来。它不仅涉及代码签名,还涉及使用支持64位构建的OpenFramework版本,以及大量特定设置和步骤。

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

同时,如果任何人有关于这个主题的其他有用信息,请在这里分享。我会把赏金给除我以外最有用/最相关的答案。

沈健
2023-03-14

有一些工具可以使用命令提示符和使用压缩对齐来签署apk。这是文档

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

我相信zipaline在实验中仍然有效。或者,您可以使用第三方应用程序,可以像这样签署64位应用程序

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

此插件使用64位架构对应用程序进行签名。

 类似资料:
  • 在过去,我在核心或公共项目中提供测试帮助程序,并使用以下方法使这些类可用于其他子项目方面取得了巨大的成功: 共同项目A 从属项目B 然而,我在两个不共享Gradle多项目层次结构的项目之间有相同的需求。澄清一下,这些是完全分开的项目。它们位于不同的存储库中,使用不同的构建脚本。它们不是父项目中的子模块。 为了进一步解决复杂的问题,我正在使用Java Library插件和Maven插件在本地安装库。

  • 问题内容: 是否有可能编译项目在 32位 与和一对 64位 系统?可能是,但是我该怎么做呢? 当我以“无知”的方式尝试它时,没有设置任何参数/ flags / etc,只是设置在其中查找链接的库似乎忽略了它,而只查看名为 lib64的 子目录。 问题答案:

  • 问题内容: 我正在开始使用Google App Engine。我想像Twitter一样进行AJAX聊天。 服务器JSON对响应进行编码, 结果:您好! 还行吧。但是替换RPCHandler 结果:错误。服务器不可访问(获取) 如何对实体进行JSON编码? 问题答案: 在App Engine Python中,您可以使用此脚本将db.Models编码为JSON。您可能必须自定义某些部分,例如DateT

  • 已故的伟大的 Edsger Dijkstra 曾经充分解释过:计算机科学不是一门实验科学[ExpCS],并且不依赖于电子计算机。当他提出这个观点时,他指的是19世纪60年代。[Knife] ...危害已经出现:主题现在已经变成了“计算机科学” - 这实际上,像是把外科手术引用为“手术刀科学” - 这在人们心中深深植入了这样一个概念:计算机科学是关于机器和它们的外围设备的。 编程不应该是一门实验科学

  • 问题内容: 我正在和朋友一起在网上商店工作。他使用PHP为我设置了一个Cookie,并在购物车中添加了一定数量的产品。cookie称为“购物车”,带有产品数量的变量称为“ items”。 而且,我必须阅读cookie并使用javascript获取“购物车”的值并将其打印在HTML文档中,但是我不知道如何使用它,请您能帮我吗?我以前从未使用过Cookie或JSON,但我认为应该使用JSON完成,您能

  • 本文向大家介绍如何使用nodejs对base64进行编解码?相关面试题,主要包含被问及如何使用nodejs对base64进行编解码?时的应答技巧和注意事项,需要的朋友参考一下 轮子, https://www.npmjs.com/package/js-base64