Gradle swap jniLibs resources based on build flavor

后端 未结 3 887
挽巷
挽巷 2021-01-13 10:15

I am trying to swap some resources in the res/raw folder and the jniLibs/armeabi folder based on whether its a release buildType or a

3条回答
  •  余生分开走
    2021-01-13 11:07

    some of them mention that you just need separate folders based on build variant and some mention about having to use sourceSet?

    Gradle/Gradle for Android has an expected structure for a sourceset:

    • Android resources in res/
    • Java source tree in java/
    • Pre-compiled JNI libraries in jniLibs/
    • Assets in assets/
    • Etc.

    Where the sourceSets closure comes into play is if, for a given sourceset, you want a different structure:

    • Android resources in foo/
    • Java source tree in bar/
    • Pre-compiled JNI libraries in ickyNativeStuff/
    • Assets in assetsBecauseThatSeemsLikeADecentName/
    • Etc.

    Each build type, product flavor, and build variant can have a separate sourceset (as can androidTest for instrumentation testing), to go along with main. They are named the same as the build type/product flavor/build variant. These will be in the stock structure, unless you use sourceSets to change things.

    So, to roll all the way back to:

    I am trying to swap some resources in the res/raw folder and the jniLibs/armeabi folder based on whether its a release buildType or a debug buildType

    In the case of resources, other sourcesets overlay main. So, if you have src/main/res/... and src/main/debug/... and src/main/release/..., and you are doing a debug build, whatever is in src/main/release/... is ignored (as we aren't doing release) and whatever is in src/main/res/... and src/main/debug/... will be used. If there is the same resource in both (src/main/res/raw/boom.ogg and src/debug/res/raw/boom.ogg), the debug one trumps the main one.

    I have not experimented with varying jniLibs/ by build variant. My guess is that it will behave more like Java code, where you cannot have conflicts between what is in a build variant's sourceset and what is in main, but that's just a guess. So, you can have the debug version of your compiled JNI code in src/debug/jniLibs/ and the release version of your compiled JNI code in src/release/jniLibs/. Only have in src/main/jniLibs/ any libraries that are not varying. That being said, as I mentioned, I haven't tried this, and so there may be hiccups here.

    So, I would expect you to not have a sourcesets closure in build.gradle, and to just use the stock sourcesets structure, for your various bits:

    src/
      main/
        ...
      debug/
        jniLibs/
        res/
          raw/
      release
        jniLibs/
        res/
          raw/
    

提交回复
热议问题