如何制作同时支持32位和64位架构的Android应用程序?

38

我刚刚收到并阅读了来自Google Play的新闻通讯, 其中提到从明年开始,商店“将要求具有本地库的新应用程序和应用程序更新除其32位版本外还提供64位版本”。

对于那些还没有阅读过的人,它声明:

2019年的64位支持要求
Android 5.0引入了对64位架构的平台支持。今天,超过40%的上线Android设备支持64位,同时仍保持32位兼容性。对于使用本机库的应用程序,64位代码通常具有更好的性能,具有额外的寄存器和新的指令。
为了预期支持仅支持64位代码的未来Android设备,Play Console将要求提供本地库的新应用程序和应用程序更新除其32位版本外还提供64位版本。这可以在单个APK内或作为发布的多个APK之一。
我们不会删除32位支持。Google Play将继续支持32位应用程序和设备。不包括本地代码的应用程序不受影响。
此更改将于2019年8月生效。我们今天提供先进通知,以便给尚未支持64位的开发人员充分的时间来计划过渡。敬请关注我们未来的帖子,我们将深入研究Android上64位本地库的性能优势,并查看NDK的CPU和架构指南获取更多信息。
当适用时,我们需要进行哪些实际更改才能完全遵守这项新要求?

5
如果您拥有自己的 NDK 代码,它将需要支持 64 位版本的 ABIs。如果您没有自己的 NDK 代码,但是您正在使用具有自己代码的库,则这些库将需要提供支持 64 位 CPU 架构的库版本。 - CommonsWare
感谢您的回答,CommonsWare!根据您的回答和我所读到的内容,似乎并不那么复杂。只是让我再问您一件事:如果开发人员既不拥有也不使用NDK代码,这是否意味着常规应用程序已经准备好同时支持两者?此外,如果您想将文本作为答案提供,我很乐意接受。 - JorgeAmVF
2
如果开发者既不拥有也不使用NDK代码,那么这是否意味着常规应用程序已经准备好支持64位架构?由于我不确定您所说的“既不拥有也不使用”的含义,因此无法回答。换句话说:如果您检查您的APK文件(例如,在Android Studio中分析APK),并且您没有找到包含“.so”文件的“lib/”目录,则无需对即将推出的要求做任何处理。如果您发现“.so”文件,并且在名单中没有看到64位架构,则需要找到这些“.so”文件的源并进行更新。 - CommonsWare
抱歉我之前提问的方式有些不妥(那是我今天一起床就做的第一件事)。无论如何,你已经几乎解决了我关于这个主题的所有疑惑,非常感谢你的关注和支持。 - JorgeAmVF
我如何知道哪个依赖项含有那个.so文件@CommonsWare - kvadityaaz
1
@kvadityaaz:希望您能通过.so文件名来识别它。也许很明显,或者通过搜索可能找到一个匹配项。否则,您可以将dependencies复制到一个废弃项目中,并确认.so文件出现在该废弃项目的应用程序中,然后逐个注释掉依赖项,直到找到哪个依赖项引入了.so - CommonsWare
12个回答

1
在我的情况下,我使用的是一个库(ESRI ArcGIS for Android),它使用了OpenGL C库。与似乎可以解决其他人问题的ndk.abiFilters...字符串不同,我必须使用以下内容:ndk { abiFilters "armeabi-v7a", "arm64-v8a" }

1
首先打开build.gradle模块应用程序并按顺序添加以下行,以便删除.so文件并添加64位库。从apk的libs中删除所有.so文件。
android {    
    compileSdkVersion 29    
    defaultConfig {    
        -----    
        -----    
        ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'    
        ndk {    
            abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'    
        }    
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"    
    }    
packagingOptions{     
        packagingOptions {    
            exclude 'lib/armeabi-v7a/libvudroid.so'    
            exclude 'lib/x86/libvudroid.so'    
            exclude 'lib/arm64-v8a/libvudroid.so'    
        }    
    }`

我的应用在我的64位设备上运行得很好,但是当我提取它时,我的应用没有libs文件夹...这是什么意思? - Anti Atlas Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接