当前位置: 首页 > 科技观察

创建和发布Android开发库的终极指南

时间:2023-03-20 19:57:35 科技观察

我一直对android开发社区中有多少第三方库可用感到惊讶。很长一段时间以来,我都想贡献点东西,但我不知道该怎么做。在浏览了很多其他关于如何发布android开发库的文章后,我仍然发现缺少一些细节,而且所有信息都在不同的地方。所以,我将介绍整个过程并向您展示我是如何做到的。对于初学者,我推荐使用AndroidStudio来创建所有的Android项目,而AndroidStudio官方使用的是Gradle构建系统。确保下载最新版本的AndroidStudio。相关术语介绍在我们开始之前,有一些术语需要先熟悉一下。Project——在AndroidStudio中,一个项目就是一个完整的Android应用。一个AndroidStudio项目由一个或多个模块组成。在AndroidStudio中,项目类似于Eclipse中的工作区。模块——模块是应用程序的一个组件,可以独立构建、测试和调试。模块包含应用程序的源代码和资源文件。在AndroidStudio中,模块类似于Eclipse中的项目。AAR–“aar”包是Android开发库项目的二进制分发版。(AAR格式)开发库工程主要输出的是.aar包(意思是Android压缩包)。它由编译后的代码(如jar文件或.so文件)和资源文件(如manifest文件、res文件、asset文件)组成。MavenCentralRepository-Maven社区提供的存储库。它包含了很多我们常用的开发库。搜索Maven网站可用于浏览Maven中央存储库的内容。Gradle,Please网站是另一个可用于搜索中央存储库的工具。如果您在项目配置文件的存储库配置部分添加jCenter(),那么Gradle将使用jCenter存储库(jCenter的描述)。MavenCentralRepository也常被称为MavenCentral或CentralRepository。Sonatype—Sonatype的开源软件存储库托管(OSSRH)服务是项目作者和贡献者将其组件发布到中央存储库的主要方式。它是一个SonatypeNexusProfessional组织,使用NexusStagingSuite工具为开源项目提供部署托管服务。该服务主要用于处理部署和验证操作,同时也提供同步操作,通过网络将内容投递到中央仓库。GPG–GNUPrivacyProtectionGroup(也称为GPG或GnuPG),GNU项目是一个遵循OpenPGP(RFC4880)标准的加密软件,是PGP的免费替代品。使用GPG,您可以加密(解密)包含敏感数据的文件,例如受健康保险流通与责任法案(HIPAA)保护隐私和安全的电子健康信息。有关GPG的更多信息,请访问GNUPrivacyGuard网站。准备你的Android开发库我将以我的Trestle开发库为例进行说明。在你的项目中,你需要修改一些地方,以准备在Maven中央仓库发布为开发库。将开发库的核心代码与示例代码分开。在我的项目中,我将它们分成库和示例模块。请仔细阅读有关创建开发库模块的提示。您可能还需要重命名您的模块。在示例模块的build.gradle文件中,确保包含以下内容:applyplugin:'com.android.application'dependencies{compileproject(':library')}包括以下:applyplugin:'com.android.library'applyfrom:'maven-push.gradle'在库模块中,添加gradle.properties文件,请确保文件中包含以下内容:POM_NAME=ProjectNamePOM_ARTIFACT_ID=projectnamePOM_PACKAGING=aar在库模块中,添加maven-push.gradle文件,请务必在文件中包含以下内容:/**Copyright2013ChrisBanes**LicensedundertheApacheLicense,Version2.0(the"License");*youmaynotusethisfileexceptincompliancewiththeLicense.*YoumayobtainacopyoftheLicenseat**http://www.apache.org/licenses/LICENSE-2.0**除非适用法律要求或书面同意,软件*在许可证下分发是在“ASIS”基础上分发的,*没有任何形式的保证或条件,无论是expressorimplied.*有关特定语言的许可和*许可下的限制,请参阅许可。*/applyplugin:'maven'applyplugin:'signing'defisReleaseBuild(){returnVERSION_NAME.contains("SNAPSHOT")==false}defgetReleaseRepositoryUrl(){returnhasProperty('RELEASE_REPOSITORY_URL')?RELEASE_REPOSITORY_URL:"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}defgetSnapshotRepositoryUrl(){returnhasProperty('SNAPSHOT_REPOSITORY_URL')?SNAPSHOT_REPOSITORY_URL:"https://oss.sonatype.org/content/repositories/snapshots/"}defgetRepositoryUsername(){returnhasProperty('NEXUS_USERNAME')?NEXUS_USERNAME:""}defgetRepositoryPassword(){returnhasProperty('NEXUS_PASSWORD')?NEXUS_PASSWORD:""}afterEvaluate{project->uploadArchives{repositories{mavenDeployer{beforeDeployment{MavenDeploymentdeployment->signing.signPom(deployment)}pom.groupId=GROUPpom.ACTIFmARTId.version=VERSION_NAMErepository(url:getReleaseRepositoryUrl()){authentication(userName:getRepositoryUsername(),password:getRepositoryPassword())}snapshotRepository(url:getSnapshotRepositoryUrl()){authentication(userName:getRepositoryUsername(),password:getRepositoryPassword())}pom.project{namePOM_NAMEpackagingPOM_PACKAGINGdescriptionPOM_DESCRIPTIONurlPOM_URLscm{urlPOM_SCM_URLconnectionPOM_SCM_CONNECTIONdeveloperConnectionPOM_SCM_DEV_CONNECTION}licenses{license{namePOM_LICENCE_NAMEurlPOM_LICENCE_URLdistributionPOM_LICENCE_DIST}}developers{developer{idPOM_DEVELOPER_IDnamePOM_DEVELOPER_NAME}}}}}}signing{required{isReleaseBuild()&&gradle.taskGraph.hasTask("uploadArchives")}signconfigurations.archives}//taskandroidJavadocs(type:Javadoc){//source=android.sourceSets.main.allJava////taskandroidJavadocsJar(类型:Jar,dependsOn:androidJavadocs){//classifier='javadoc'//fromandroidJavadocs.destinationDir//}taskandroidSourcesJar(type:Jar){classifier='sources'fromandroid.sourceSets.main.java.sourceFiles}artifacts{archivesandroidSourcesJar}}修改项目根目录的.gitignore文件#[Android]========================#Builtapplicationfiles*.apk*.ap_#FilesfortheDalvikVM*.dex#Javaclassfiles*.class#Generatedfilesbin/gen/#Gradlefiles.gradle/build/#Localconfigurationfile(sdkpath,etc)local.properties#ProguardfoldergeneratedbyEclipseproguard/#LogFiles*.log##Directory-basedprojectformat:.idea/##File-basedprojectformat:*.ipr*.iws##Plugin-specificfiles:#IntelliJout/#mpeltonen/sbt-ideaplugin.idea_modules/#JIRApluginatlassian-ide-plugin.xml#Crashlyticsplugin(forAndroidStudioandIntelliJ)com_crashlytics_export_strings.xml#[Maven]======================target/pom.xml.tagpom.xml.releaseBackuppom.xml.versionsBackuppom.xml.nextrelease.properties#[Gradle-Android]========================#IgnoreGradleGUIconfiggradle-app.setting#GradleSigningsigning.propertiestrestle.keystore#MobileToolsforJava(J2ME).mtj.tmp/#PackageFiles#*.jar*.war*.ear#virtualmachinecrashlogs,参见http://www.java.com/en/download/help/error_hotspot.xmlhs_err_pid*#Misc/.idea/workspace.xml.DS_Store/captures**/*.iml*.class修改项目根目录的settings.gradle文件include':sample',':library'修改项目根目录的gradle.properties文件#Project-wideGradlesettings.#IDE(e.g.AndroidStudio)users:#GradlesettingsconfiguredthroughtheIDE*willoverride*#anysettingsspecifiedinthisfile.#Formoredetailsonhowtoconfigureyourbuildenvironmentvisit#http://www.gradle.org/docs/current/userguide/build_environment.html#SpecifiestheJVMargumentsusedforthedaemonprocess.#Thesettingisparticularlyusefulfortweakingmemorysettings.#Defaultvalue:-Xmx102=48Pm6XX:-Xmx102=48Pm6XX:.当前/用户指南/multi_project_builds.html#sec:decoupled_projects#org.gradle.parallel=trueVERSION_NAME=0.0.1VERSION_CODE=1GROUP=com.github.github_usernamePOM_DESCRIPTION=AlibrarythatdoesX,和ZPOM_URL=https://github.com/github_username/ProjectNamePOM_SCM_URL=https://github.com/github_username/ProjectNamePOM_SCM_CONNECTION=scm:git@github.com:github_username/ProjectName.gitPOM_SCM_DEV_CONNECTION=scm:git@github.com:github_username/ProjectName.gitPOM_LICENCE_NAME=TheApacheSoftwareLicense,Version2.0POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txtPOM_LICENCE_DIST=repoPOM_DEVELOPER_ID=github_usernamePOM_DEVELOPER_NAME=GitHubADFullName为其他开发者添加文件到你的仓库以及如何使用它如果您想在README.md文件中添加一些屏幕截图,我强烈推荐一个名为Screenr的应用程序。安装GPG如果您的机器上没有安装GPG,您需要下载并安装它。如果你是MacOSX系统,安装手册在这里。如果您从未使用过GPG-首先,创建一个GPG密钥:$gpg--gen-key如果您在创建GPG密钥时不确定如何回答问题,本指南(创建加密密钥)可以提供帮助。接下来,找到您的密钥ID:$gpg--list-keys第一行看起来像pubXXXXX/YYYYYYYY。请记住,“YYYYYYYY”部分是您的密钥ID。现在,发布你的密钥:$gpg--keyserverhkp://keyserver.ubuntu.com--send-keysYYYYYYYY$gpg--keyserverhkp://pgp.mit.edu--send-keysYYYYYYYY你当然可以使用其他密钥服务器,你也可以通过以下命令确认你的密钥是否已经被释放:$gpg--keyserverhkp://pgp.mit.edu--search-keysjohndoe@example.com#使用你的邮箱来让你的开发库被列出来在Gradle,Please网站(也是为了方便别人引用你的开发库),请上传你的项目到MavenCentral。上传项目最简单的方法是使用Sonatype。Sonatype在Sonatype创建一个JIRA帐户。登录成功后,新建一个issue。我为我的Trestle项目创建了一个GitHub存储库。所以我在newissue上填写的字段大致是这样的:github.com//.gitUsername:AlreadySyncedtoCentral:No注意:我为需要填写的字段添加了括号作为占位符。您需要用适当的值替换它们。当您准备好提交问题时,问题的详细信息应该类似于上面的屏幕截图。在您提交完成后,Sonatype将需要2个工作日来处理您的问题。然后您将收到一封确认电子邮件,表明您的配置已准备就绪,您可以发布您的开源库。在您收到一封表明您的票没有问题的电子邮件之前,请不要部署您的开源库。新项目的一个常见问题是过早部署。这会错误地将您的工件变成每个人都可以获得的存储库。最后,如果您的组件已经在中央存储库中,请将以下信息添加到您的票证中并参考这篇文章,如何迁移到OSSRH。修改本地计算机上的~/.gradle/gradle.properties文件以包含以下内容:NEXUS_USERNAME=sonatype_usernameNEXUS_PASSWORD=sonatype_passwordsigning.keyId=gpg_key_idsigning.password=gpg_passwordsigning.secretKeyRingFile=/Users/username/.gnupg/secring.gpgorg.gradle.daemon=true当你发布开发库时,认证信息已经在gradle.properties文件中提供。确保提供正确的nexus用户名和密码(又名Sonatype用户名和密码),否则您将收到未经授权的401错误。注意:如果您之前发布过开发仓库,则无需在JIRA(Sonatype)上创建新问题。每个顶级groupId对应一个JIRA问题。您应该已经拥有将任何新工件部署到您的groupId或从属组所需的所有权限。中央存储库的同步遵循自上而下的过程,因此来自任何下属组的发布将自动同步。当你发布一个新的组件时,你不需要告诉Sonatype,因为当你同步仓库时,Sonatype没有什么可以配置或检查的。Sonatype只会在执行第一次同步操作时发布一条推特。发布准备好发布存储库后,在AndroidStudio中打开右侧的Gradle视图,在Tasks>upload下,单击uploadArchives,您的存储库将上传到SonatypeStagingRepositories。在SonatypeStagingRepositories页面上,登录您的Sonatype帐户,查找您的“staging”开发存储库,它应该在列表的末尾,选择它,然后按“关闭”按钮。关闭开发存储库实际上意味着您已准备好发布它。如果关机一切顺利-您应该会看到激活的“发布”按钮。您可能需要刷新下一页。请按发布按钮。阅读有关使用Nexus管理存储库的帮助文档。如果这是您的第一个存储库版本,请返回JIRA并在JIRA上发表评论您已经改进了您的存储库,如果不是第一个,则无需告诉Sonatype您已经改进了您的存储库。然后您应该会收到来自Sonatype的回复消息,说明您的开发存储库将在10分钟内准备就绪,并将在接下来的几个小时内同步到MavenCentral。几个小时后,它将出现在Gradle,Please网站上。使用你的开发库为了让其他开发者使用你的开发库,他们需要在Android项目的build.gradle文件中添加一个依赖,如下:applyplugin:'android'dependencies{compile'c??om.github.lawloretienne:trestle:0.0.3'}特别感谢非常感谢ChrisBanes、JonathanLe、SergeZaitsev和其他写博客并帮助我完成这个复杂过程的人。我的开发库QuickReturn—https://github.com/lawloretienne/QuickReturnTrestle—https://github.com/lawloretienne/TrestleImageGallery—https://github.com/lawloretienne/ImageGallery