何时链接appcompat和约束布局支持库,何时不链接

时间:2017-04-17 12:10:37

标签: android android-ndk

我将我的Android NDK项目从Ant / ndk-build迁移到Gradle / CMake。以前,我从2012年夏天开始使用Android SDK和NDK,现在我已经更新到最新版本。我使用命令行构建,而不是从Android Studio构建。

作为迁移的基础,我已经看过HelloJNI NDK样本。它的build.gradle包含这两个依赖项:

dependencies {
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
}

我已经对Android支持库进行了一些研究,我认为我的项目不需要它,因为我的目标是Android 9而我的应用程序并不需要任何新版本功能,所以我认为我不需要链接支持库。

但是,HelloJNI示例让我感到困惑,因为它包含v7 appcompat库,但同时它的build.gradle表示项目至少需要v23:

defaultConfig {
    applicationId 'com.example.hellojni'
    minSdkVersion 23
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments '-DANDROID_TOOLCHAIN=clang'
        }
    }
}

在这种情况下,当项目本身需要v23时,链接appcompat v7并不是多余的吗?这对我没有意义,但也许我在这里没有正确理解一切,所以这就是我想问的原因。

我不确定的第二件事是链接约束布局。 HelloJNI也这样做,但我不知道为什么。根据我的研究,看起来约束布局允许应用程序做一些高级布局技巧但当然HelloJNI没有这样做......那么为什么它仍然与约束布局相关联?

总而言之,据我所知,我不需要链接appcompat v7,因为我的应用针对的是v9并且没有使用任何新功能,我也不需要链接反对约束布局,因为我的应用程序也不需要约束布局库提供的功能。这里唯一令我困惑的是,当我认为对于这样一个原始示例不应该是必需的时候,HelloJNI示例链接两个库。那也许只是一个惯例问题而不是必要性?

感谢任何能够阐明这一点的人。

1 个答案:

答案 0 :(得分:2)

  

在这种情况下,当项目本身需要v23时,链接appcompat v7并不是多余的吗?

如果minSdkVersion为23,则不需要appcompat-v7,但您不需要使用其中的任何内容(例如AppCompatActivityTheme.AppCompat)。

Google希望每个人都使用appcompat-v7,但它为您的应用增加了大约1MB的膨胀,几乎没有增值,特别是minSdkVersion为23。

  

我不确定的第二件事是链接约束布局。 HelloJNI也这样做,但我不知道为什么。

Google已将其许多模板和示例转换为使用ConstraintLayout

  

从我的研究看起来,约束布局允许应用程序做一些高级布局技巧但当然HelloJNI不这样做......那么为什么它仍然会链接到约束布局?

因为他们在a layout resource中使用ConstraintLayout ...它本身未使用。如果我不得不猜测,他们将他们的JNI代码复制到由添加了布局资源的模板创建的新项目中,依赖于constraint工件,依赖appcompat-v7等等。

  

我不需要链接appcompat v7,因为我的应用程序定位到v9

您的应用的targetSdkVersion为25,而不是9。