相关疑难解决方法(0)

如何使用gradle从.AAR Android库存档中排除文件

我正在尝试使用Android Studio和gradle为库Android项目创建AAR文件.

我想从此存档中排除特定的文件夹和文件,但我找不到有效的解决方案.

该项目有两种口味.

app/
|--libs/
|--src/
   |--flavour1/
   |  |--java/
   |     |--a1/
   |     |  |--class_File1.java
   |--flavour2/
   |  |--java/
   |     |--a1/
   |     |  |--class_File1.java
   |--main/
      |--java/
      |  |--...
      |--res/
      |  |--raw/
      |  |  |--comments.txt
      |  |--...
      |--AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)

我使用像这样的build.gradle文件

apply plugin: 'com.android.library'

android {
compileSdkVersion 21
buildToolsVersion "21.1.2"

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 21
}
packagingOptions {
    exclude 'assets'
    exclude '**/comments.txt'
}


sourceSets {

        flavour1 {
            resources {
                exclude '**/comments.txt'
            }
        }
        flavour2 {

        }

}

buildTypes {
    release {
        minifyEnabled true …
Run Code Online (Sandbox Code Playgroud)

android gradle android-gradle-plugin aar

14
推荐指数
1
解决办法
6352
查看次数

从第三方库中删除未使用的资产

我遇到过这个问题,minifyEnabled和shrinkResources在某种意义上给出了次优的结果; 当我包括,

'com.google.android.gms:play-services-places:9.6.1'
Run Code Online (Sandbox Code Playgroud)

我还没有使用Google Sign In API,我收到大量登录图片. sign_in_images

如何从我的APK中删除它们?他们似乎添加了相当多的KB.

我正在使用proguard缩小和缩小资源,如上所述.

java android proguard

9
推荐指数
1
解决办法
660
查看次数

如何动态地从Gradle中排除文件?

我有android library(aar)包含(并在构建模块时构建)本机代码:

apply plugin: 'com.android.library'

android {
  compileSdkVersion 16
  buildToolsVersion "25.0.0"

  defaultConfig {
    minSdkVersion 11
    targetSdkVersion 16
    versionCode 1
    versionName "1.0"

    ndk {
      abiFilters 'armeabi-v7a'
    }
  }

  externalNativeBuild {
    ndkBuild {
      path 'jni/Android.mk'
    }
  }

  sourceSets {
    main {
      manifest.srcFile 'AndroidManifest.xml'
      java.srcDirs = ['src']
      res.srcDirs = ['res']
      jni.srcDirs = ['jni']
    }
  }

  packagingOptions {
    exclude '/lib/armeabi-v7a/libv8.cr.so'
    exclude '/lib/armeabi-v7a/libv8_libbase.cr.so'
     // TODO : generate dynamically from `SHARED_V8_LIB_FILENAMES`
  }
}
Run Code Online (Sandbox Code Playgroud)

我修改了Android.mk文件,使其具有依赖于SHARED_V8_LIB_FILENAMES环境变量的不同配置:

...
# Report configuration
ifeq ($(SHARED_V8_LIB_FILENAMES),) …
Run Code Online (Sandbox Code Playgroud)

android gradle android-library aar

9
推荐指数
1
解决办法
1564
查看次数

从aar中排除jar库

我有一个库项目,它依赖于cordova.jar,它从项目libs目录加载.

我将这个库项目部署为maven nexus.

在应用程序项目中,我依赖于库项目aar(编译...).但是应用程序项目与cordova.jar具有相同的依赖性.

因此,在构建应用程序项目时,我收到此错误:

:transformClassesWithDexForDebug
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/AuthenticationToken;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我试图在我的应用程序项目中加载库时排除cordova.jar:

dependencies {
    compile ('com.my.library:hybridstory:1.0'){
        exclude (group: 'org.apache.cordova')
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.难道我做错了什么?

我的第二个问题是:

将库项目作为aar上传时,是否可以排除/libs/cordova.jar,而不是在应用程序中加载库时排除cordova.jar?我怎么能用这个gradle实现这个目标:

apply plugin: 'com.android.library'
apply plugin: 'maven'

archivesBaseName = 'hybridstory'
group = 'com....'
version = '16.3.0-SNAPSHOT'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName version
    } …
Run Code Online (Sandbox Code Playgroud)

android gradle aar

5
推荐指数
1
解决办法
7050
查看次数

使用 Android 库 (AAR) 作为带有 Gradle 的 Java (Jar) 项目的依赖项

Java Jarbuild.gradle模块:

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'junit:junit:4.12'

    // rx
    compile "io.reactivex.rxjava2:rxjava:2.0.4"
    compile "io.reactivex.rxjava2:rxandroid:2.0.1"
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"
Run Code Online (Sandbox Code Playgroud)

这个 Jar 应该是一个库,用作单元测试 android 项目的实用程序库:

apply plugin: 'com.android.application'

android {
    // ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // test
    testCompile 'junit:junit:4.12'
    testCompile project(':test-utils')

    // ... other non-test dependencies here (including rx)
}
Run Code Online (Sandbox Code Playgroud)

这包括:

    testCompile project(':test-utils')
Run Code Online (Sandbox Code Playgroud)

失败:

错误:模块 'my-android-app:test-utils:unspecified' 依赖于一个或多个 Android 库,但它是一个 jar

这是因为RxAndroid是一个 Android .aar 库。 …

android unit-testing gradle rx-android

5
推荐指数
0
解决办法
1473
查看次数

在库中使用时从 ICU4J 中剥离数据文件

我有一个包含在不同 android 应用程序中的内部库。这个库依赖于 ICU4J。这意味着我们向最终 APK 添加了约 10MB。

lib 使用 ICU4J 的一个子集,所以我想删除所有不必要的数据文件。

ICU文档

目前 ICU4J 没有提供任何工具来揭示数据文件之间的这些依赖关系,因此直接在 ICU4J 项目中修剪数据是一件难事。删除数据时的关键点是确保也删除对该数据的所有依赖项。

我想在构建应用程序时删除数据文件。

StackOverflow 上的一个问题是相关的:Exclude specific resources from a aar dep。不幸的是,该exploded-aar目录不再存在。

您知道我可以在哪一步从 ICU4J 依赖项中删除文件吗?这是我尝试删除cjdict.dict文件的内容:

tasks.create("excludeTask") << {
    ["java/com/ibm/icu/impl/data/icudt60b/brkitr/cjdict.dict"]
            .collect { "${getGroup()}/${getName()}/${getVersion()}/${it}"}
            .each {
        // Question 2. From which dir should I remove the files?
        File file = file("${buildDir}/intermediates/exploded-aar/${it}")
        println("Excluding file " + file)
        if (file.exists()) {
            file.delete();
        }
    }
}

tasks.whenTaskAdded({
    // Question 1. Before which task …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin icu4j

5
推荐指数
1
解决办法
435
查看次数