Что такое libclasifier_jni.so в apk для Android?

Мой apk для Android составляет около 22 МБ, даже если я не использовал ничего тяжелого. Проанализировав файл apk, я обнаружил каталог «lib», который содержит имя файла «libclasifier_jni.so» для разных архитектур, я не уверен, откуда он. ниже скриншот для sameЧто такое libclasifier_jni.so в apk для Android?

Не могли бы вы сказать мне, что мне здесь не хватает?

Ниже build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.pixyfisocial"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 24
        versionName '5.0.0'
        multiDexEnabled true
        testApplicationId "com.pixyfisocial.screens.presenters"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
    }
    productFlavors {
    }
}

configurations {
    all {
        exclude module: 'json'
        exclude module: 'commons-logging'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    testCompile 'org.powermock:powermock-api-mockito2:1.7.4'
    // https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4
    testCompile 'org.powermock:powermock-module-junit4:1.7.4'
    // https://mvnrepository.com/artifact/org.mockito/mockito-core
    testCompile 'org.mockito:mockito-core:2.8.9'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    compile 'com.android.support:appcompat-v7:27.1.1'
    compile 'com.android.support:recyclerview-v7:27.1.1'
    compile 'com.android.support:cardview-v7:27.1.1'
    compile 'com.android.support:design:27.1.1'
    implementation 'com.facebook.android:facebook-android-sdk:4.33.0'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.github.clans:fab:1.6.2'
    compile 'com.theartofdev.edmodo:android-image-cropper:2.7.+'
    implementation 'com.google.firebase:firebase-core:16.0.0'
    implementation 'com.google.firebase:firebase-messaging:17.1.0'
    compile 'com.facebook.android:account-kit-sdk:4.+'
    compile 'com.android.support:support-v4:27.1.1'
    compile 'com.google.code.gson:gson:2.8.2'
    compile 'com.google.firebase:firebase-appindexing:15.0.1'
    compile 'com.google.firebase:firebase-auth:16.0.1'
    compile 'com.google.android.gms:play-services-auth:15.0.1'
    compile 'com.google.firebase:firebase-invites:16.0.0'
    compile 'com.android.support:customtabs:27.1.1'
    compile 'com.google.firebase:firebase-ml-vision:16.0.0'
    compile 'com.google.firebase:firebase-ml-vision-image-label-model:15.0.0'
    compile 'com.github.greenfrvr:hashtag-view:1.3.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.1'
    implementation project(':pixyfi-data')
    implementation project(':pixyfi-services')
    implementation project(':utility')
}
apply plugin: 'com.google.gms.google-services'
10
0
529
3

Ответы 3

Это собственная библиотека, скомпилированная и прикрепленная к вашему apk. проверьте свой сценарий cmake или файлы ndk Android.mk. если вы не уверены, откуда он исходит, вы также можете исключить его из своего apk для разных архитектур. В вашем градиенте внутри напишите эти строки

android{
 packagingOptions {

        exclude 'lib/arm64-v8a/libclasifier_jni.so'
        exclude 'lib/armeabi/libclasifier_jni.so'
        exclude 'lib/armeabi-v7a/libclasifier_jni.so'
        exclude 'lib/mips/libclasifier_jni.so'
        exclude 'lib/mips64/libclasifier_jni.so'
        exclude 'lib/x86/libclasifier_jni.so'
        exclude 'lib/x86_64/libclasifier_jni.so'

    }
}

Эта конкретная библиотека исходит из этой зависимости:

    compile 'com.google.firebase:firebase-ml-vision-image-label-model:15.0.0'

Можно зайти в артефакт ссылка, скачать aar и разархивировать. Вы увидите содержимое, подобное изображению ниже:

What is libclasifier_jni.so in android's apk?

Вы использовали библиотеку изображений Firebase Vision, содержащую эти файлы SO.

compile 'com.google.firebase:firebase-ml-vision-image-label-model:15.0.0'

My android apk is around 22MB

Вы не должны исключать эти файлы ndk из apk через любую конфигурацию gradle, если вы используете библиотеку Fragment Vision в своем приложении.

Какое решение?

1. Создайте несколько APK.

Although you should build a single APK to support all your target devices whenever possible, that might result in a very large APK due to files needed to support multiple screen densities or Application Binary Interfaces (ABIs). One way to reduce the size of your APK is to create multiple APKs that contain files for specific screen densities or ABIs.

Play Store поддерживает разделение apk, в котором вы можете сделать несколько apk для несколько процессоров ABI. В вашем приложении есть 4 SO файла. Каждый из них имеет размер 3-4 МБ. Поэтому, если вы используете разделенный APK, ненужные 12 МБ будут уменьшены в каждом APK.

2. Включите только armeabi-v7a и arm64-v8a.

Позвольте мне рассказать вам полезную информацию о процентной статике ABI. Если вас не интересуют все ABI, вы можете включить два ndk ABI. Ранее я опубликовал подробную статистику Ответить здесь, которая поможет вам лучше понять процентное соотношение ABI.

  • armeabi-v7a (обязательно - самая популярная архитектура в настоящее время)
  • arm64-v8a (требуется - более новая версия armeabi-v7a)
  • x86 (необязательно, очень ограниченное количество устройств, например Asus Zenfone 2, Genymotion / эмулятор Android)
  • x86_64 (необязательно, очень ограниченное количество устройств, например Asus Zenfone 2, Genymotion / эмулятор Android)

Таким образом, если вы включите архитектуры armeabi-v7a и arm64-v8a, вы охватите 99% устройств Android.

Таким образом вы можете включить в свой APK только эти два ABI.

buildTypes {
    release {
        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a"
        }
    }

image

Этот блог поможет вам настроить градиент для нескольких APK и фильтров ABI и лучше понять управление ABI. Также я должен сказать, что у Страница Google Android есть идеальная информация, которая вам нужна.

добавление x86 всегда полезно, чтобы иметь возможность тестировать с эмулятором ... по крайней мере, для отладочных сборок - иначе он просто раздувает пакет; есть даже несколько аппаратных устройств Android x86 (предлагается использовать App Bundle - чтобы поддерживать, но не раздувать).

Martin Zeitler 30.10.2018 03:02

Вот почему я предложил сначала создать несколько apk.

Khemraj Sharma 30.10.2018 06:11

Другие вопросы по теме