簡體   English   中英

如何告訴Gradle不要在我的.jar依賴項中排除.so文件?

[英]How to tell Gradle not to exclude .so files in my .jar dependency?

我有一個.jar依賴項,里面有.so庫。

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

jar在內部使用這個.so庫,我正在構建一個使用jar的Android應用程序。

一切都很好,直到我構建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包含libs目錄中的.so文件。 我不得不重命名為lib

2-我解壓縮.jar以收集.so文件。

3-我創建了src/jniLibs文件夾並將.so文件放在各自的<ANDROID_ABI>文件夾中。

4-我修改了build.gradle文件以包含:

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

5 - 瞧! 最終的.apk現在包括本機庫。

一切都很好,直到我構建apk:通過使用7zip探索它,我發現.so文件已經消失,導致使用應用程序時的各種錯誤。

我相信你的jar依賴不是最初用於android而是通常用於Java。

Android應用程序使用.dex格式,因此所有.jar依賴項都將重新打包到一個或多個dex文件中。 您的.so文件將不會被使用,因為它在jar中。

那么有什么方法可以告訴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

只是猜測基於Android文檔“收縮你的代碼和資源” :似乎ProGuard自動用於發布版本,以便刪除明顯未使用的代碼。 您可以嘗試禁用它:

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

如果這有幫助,那么ProGuard將是您的罪魁禍首。 您可以嘗試明確告訴它保留不得刪除的文件 ,而不是將其禁用。

只需在build.gradle中設置sourceSets(模塊:app)

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

如果您的項目需要,請使用ndk:

defaultConfig {
    ...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM