android library를 만들고 배포할려면 maven repository가 필요한데, 이게 준비가 되어 있지 않다면 aar파일을 직접 전달해야 하는 번거러움이 있습니다. 그런데 github packages에 apache maven을 지원해주기에 간단하게 aar library를 배포하여 사용할 수 있습니다.

github packages에 대한 설명은. 해당 링크로..

github - personal access tokne 생성

github의 자신의 계정에서 Settings-> Developr settings -> Personal access tokens 으로 가서 access token을 생성 합니다.
write packages, read packages 를 체크 합니다.

properties

project의 root 위칭에 github.properties 를 만들고 그 안에
github에서의 username과 access token생성한 것을 적용해 줍니다.
그리고 해당 파일은 github에 올라가지 않도록 .gitignore 에 추가해 주는 것이 좋습니다. 보안상...

github_username={username}
github_access_token={access_token}

Publish script

library module에 있는 위치에 publish.gradle 를 만듭니다.
그리고 그 안의 내용에는

apply plugin: 'maven-publish'

def githubProperties = new Properties()
githubProperties.load(new FileInputStream(rootProject.file("github.properties")))

def LIB_GROUP_ID = {library_group_id}
def LIB_ARTIFACT_ID = {artifact_id}
def LIB_VERSION = {version_name}

task sourceJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier "sources"
}

publishing {
    repositories {
        maven {
            name = 'GithubPackages'
            url = uri("https://maven.pkg.github.com/{user_name}/{project_name}")
            credentials {
                username = githubProperties['github_username'] ?: System.getenv("github_username")
                password = githubProperties['github_access_token'] ?: System.getenv("github_access_token")
            }
        }
        maven {
            name = 'CustomMavenRepo'
            url = "file://${buildDir}/repo"
        }
    }
    publications {
        deploy(MavenPublication) {
            groupId LIB_GROUP_ID
            artifactId LIB_ARTIFACT_ID
            version LIB_VERSION
            artifact("$buildDir/outputs/aar/${aar_library_name}.aar")
            artifact(sourceJar)

            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')

                //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.api.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }
}

그리고 나서, library project에 있는 build.gradle 에 아래와 같이 추가해 줍니다.

apply from: file('publish.gradle')

이와 같이 추가하고 나면

그림과 같이 gradle에 publishing 에 대한 부분이 생깁니다.

library를 build후 publishDeployPublicationToCustomMavenRepoRepository 하고 나면, local repo에 배포가 되는 부분을 확인할 수 있습니다.

실질적으로 배포를 할려면 publishDeployPublicationToGithubPackagesRepository 로 하면 github의 지정된 username/project의github packages에 배포가 되게 됩니다.

library 사용

root에 있는 build.gradle 에 다음과 같이 repositories에 추가해 줍니다.

def githubProperties = new Properties()
githubProperties.load(new FileInputStream(rootProject.file("github.properties")))

repositories {
        google()
        jcenter()

        mavenLocal()
        maven {
            name = {maven_repository_name}
            url = uri("https://maven.pkg.github.com/{user_name}/{project_name}")
            credentials {
                username = githubProperties['github_username'] ?: System.getenv("github_username")
                password = githubProperties['github_access_token'] ?: System.getenv("github_access_token")
            }
        }
    }

그리고 application 에 있는 build.gradle 에 maven repository에 있는 library 사용할 때 처럼.

implementation '{library_group_id}:{artifact_id}:{version}'

으로 해서 사용하면 됩니다.

maven repository를 만들고 관리하는 것 또한 비용인데, 이걸 github packages를 이용한다면 간단히 해결되는 것 같습니다.

Android 개발할 때 eclipse를 통하여 개발을 많이 했는데, AndroidStudio를 통하여 개발을 해보게 되었습니다.

그중에 Build상태에서는 오류가 나오진 않았지만 Runtime시에 

Excution failed for task ':app:preDexDebug'

이와 같은 오류를 보게 되었습니다. Build는 되었는데 왜 Runtime시에 나타날까에 대한 것도 찾아 보았을 때 추가해준 Library중 하나가 AndroidLibrary가 아닌 Java LIbrary로 된 것이 있었습니다. 그리고 개발중에 사용된 java version이 

Java SE 8u25

버전을 사용했더니 문제가 나타났습니다. gradle빌드에 1.6이라는 옵션을 주었지만 해결되지 않았죠 ㅡㅡ.

혹시나 하는 마음에 

Java SE 7u71/72 

를 설치하고 JDK location을 변경해 주었더니 문제가 없어졌습니다.... 아무래도 java8에서 빌드된 java library가 dex로 변경을 할 수 없는 듯 해 보입니다. 이런식으로 해결은 했지만 그래도 좀 찜찜하네요 ㅡㅡ.



Android LIbrary 프로젝트를 Library add 해서 사용할 수도 있지만, ant jar 를 통한 jar파일로 library를 빌드해서 사용할 수도 있습니다. 단순히 ant jar 만 해주면 jar 파일로 빌드를 해주는데... library project를 ant jar 하게 도면

BUILD FAILED

D:\16.SDK\Android\android-sdk-windows\tools\ant\build.xml:653: The following err

or occurred while executing this line:

D:\16.SDK\Android\android-sdk-windows\tools\ant\build.xml:679: '${renderscript.o

pt.level}' is not a permitted value for com.android.ant.RenderScriptTask$OptLeve

l

이와 같은 오류를 보이면서 BUILD FAILED가 나오게 됩니다. RenderScript option 문제라도 하는데. 이를 해결하는 방법이 은근히 간단했습니다.


project.properties 파일에다가

renderscript.opt.level=O0

이 내용을 추가하고 ant jar 하게 되면

android libarary project가 jar 파일로 빌드되게 됩니다.

+ Recent posts