安卓市场多APK... 不同的CPU架构怎么样?

18

我认为现在可以使用不同的NDK编译库来上传我的应用程序,以针对不同的CPU架构,但似乎这是不可能的。

有人知道如何上传到Android市场,每个APK都包含专门为不同CPU架构编译的库吗?

我还没有尝试过这种方法,这看起来很浪费空间,但我们能否将多个编译后的库放在一个APK中?

更新:
显然,当用户安装apk时,不支持的库将不会被安装到设备上。这很好,但用户仍然需要下载整个apk,浪费带宽。


你是否曾经找到了一个优雅的解决方案?我也遇到了这个问题,我的本地库太大了,无法为每个架构复制,所以我更喜欢有单独的APK。 - Dean Wild
5个回答

12

好消息,Google Play 终于支持了多 APK 定向

“我们已经为使用多 APK 支持的应用程序添加了新功能。现在,您可以将每个 APK 定向到特定的本地平台。”


9

如果你的应用程序没有大量代码,我建议只放置android支持的三种架构(armv5、armv7和x86)的本地代码。虽然这将使你的apk文件中的代码部分大小增加三倍,但3*(一个小数字)仍然是一个小数字。你可以通过修改jni/Application.mk文件或创建该文件来实现此功能,并添加以下行:

APP_ABI := armeabi armeabi-v7a x86

这将编译成三个版本。

注意,当前的ndk(r6)存在一个错误,即尝试将x86代码链接到arm代码上。如果你获得AOSP项目(source.android.com),那么可以解决这个问题。或者你可以等待谷歌发布r6b,它可能会修复这个问题。否则,如果你不想这样做,现在可以省略该行中的x86部分,在应用程序中不包含x86代码,并在新的ndk推出时推出更新。我不知道有多少流行设备使用了x86指令。


谢谢您的回复!您的意思是我可以将多个CPU架构编译成一个库吗?还是我完全没有理解呢 :P - Jona
有点类似,你可以将多个CPU架构编译到一个APK中。它的做法是为每个架构编译一个库文件,然后在运行时运行相应的库文件。这就是为什么你的APK会变得更大。 - Leif Andersen
啊,好的,所以基本上我会在我的libs文件夹下有几个.so文件。我原以为实际的.so库会编译包含所有架构,但那样没有意义 :P...是的,正如你所说,我的库有点大,大约2.5MB :( 这对很多用户来说可能不太好...不知道通过使用Android市场的多个APK是否有一些巧妙的解决方案..? - Jona
啊,是的,7.5MB对于一个apk来说可能有点大了。但我见过更大的生产apk,曾经愤怒的小鸟apk不是达到了14 MB吗?尽管较旧的手机肯定无法打开那么大的apk文件。 - Leif Andersen
好的,我仍在努力弄清楚如何放置几个APK - 每个架构一个。这是因为我的本地库非常庞大 - 每个架构都有5-8 MB。Google Play会窥探内部lib /子文件夹以查看它具有哪些本地库吗? - WindRider

1
请参阅 Android 文档中的 多 APK 支持。其中详细说明了发布同一产品/应用程序的多个 APK 的一些具体细节。
至于 NDK 的具体细节,正如已经提到的,您可以在 Android.mk 的 APP_ABI 值中利用多个平台/ABI。

是的,我知道多个APK支持。关于NDK,我的库太大了,无法在一个APK中包含不同的构建... - Jona

0
在新的 Play Store 开发者控制台中,如果您想要添加多个 APK,则必须使用相同的包名称和相同的密钥库密钥,但版本代码不同。您发布应用程序后,首先上传 Apk(例如 mobile_release)并推出生产版本,在您上传另一个 apk 之后,您应该选择保留选项以保留先前 APK 和当前 APK。
  android {

        // To create different apk per abi
        splits {
            abi {
                enable true
                reset()
                include 'armeabi', 'armeabi-v7a', 'x86'
                universalApk true
            }
        }
    }

    import com.android.build.OutputFile

    // Map for the version code
    ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'x86': 3]
    android.applicationVariants.all { variant ->

        // assign different version code for each output
        variant.outputs.each { output ->
            int abiVersionCode = project.ext.versionCodes.get(output.getFilter(OutputFile.ABI)) ?: 0
            output.versionCodeOverride = (abiVersionCode * 1000) + android.defaultConfig.versionCode
        }
    }

-1
你可以在每个单独编译(并重新打包)的应用程序的AndroidManifest.xml中声明supports-gl-texture。这将提供市场过滤,因此单个用户只能看到您的应用程序的一个版本。

这可能很有前途...例如,筛选armv5的设备?我想分离armv5和armv7以及新的x86设备...这显然是一种hackie方式,但有潜力可行...我简直无法相信谷歌没有提供这种类型的筛选器!:( - Jona

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