Как сказать Gradle не исключать .so файлы в моей зависимости .jar? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть зависимость .jar, которая поставляется с библиотекой .so.

library.jar
       |
       -----com/company
              |
              -----.class files
       -----libs
              |
              -----libX.so

Jar использует эту библиотеку .so для внутреннего использования, и я создаю приложение для Android, котороеиспользует jar.

Все хорошо, пока я не собрал apk: исследуя его с помощью 7zip, я обнаружил, что файлы .so исчезли, что приводило к всевозможным ошибкам при использовании приложения.

Так есть ли способ сказать Gradle не исключать файлы .so при сборке?Я не хочу копировать их вручную в папку в моем Android-проекте, поскольку я не использую их напрямую, но библиотека .jar загружает их.

Редактировать 1: Добавление build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.company.myapp"
        minSdkVersion 24
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation files('libs/lib1.jar')
    implementation files('libs/lib2.jar')
}

Редактировать 2: Вот решение, следуя предыдущим предложениям @ shizhen

1- Мои .jar включали файлы .so в *Каталог 1026 *.Мне пришлось переименовать это в lib.

2 - я распаковал .jar, чтобы собрать файлы .so.

3 - я создал папку src/jniLibs и поместил .so файлов, каждый в соответствующей папке <ANDROID_ABI>.

4 - Я изменил файл build.gradle, добавив в него:

android {
...
sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDir 'src/jniLibs'
        }
    }
}

5 - Et voila!Последний .apk теперь включает нативные библиотеки.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Все хорошо, пока я не собрал apk: исследуя его с помощью 7zip, я обнаружил, что файлы .so исчезли, что приводит к всевозможным ошибкам при использовании приложения.

Я полагаю, что ваша jar-зависимость была не для Android , а для Java.

Приложение Android использует формат .dex , поэтому все ваши зависимости .jar будут переупакованы в один или несколько файлов dex.Ваши .so файлы не будут использоваться, поскольку они находятся внутри банки.

Так есть ли способ сказать Gradle не исключать .so файлы при сборке?Я не хочу копировать их вручную в папку в моем проекте Android, так как я не использую их напрямую, но загружает их библиотека .jar.

Итак, по порядкучтобы приспособить банку к приложению Android, вы ДОЛЖНЫ разархивировать банку, извлекая все файлы .so и вручную , помещая их в src/jniLibs/<ANDROID_ABI>/, например

jniLibs
    ├── arm64-v8a
    │   ├── libxxx.so
    │   └── libyyy.so
    ├── armeabi-v7a
    │   ├── libxxx.so
    │   └── libyyy.so
    ├── x86
    │   ├── libxxx.so
    │   └── libyyy.so
    └── x86_64
        ├── libxxx.so
        └── libyyy.so
0 голосов
/ 29 ноября 2018

Просто установите ваш sourceSets в build.gradle (Модуль: приложение)

android {
   ...
   ...
sourceSets {
    main {
        jniLibs.srcDirs = [
                './src/main/jniLibs'
        ]
    }
 }
}

Используйте ndk, если ваш проект требует:

defaultConfig {
    ...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}
0 голосов
/ 29 ноября 2018

Просто предположение, основанное на документации для Android по «Сократите код и ресурсы» : кажется, что ProGuard автоматически используется для сборок релиза, чтобы удалить явно неиспользуемый код.Вы можете попытаться отключить это:

// …
    buildTypes {
        release {
            minifyEnabled false
            useProguard false
        }
    }
// …

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

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