【问题标题】:APK not compatible with newest Android buildAPK 与最新的 Android 版本不兼容
【发布时间】:2015-09-19 07:35:48
【问题描述】:

我正在开发一个目前在 Play 商店上发布的应用。使用装有 5.1.1 版本的 Android 设备时,Play 商店显示“您的设备与此版本不兼容”,我正在尝试确定具体原因以及如何解决它。

现有应用的 Android.Manifest 文件中包含以下内容:

  <uses-sdk minSdkVersion="13" targetSdkVersion="21"/>

我认为可能是导致问题的“targetSDKVersion”。我没有最初发布的 APK,但我想我可以通过生成具有相同 uses-sdk 清单项的新应用来检验我的假设。

我使用最新的 Android Studio 和相同的 uses-sdk 值创建了一个新应用并发布了它,奇怪的是它在我的 5.1.1 设备上可用。

我决定进一步调查,并在我的桌面上pulled both APKs down,然后使用apktool 提取每个内容以查看是否有任何突出的内容。

我发现非工作 APK 在提取的清单中有这个:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.redphx.deviceid" platformBuildVersionCode="21" platformBuildVersionName="5.0.1-1624448">

工作 APK 有以下内容

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.opennetcf.ctacke.androidsample" platformBuildVersionCode="23" platformBuildVersionName="6.0-2166767">

现在我的假设是platformBuildVersionCode 一定是罪魁祸首。

所以我的问题是:

  1. 我的假设是否正确,这就是为什么一个 APK 不适用于 5.1.1?
  2. 我假设 APK 编译器设置了 platformBuildVersionCode 属性。我在工作应用程序中专门将targetSdkVersion 设置为21,我在提取的yml 中看到了该值,但platformBuildVersionCode 仍然显示23。如果不是uses-sdk 信息,这些信息来自哪里?李>
  3. 除了重建新的 APK 并重新发布之外,是否有解决方法?

我认为重新发布是可能的途径,但我希望避免将来再次出现此问题,因此我真的很想了解#1 和 #2 的答案。

更新

工作 APK 的合并清单与应用程序本身的清单相同,因此根本不引用 23。

<uses-sdk 
    minSdkVersion="13" 
    targetSdkVersion="21"/>

在工作系统上,build.gradle 包含以下内容:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.opennetcf.ctacke.androidsample"
        minSdkVersion 13
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnable false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro
        }
    }
}

dependencies {
    compile filetree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
}

所以我认为这就是该信息的来源,但它如何到达 APK 仍然不是很清楚。

我没有非工作 APK,因为它是由应用发布团队在我加入项目之前构建的,我不知道他们是否保留任何这些中间输出。我正在调查。

编辑 2

从两个 APK 中提取的 yml(显示 uses-sdk 信息)如下。看起来非工作最低版本 (5) 明显低于工作 (13)。

工作:

version: 2.0.1
apkFileName: oncf.apk
isFrameworkApk: false
usesFramework:
  ids:
  - 1
sdkInfo:
  minSdkVersion: '13'
  targetSdkVersion: '21'
packageInfo:
  forced-package-id: '127'
versionInfo:
  versionCode: '1'
  versionName: '1.0'
compressionType: false
sharedLibrary: false

不工作:

version: 2.0.1
apkFileName: ytb.apk
isFrameworkApk: false
usesFramework:
  ids:
  - 1
sdkInfo:
  minSdkVersion: '5'
  targetSdkVersion: '21'
packageInfo:
  forced-package-id: '127'
versionInfo:
  versionCode: '4'
  versionName: 1.1.2
compressionType: false
sharedLibrary: false

【问题讨论】:

  • "现有应用的 Android.Manifest 文件中包含以下内容" -- build.gradle 文件中有什么内容? app/build/intermediates/manifests/ 目录中的合并清单中有什么内容?
  • @CommonsWare:更新了问题以包含该信息
  • 您提取的非工作 APK 清单中的 android:minSdkVersion 是什么?我假设您在问题中显示的那一行来自输入清单(即项目本身中的那一行)。
  • 是的,该行来自输入。提取的 yml 显示非工作最小值为 5,而工作最小值为 13。
  • 我不知道platformBuildVersionCode 是什么或它来自哪里。您可以尝试从命令行 (adb install path/to/your.apk) 安装非工作 APK 并查看错误消息,因为这可能是我们误解了 Play 商店告诉您的内容。

标签: android google-play apk


【解决方案1】:

除非您有非常具体的原因,否则您的targetSdkVersion 需要与您的compileSdkVersion 匹配

另外,您需要增加 versionCode(我可以看到这是在已发布的 apk 中完成的,但在您刚刚提供给我们的其余 build.gradle 文件中并未完成)

如果您的原始清单文件仍包含 minSdkVersiontargetSdkVersion 属性,您可以删除它们。这两个属性现在将来自您的 build.gradle 文件以创建中间清单。这是 Android 的新方式。

另外,您的proguard-rules.pro 引用右侧缺少单引号。我想这一定是某种剪切和粘贴错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2016-04-13
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多