Исключительно умным способом исключите JNI-библиотеки, основанные на вкусе - PullRequest
0 голосов
/ 14 января 2019

У меня есть проект Android, который использует некоторые родные библиотеки довольно большого размера. У меня есть несколько вариантов в этом проекте, и некоторые из них не используют эти библиотеки, поэтому я хотел бы исключить их из APK.

Я знаю несколько способов добиться этого, но я хотел бы использовать хороший код в файле build.gradle, чтобы уменьшить возможные ошибки и изучить groovy.

Я должен упомянуть, что есть логическое значение buildConfigField (в этом примере называемое DO_IT). Если DO_IT равно false, библиотеки JNI должны быть исключены.

Вот как я это делаю сейчас:

defaultConfig {
     buildConfigField "boolean", "DO_IT", "true"
}

productFlavors {
    flavor1 {
        // for this flavor JNI libs will be included
    }
    flavor2 {
        // for this flavor JNI libs will NOT be included
        buildConfigField "boolean", "DO_IT", "false"
        ndk {
            abiFilters ''
        }
    }
}

Примечания:

1 - Учтите, что у меня много вкусов с множеством свойств, и я не хочу копировать блок

ndk {
   abiFilters ''
}

но мне не удается поместить этот блок в метод.

2 - Решение pefect просто исключает libs на основе DO_IT buildConfigField в процедуре вне блоков ароматов EG в defaultConfig.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Android-soexcluder должен быть путь.

Шаги, как показано ниже:

  1. Изменить build.gradle, чтобы добавить зависимости.

    buildscript {
       repositories {
          //...
       }
    
       dependencies {
          classpath 'com.jween.gradle:android-soexcluder:1.1'
       }
    }
    
    apply plugin: 'com.android.application'
    apply plugin: 'android-soexcluder'
    
  2. Исключите .so из вашего аромата сборки

    soexcluder {
    
        // Remove all so files according to the flavor1
        flavor1 {
            exclude "lib/armeabi-v7a/foo.so", "lib/arm64-v8a/bar.so"
        }
    }
    

Другим вариантом является добавление параметра gradle для packagingOptions: Установка опции упаковки doNotStrip для определенного buildType

0 голосов
/ 25 января 2019

Я использую этот шаблон.

Проект build.config

buildscript {
    ext.DO_IT = true;
}

Модуль (приложение) build.config

productFlavors {
    flavor2 {
        externalNativeBuild {
            cmake {
                if (DO_IT) {
                    targets "someTarget"
                }
            }
        }
    }
}

NB.1 ext упоминается в разделе Дополнительные свойства , ExtraPropertiesExtension из Gradle.

NB.2. В проекте build.config необходимо управлять настройками, такими как библиотеки, так как Android Studio / Gradle пытается прочитать все настройки во всех разновидностях один раз и вызывает конфликты или другие проблемы.

NB.3. Обратите внимание, что Android Studio не удаляет файлы библиотеки (.so), которые уже отправлены на устройство. Это сочетает в себе результаты испытаний. Проверьте файлы в / data / app / (package) / lib / (cpu arch) / на устройстве и (project) / app / build / промежуточные / cmake / (flavor) / obj / (cpu arch) / на вашем компьютере. Удалите их вручную, особенно на устройстве, если вы считаете, что результат неправильный.
Удаление данных из приложения / хранилища не приведет к очистке библиотек. Удаление удалит их, поэтому, думаю, ручное удаление файлов будет проще.

NB.4. Меню синхронизации в Обозревателе файлов устройств в Android Studio не синхронизируется должным образом для каталогов lib или (cpu arch). Чтобы увидеть правильные результаты, выберите / data или / data / app и синхронизируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...