我想提供发行版.aar来在任何应用程序中使用这部分UI.
我的图书馆有下一个家属:
compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile ('com.android.support:recyclerview-v7:22.2.1'){ exclude group: 'com.android.support', module: 'support-v4' } compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0' //Http communication, websockets, etc. compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' //Fonts compile 'uk.co.chrisjenx:calligraphy:2.1.0' //Unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.9.5' //Other compile ('org.apache.commons:commons-lang3:3.4'){ exclude group: 'org.apache.httpcomponents' } //Reactive programmnig compile 'io.reactivex:rxjava:1.0.13' compile 'io.reactivex:rxandroid:0.25.0' compile 'com.github.bumptech.glide:glide:3.6.1'
当我建立.aar一切都很好,但当我把这个.aar包含在另一个应用程序中时,我有下一个问题:
1). ./gradlew清洁构建
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’./home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’./home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’./home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’./home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’./home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29
: No resource found that matches the given name: attr ‘fontPath’.:app:processDebugResources FAILED
解决方案非常简单 – 下一行添加到MainApp / app / build.gradle:
编译’uk.co.chrisjenx:书法:2.1.0′
2).当我运行MainApp时收到此错误:
java.lang.NoClassDefFoundError:com.my.sdk.ui.fragment.DialogAppNotInstalledFragment
为了解决这个问题,我需要将编译’com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0’添加到MainApp / app / build.gradle.
与其他家属相同.
在结果中,我只需要将我的所有dependecies从我的库项目复制粘贴到MainApp项目.
是否有可能使图书馆包含所有必要的依赖?
build.gradle库:
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } } apply plugin: 'com.android.library' apply plugin: 'maven-publish' //apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' repositories { mavenCentral() } android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "0.0.1" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 } dexOptions { preDexLibraries = false incremental true javaMaxHeapSize "4g" } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude '.readme' } lintOptions { abortOnError false } sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile ('com.android.support:recyclerview-v7:22.2.1'){ exclude group: 'com.android.support', module: 'support-v4' } compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0' //Http communication, websockets, etc. compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' //Fonts compile 'uk.co.chrisjenx:calligraphy:2.1.0' //Unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.9.5' //Other compile ('org.apache.commons:commons-lang3:3.4'){ exclude group: 'org.apache.httpcomponents' } //Reactive programmnig compile 'io.reactivex:rxjava:1.0.13' compile 'io.reactivex:rxandroid:0.25.0' compile 'com.github.bumptech.glide:glide:3.6.1' } // To publish to maven local execute "gradle clean build publishToMavenLocal" // To publish to nexus execute "gradle clean build publish" android.libraryVariants publishing { publications { maven(MavenPublication) { artifact "${project.buildDir}/outputs/aar/${project.name}-release.aar" artifactId = POM_ARTIFACT_ID groupId = GROUP version = VERSION_NAME // Task androidSourcesJar is provided by gradle-mvn-push.gradle //artifact androidSourcesJar { // classifier "sources" //} } } repositories { maven { credentials { username System.getenv('NEXUS_USER_NAME') password System.getenv('NEXUS_PASSWORD') } url "http://my-nexus-url/" } } }
MainApp /应用/的build.gradle:
buildscript { repositories { maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.+' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' repositories { maven { url 'https://maven.fabric.io/public' } maven { url 'http://my-nexus-url/' } flatDir { dirs 'libs' } } android { signingConfigs { some_config { keyAlias 'some alias' keyPassword '741789654uppy' storeFile file('../my-keystore.jks') storePassword 'some_password' } } compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.company.app.android" minSdkVersion 14 targetSdkVersion 23 versionCode 9 versionName "1.0.0" } dexOptions { preDexLibraries = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' signingConfig signingConfigs.some_config } } } dependencies { compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile files('libs/StartAppInApp-2.3.1.jar') // compile files('libs/android-support-v4.jar') compile files('libs/applovin-sdk-5.2.0.jar') compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') { transitive = true; } //here is my library!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! compile('com.my.sdk:SDK:0.0.1@aar'){ transitive = true; exclude(group:'android.support', module: 'support-v4') } //*********************************************** //Dependecies from library //*********************************************** compile 'uk.co.chrisjenx:calligraphy:2.1.0' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'io.reactivex:rxjava:1.0.13' compile 'io.reactivex:rxandroid:0.25.0' compile 'com.github.bumptech.glide:glide:3.6.1' compile ('com.android.support:recyclerview-v7:22.2.1'){ exclude group: 'com.android.support', module: 'support-v4' } compile 'org.lucasr.twowayview:twowayview:0.1.4' compile 'com.android.support:appcompat-v7:23.1.1' compile ('org.apache.commons:commons-lang3:3.4'){ exclude group: 'org.apache.httpcomponents' } compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0' //************************************************ }
UPDATE
生成的POM文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.my.sdk</groupId> <artifactId>SDK</artifactId> <version>0.0.1</version> <packaging>aar</packaging> </project>如果有人遇到同样的问题,您可以获得正确答案 here
结果build.gradle是:
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } } apply plugin: 'com.android.library' apply plugin: 'maven-publish' repositories { mavenCentral() } android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "0.0.1" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 } dexOptions { preDexLibraries = false incremental true javaMaxHeapSize "4g" } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude '.readme' } lintOptions { abortOnError false } sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile ('com.android.support:recyclerview-v7:22.2.1'){ exclude group: 'com.android.support', module: 'support-v4' } compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0' //Http communication, websockets, etc. compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' //Fonts compile 'uk.co.chrisjenx:calligraphy:2.1.0' //Unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.9.5' //Other compile ('org.apache.commons:commons-lang3:3.4'){ exclude group: 'org.apache.httpcomponents' } //Reactive programmnig compile 'io.reactivex:rxjava:1.0.13' compile 'io.reactivex:rxandroid:0.25.0' compile 'com.github.bumptech.glide:glide:3.6.1' } // To publish to maven local execute "gradle clean build publishToMavenLocal" // To publish to nexus execute "gradle clean build publish" android.libraryVariants publishing { publications { maven(MavenPublication) { artifact "${project.buildDir}/outputs/aar/${project.name}-release.aar" artifactId = POM_ARTIFACT_ID groupId = GROUP version = VERSION_NAME pom.withXml { def depsNode = asNode().appendNode('dependencies') configurations.compile.allDependencies.each { dep -> if(dep.name != null && dep.group != null && dep.version != null) { def depNode = depsNode.appendNode('dependency') depNode.appendNode('groupId', dep.group) depNode.appendNode('artifactId', dep.name) depNode.appendNode('version', dep.version) //optional add scope //optional add transitive exclusions } } } } } repositories { maven { credentials { username System.getenv('NEXUS_USER_NAME') password System.getenv('NEXUS_PASSWORD') } url "http://nexus-repository-url/" } } }