【问题标题】:How to know which Android API an APK was built against如何知道 APK 是针对哪个 Android API 构建的
【发布时间】:2015-05-20 08:45:23
【问题描述】:

当使用给定的 API 级别生成 APK 时,有没有办法知道使用哪个 API 级别来编译只有 APK 文件?

minSdkVersion 不一定与编译项目所用的 API 级别相匹配,它只是一个说明,如果 minSdkVersion > 当前版本,Android 安装程序会阻止应用程序

【问题讨论】:

    标签: android build


    【解决方案1】:

    这是获取我的应用程序的targetSdkVersion 和versionCode 的另一种方式:

    try {
                PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                int versionCode = packageInfo.versionCode;
                int targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;
    
            }
            catch (PackageManager.NameNotFoundException e) {
                Log.e(TAG, e.getMessage());
            }
    

    使用Android Studio,将值定义到我的build.gradle 文件中

       defaultConfig {
            applicationId "com.tuna.hello.androidstudioapplication"
            minSdkVersion 9
            targetSdkVersion 22
            versionCode 12
            versionName "1.0"
        }
    

    【讨论】:

    • 通过 packageInfo,您可以获得所有 defaultConfig(如果使用 gradle)或清单 信息,但不是所需信息的 compileSdkVersion。
    【解决方案2】:
    BuildConfig.VERSION_CODE;
    

    和

    getPackageManager().getPackageInfo(...).
    

    会给我们:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
              android:versionCode="1"
              android:versionName="...">
    

    versionCode,在本例中为 1。

    用于编译.apk的API级别我找不到在运行时查阅它的方法,但如果你使用gradle你可以检查它:

    android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    ...
    }
    

    如果您使用的是 .iml,使用 IntelliJ 项目配置 GUI 进行配置:

    <component name="NewModuleRootManager" inherit-compiler-output="true">
        ...
        <orderEntry type="inheritedJdk" />
        ...
    </component>
    

    project.properties:

    # This file is automatically generated by IntelliJ IDEA
    # Project target.
    target=Google Inc.:Google APIs:22
    

    但由于 build.gradle、project.iml 和 project.properties 没有附带 .apk 我想不出一种在运行时获取 compileSdkVersion 或解压缩 .apk 的方法

    【讨论】:

    • 这将只获取运行此代码的包(应用)的版本代码
    【解决方案3】:

    你能得到的一切都应该在你从 PackageManager 得到的 ApplicationInfo 上,所以你应该得到 ApplicationInfo,然后看看你能从中得到什么,即:

    getPackageManager().getPackageInfo(...).targetSdkVersion
    

    参考:http://developer.android.com/reference/android/content/pm/ApplicationInfo.html

    检查参考的“字段”部分。查看“sourceDir”字段。

    我希望这对你有任何帮助,请投票赞成/反对任何帮助/误导你的事情。

    最好的问候。

    【讨论】:

    • 这并没有回答他的问题 .targetSdkVersion,如上所述,这只是 Android 安装程序在 PlayStore 中阻止某些手机的说明。 API 级别由 .versionCode 提供。检查我的答案。
    • @GuilhE 您的答案会返回您在清单中设置的任何代码,这些代码是任意的且与 SDK 无关。在这里查看:developer.android.com/reference/android/content/pm/…
    • 没错,我错了,getPackageManager()会给出我们在manifest中使用的apk信息。检查我更新的答案。
    【解决方案4】:

    试试这个:

    android.os.Build.VERSION.SDK_INT
    

    【讨论】:

    • 为您提供手机 SDK 版本,而不是 .apk
    • SDK 是 Android API 级别。我相信这就是他所要求的。
    • 我想他问的是哪个 API 级别用于编译 .apk 而不是手机使用的 API 级别。可能我理解错了
    • 你说得对,这是手机运行的api级别
    【解决方案5】:

    如何知道您的应用正在运行哪个 Android API:

    int myAPI = Build.VERSION.SDK_INT;
    

    如何知道 APK 的 versionCode 已构建:

    String versionCode = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0).versionName;
    

    注意:ctx 是应用上下文。

    但是更具体地说,将您的APK文件的扩展名更改为.zip,然后将Manifest.xml解压缩,然后您可以看到versionCode、minSdkVersion、targetSdkVersion等...

    【讨论】:

    • Build.VERSION.SDK_INT;将为手机提供当前 API 级别
    • 是的,我知道,我认为这个问题的最佳解决方案是直接打开应用程序的 AndroidManifest.xml。 ;)
    • 你知道是否可以在运行时检查它?顺便说一句,使用 gradle 您可以设置 compileSdkVersion 但不能在清单中设置。所以最好的方法是打开 build.gradle 或 project.iml
    • 我认为这是在运行时:stackoverflow.com/questions/30337443/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多