我应该如何组织Android项目(包括库)的源代码管理?

我应该如何组织Android项目(包括库)的源代码管理?,android,git,version-control,github,project-organization,Android,Git,Version Control,Github,Project Organization,我需要一些帮助,找出组织我的Android项目的最佳方式(或最佳实践)。为了简单起见,假设我的Eclipse Android工作区是C:\Android\Projects\。在这个文件夹中,我喜欢将应用程序与库分开,我还有另外两个文件夹,C:\Android\Projects\applications和C:\Android\Projects\Components 对于一个项目,我已经将一个库从GitHub克隆到Components文件夹中,比如C:\Android\Projects\Compon

我需要一些帮助,找出组织我的Android项目的最佳方式(或最佳实践)。为了简单起见,假设我的Eclipse Android工作区是
C:\Android\Projects\
。在这个文件夹中,我喜欢将应用程序与库分开,我还有另外两个文件夹,
C:\Android\Projects\applications
C:\Android\Projects\Components

对于一个项目,我已经将一个库从GitHub克隆到
Components
文件夹中,比如
C:\Android\Projects\Componentes\SampleLib
(在该文件夹中有两个文件夹
TheLib
TheLibExample
)。我的应用程序被创建到
C:\Android\Projects\Applications\MyTestApp
。然后,我通过以下方式将库包含到应用程序中

现在让我们假设我想使用GitHub与开源社区共享我的应用程序。我将创建一个存储库,并将
C:\Android\Projects\Applications\MyTestApp
中的所有内容推送到某个存储库中

如果有人想使用我的应用程序,甚至想帮助我,它将需要库来编译和运行它,而我的项目本身并不包括这个库。
default.properties
文件将具有类似于
android.library.reference.1=../Components/SampleLib/TheLib
的内容,并且有人也需要手动克隆该库,并且需要将其放置在相同的相对路径中,否则会破坏我的应用程序的源代码控制

我能想到的解决这个问题的唯一方法是这样组织我的工作区:

C:\Android\Projects\Applications\MyTestApp\TheApp
C:\Android\Projects\Applications\MyTestApp\TheLib
C:\Android\Projects\Componentes\SampleLib
我的存储库应该由
C:\Android\Projects\Applications\MyTestApp\
中的内容填充

但是当库被更新时会发生什么呢?我不能简单地提取新的更改,我需要将它们复制到lib文件夹中。在以前的文件夹组织中,这是不需要的,因为我引用的是原始克隆存储库,而不是副本


那我该怎么办?我应该选择第一个选项,让我的项目中的任何人在他们认为合适的情况下处理库依赖关系,还是应该选择第二个选项,在原始文件夹从it存储库中提取更改时保持两个文件夹同步,从而为每个人提供更多的工作?

我个人认为Android的库项目是一个失败的设计。荒谬的是,我想引用/使用其他代码的唯一方法是获得另一个完整的项目,并在IDE配置级别设置所有内容。什么是图书馆?它应该是一个以归档格式编译和打包的可重用组件。根据他们的重要提示,我不认为有一个简单的解决办法,我们可以打破这种束缚,将图书馆作为一个真正的图书馆来管理。如果您的库不是如此androidized,那么尝试将编写/构建is作为一个普通的jar库,并使用maven管理jar库的构建/发布和项目依赖关系


嗯,谷歌称之为Android Library项目是合理的,而不是AndroidLibrary也许git子模块可以解决您的问题。

我个人认为git子模块并不能完全为库依赖提供一个非常易于使用且功能强大的系统

Git子树是更好的选择。我发现这解释了怎么做

基本上,您可以创建包含依赖项的子文件夹,并在该子文件夹中克隆存储库:

$ mkdir vendor
$ git remote add -f ABS https://github.com/JakeWharton/ActionBarSherlock
$ git merge -s ours --no-commit ABS/master
$ git read-tree --prefix=vendor/ABS/ -u ABS/master
$ git commit -m "Merged ABS into vendor/ABS/"
# Now another lib
$ git remote add -f Crouton https://github.com/keyboardsurfer/Crouton
$ git merge -s ours --no-commit Crouton/master
$ git read-tree --prefix=vendor/Crouton/ -u Crouton/master
$ git commit -m "Merged Crouton into vendor/Crouton/"
然后,在本例中,在
vendor/
中有两个repos/libs;您只需要将它们添加到IDE/构建系统中

Git分支和修改比使用子模块更简单、更直接


我甚至为一个LIB列表创建了一个自动化此过程的程序。

我同意您对另一个项目的整个设置。来自Windows/C#我在哪里可以引用.dll文件,而现在我无法在Android中做类似的事情。不过,你的回答并不能真正回答我的问题。图书馆不是我的,是别人的。老实说,我不知道Maven是什么,现在也懒得学点新东西。我知道这不是一个答案,我想把它作为一个注释添加进去,但是大小溢出了:p Android库项目和Java库之间有一个非常重要的区别,Java库中只有一个jar。区别在于库项目不仅仅是复制到主项目中。要保存光盘大小,只需将使用过的部分复制并编译到主项目中。在主项目中也可以轻松地更改资源,因为它们只是替换库中的内容。完美的白标签应用程序!如果您不喜欢,您仍然可以开发一个库并将其作为jar添加到您的项目中。请不要把苹果和香蕉作比较!使用这些有点混乱。我必须在将来更深入地挖掘,因为现在我只是让事情保持原样。但是我想子模块正是我想要的:)Git子模块非常混乱,在我看来对于你的案例来说太复杂了。从我所读到的内容来看,当您希望包含第三方库时,建议使用子模块,而您很少更新该库(仅当有其他版本时)。它们不能很好地与您自己的库配合使用,您会经常更新这些库。您可能想试试git子树:您是如何解决bitbucket的这个问题的?bitbucket未在项目中添加我的库