在 Android 项目中使用 kotlin 后 APK 文件大小增加

APK file size increased after using kotlin in Android Project

我在 android studio 中创建了一个 Android 应用程序,我使用的编程语言是 Kotlin
现在我的应用程序完成了,我想构建我的应用程序,但是在构建应用程序之后,我的 APK 文件大小变为 35mb !!!
我的 drawable 文件夹 大小是 2mb 我没有任何大文件,但为什么我的应用程序大小是 35mb ?!

为了生成测试 apk 版本,我使用 Build -> Generate Signed Build/APK from android studio 菜单。

但是当我使用 java 作为语言时,这个大小是 7mb!!!

我使用了这些依赖项:

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "androidx.appcompat:appcompat:$androidx_version"
    implementation "androidx.core:core-ktx:$androidx_version"
    implementation "androidx.constraintlayout:constraintlayout:$constrant_layout_version"
    implementation "androidx.recyclerview:recyclerview:$material_version"
    implementation "com.google.android.material:material:$material_version"
    implementation "androidx.legacy:legacy-support-v4:$material_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation "junit:junit:$junit_version"
    androidTestImplementation "androidx.test.ext:junit:$androidx_junit_version"
    androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
    //Anko lib
    implementation "org.jetbrains.anko:anko-commons:$anko_version"
    //Rx
    implementation "io.reactivex.rxjava2:rxandroid:$rxandroid_version"
    implementation "io.reactivex.rxjava2:rxjava:$rxjava_version"
    //OkHttp
    implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
    implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
    //Retrofit
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
    implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'
    //Gson
    implementation "com.google.code.gson:gson:$gson_version"
    //Image
    implementation "com.github.bumptech.glide:glide:$glide_version"
    annotationProcessor "com.github.bumptech.glide:compiler:$glide_version"
    //Calligraphy
    implementation "io.github.inflationx:calligraphy3:$calligraphy_version"
    implementation "io.github.inflationx:viewpump:$viewpump_version"
    //Preferences lib
    implementation "com.github.MrNouri:GoodPrefs:$nourilib_versions"
    //Dynamic ui sizes
    implementation "com.github.MrNouri:DynamicSizes:$nourilib_versions"
    //Support MultiDex
    implementation "androidx.multidex:multidex:$multidex_version"
    //Animations
    implementation "com.daimajia.easing:library:$yoyoanimation_version"
    implementation "com.daimajia.androidanimations:library:$nineoldandroid_version"
    //Map
    implementation "ir.map.sdk:sdk_map:$mapir"
    implementation "com.mapbox.mapboxsdk:mapbox-sdk-services:$mapbox_service"
    implementation "com.mapbox.mapboxsdk:mapbox-sdk-geojson:$mapbox_service"
    implementation "com.mapbox.mapboxsdk:mapbox-android-telemetry:$mapbox_telemetry"
    implementation "com.mapbox.mapboxsdk:mapbox-android-gestures:$mapbox_gestures"
    //Permission
    implementation "ru.superjob:kotlin-permissions:$permission_version"
    //Expandable recyclerview
    implementation "com.thoughtbot:expandablerecyclerview:$expandable_recycler_version"
    //Firebase messaging
    implementation "com.google.firebase:firebase-messaging:$firebase_messaging_version"
    //Firebase crashlytics
    implementation "com.google.firebase:firebase-analytics:$firebase_analytics_version"
    implementation "com.crashlytics.sdk.android:crashlytics:$firebase_crashlytics_version"
}

我该如何解决?

在 android 工作室中拖放 apk 文件。你会看到apk的分析器。并查看所有库、图像和 java 文件等的个人大小

单击“构建”>“分析 APK”> Select 您的 APK。

您可以查看是哪个文件使您的应用过大。


更新 1:

在您的 build.gradle(Module:app) 文件中进行这些更改。它几乎减少了 APK 大小 (40-50)%。

    android {
    // Other settings

      buildTypes {
          release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
          }
      }
    }

您可以通过分析生成的 APK 来修复这些错误。

在 Android Studio -> 构建 => 分析 APK。

Select 从文件系统生成的 APK 并查看哪些资源使您的 APK 膨胀。

如果您还有任何疑问,请告诉我。

正如@Soham 建议分析您的 APK 此外,您可以缩小代码、资源、应用混淆并优化代码。

这里是link官方文档Here

如果您的项目 minSdkVersion 是 18 或更高版本,那么您可以通过将 PNG、JPEG 和 BMP 转换为 WebP 格式来压缩它们。

第一步是,按住 Control 键并单击要转换的可绘制对象,然后 select 转换为 WebP。然后,Select当编码结果大于原始图像时跳过图像并单击确定转换图像。

删除未使用的资源

如果您在应用的 build.gradle 文件中启用 shrinkResources

Gradle 可以代表您自动删除资源。

android {
    // Other settings

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

按照这两点来减小您的 apk 的大小。如果需要帮助,请分享您的 Analyze APK 屏幕截图。

希望对您有所帮助..!

您使用大量库的第一件事可能是应用程序体积较大的原因。 几乎没有什么可以减少应用程序大小

  1. 使用你自己的组件而不是外部库 例如,您正在使用 Expendable recyclerview 库 implementation"com.thoughtbot:expandablerecyclerview:$expandable_recycler_version"

  2. 使用 Svg drawable 而不是 png 等。因为您可以使用所有屏幕尺寸的相同 svg 文件。

  3. 删除未使用的资源

  4. 最后,如果您尝试了所有这些,请使用 ABI。虽然这样你可以为不同的设备创建多重构建。 将此粘贴到 build.gradle 文件

    android 块中
    splits {
     abi {
        enable true
        reset()
        include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a', 'armeabi', 'mips',
       'mips64'
        universalApk true
       }
      }
      project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 
      3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
    
      android.applicationVariants.all { variant ->
    
      variant.outputs.each { output -> output.versionCodeOverride =
      project.ext.versionCodes.get(
        output.getFilter(com.android.build.OutputFile.ABI), 0
        ) * 1000000 + android.defaultConfig.versionCode
      }
     }