如何从具有gradle依赖性的代码创建Android库?

2022-09-04 21:07:04

我正在创建一个基于以下组件的依赖项的Android库。

  1. 我的库代码
  2. 布局和资源文件
  3. 对第三方的依赖关系。

首先,我想到为我的库创建.jar文件,但后来我发现laulyoit和资源文件不是用jar编译的。然后我决定创建AAR文件。请建议这个是正确的举动还是有其他选择?

现在,主要问题我被困在gradle依赖项中。我们正在创建一个付费库,该库使用一些第三方,例如只能通过Gradle获得的Google。现在,由于我正在创建一个AAR文件,因此不会有清单.xml和Gradle文件,我如何将第三方与我自己的代码集成。我们有严格的说明,我们不得告诉图书馆的用户包括该第三方。简而言之,我们不能让用户知道我们的图书馆正在使用什么样的第三方。那么,有没有办法创建一个AAR文件,该文件也具有预编译的gradle依赖项,而不会透露用户我们正在使用什么服务?

更新 1

这是我的 build.gradle for Library

apply plugin: 'com.android.library'

android {
   compileSdkVersion 25
   buildToolsVersion "25.0.2"
   defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner         "android.support.test.runner.AndroidJUnitRunner"
}
   dexOptions {
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
   }
   buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
 }

 dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
   compile 'com.android.support:appcompat-v7:+'

   compile 'com.google.android.gms:play-services-vision:10.2.1'

   testCompile 'junit:junit:4.12'
}

之后,我将 .aar 文件移动到本地 maven,然后使用应用程序项目中的输出文件进行创建。这是相同的等级。

apply plugin: 'com.android.application'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
    applicationId "com.jarvis.myapplication"
    minSdkVersion 15
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
    buildTypes {
        release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile('com.company:mylibrary:1.0@aar')
        {
            transitive = true
        }
    compile 'com.android.support:appcompat-v7:25.3.0'
    testCompile 'junit:junit:4.12'
}

答案 1

如果创建一个 .aar 项目,则有一个清单文件,它将在编译时与应用的清单合并。一切正常。您可以在 .aar 项目中使用任何 gradle 依赖项,甚至可以使用 proguard 混淆和签名。

要在主应用程序中编译 .aar 库,请像这样将其放在 build.grade 文件中:dependencies

dependencies {
    compile(name:'your_lib_name', ext:'aar')
}

您必须将 .aar 文件复制到文件夹中的文件夹中。libsapp

但有一点是清楚的:如果有人使用您的.aar文件,他或她可以随时在Android Studio中查看合并的清单文件,而您无法隐藏您的依赖项。至少,据我所知。Android由开源库(甚至通过maven)强烈驱动,在大多数情况下,您甚至必须包含已使用外部库的许可证,这些许可证对用户可见,作为应用程序中的菜单项或链接。否则,您在某些情况下甚至违反了许可,甚至可能违反了使用条款。您不得隐藏它们。


答案 2

嗨@user3572586,

  • aar 文件不包含传递依赖项,也没有描述库使用的依赖项的 pom 文件。

  • 这意味着,如果要使用 flatDir 存储库导入 aar 文件,则必须在项目中指定依赖项。

  • 您应该使用 maven 存储库(您必须在私有或公共 maven 存储库中发布库),您不会遇到相同的问题。

  • 在这种情况下,gradle 使用将包含依赖项列表的 pom 文件下载依赖项。

要从用户那里隐藏付费库,最好在项目内为单个库创建包,然后生成.aar文件。我自己创建一个实时流lib相同的问题,在那个时间依赖模块被移动到我的项目内,然后制作.aar文件。


推荐