adwiv / android-fat-aar

Gradle script that allows you to merge and embed dependencies in generted aar file
The Unlicense
1.46k stars 435 forks source link

jni libs are not included in aar #15

Closed jkgneu12 closed 8 years ago

jkgneu12 commented 8 years ago

In some environments the jni libs were not being included in my output aar. This was happening when "transformNative_libsWithSyncJniLibsForRelease" was not UP_TO_DATE.

I was able to work around this by ensuring that "embedJniLibs" ran after "transformNative_libsWithSyncJniLibsForRelease".

I didn't dig to much further into the issue.

adwiv commented 8 years ago

Thanks for the report. what Gradle version are you using? I haven't seen this task in my projects.

Cheers.

jkgneu12 commented 8 years ago

Gradle v2.10. Android Gradle build tools v1.5.0.

Let me know if you need anything else.

adwiv commented 8 years ago

Are you using the built in JNI functionality in android studio?

Can you please send a sample project? It works for me with custom JNI gradle tasks.

isometriq commented 8 years ago

I've used the tool lately and I had problems with the JNI inclusion in the merged aar file -First of all, gradle 2.0+ does not worked for me but 1.5 did -Secondly, if I tried to build the library project alone (no other 'app' modules), the JNI files are not included. I need to have a module 'app' that compiles my library project.

If I'm wrong in any way, please let me know. PS: This script was a life-saver, I hope we can make it work in the latest gradle versions.thx

yusefmaali commented 8 years ago

Same issue of @jkgneu12 to me. Gradle v.2.10 and gradle build tools v.2.1.2

Seems that when "transformNative_libsWithSyncJniLibsForRelease" runs, it will reset the imported jni libs. Same workaround working: ensuring that "embedJniLibs" and "mergeReleaseJniLibFolders" runs after "transformNative_libsWithSyncJniLibsForRelease".

The project I work on is structured as:

michael-customlbs commented 8 years ago

I have the same problem. My .so files are generated correctly and copied with embedJniLibs into build/intermediates/bundles/release/jni/, but the transformNative_libsWithSyncJniLibsForRelease task deletes the file. If I run gradle build a second time it works. It only fails on first build.

Can you explain to me a little bit more detailed how I can make sure that the tasks run after transformNative_libsWithSyncJniLibsForRelease?

michael-customlbs commented 8 years ago

I think I figured it out. Does this look reasonable?

     } else {
         NEEDTOFIX
     }
+
+    if (tasks.findByPath('transformNative_libsWithSyncJniLibsForRelease') != null) {
+        // embedJniLibs must run after transformNative_libsWithSyncJniLibsForRelease to
+        // avoid the issue in https://github.com/adwiv/android-fat-aar/issues/15
+        mergeReleaseJniLibFolders.mustRunAfter transformNative_libsWithSyncJniLibsForRelease
+        embedJniLibs.mustRunAfter transformNative_libsWithSyncJniLibsForRelease
+    }
+
     bundleRelease.dependsOn embedJniLibs

     // Merge Embedded Manifests
jkgneu12 commented 8 years ago

Sorry for the late reply... @michael-customlbs workaround is similar to mine:

    // Merge Native libraries
 + if (tasks.findByPath('transformNative_libsWithSyncJniLibsForRelease') != null) {
 +      embedJniLibs.mustRunAfter transformNative_libsWithSyncJniLibsForRelease
 + } else if (tasks.findByPath('packageReleaseJniLibs') != null) {
 -  if (tasks.findByPath('packageReleaseJniLibs') != null) {
        embedJniLibs.mustRunAfter packageReleaseJniLibs
    } else if (tasks.findByPath('mergeReleaseJniLibFolders') != null) {
        embedJniLibs.mustRunAfter mergeReleaseJniLibFolders
    } else {
        NEEDTOFIX
    }

@adwiv I unfortunately cannot share my project, but here is the relevant section of my build.gradle file:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 22
        versionCode 1
        versionName version
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

apply from: 'fat-aar.gradle'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    testCompile "org.mockito:mockito-core:1.9.5"
    embedded 'com.mycompany.mylib:1.8.0@aar'
}
michael-customlbs commented 8 years ago

But now I have the problem that the .so file contains debugging symbols. At least gdb tells me it found them. Any idea how I can fix this?

adwiv commented 8 years ago

Thanks guys.. I took advise from this thread and added it in the latest build. Seems to work for me in test cases. Let me know if there are any issues with it.