2012-01-10 2 views
3

일련의 Android 프로젝트를 빌드하는 데 사용하는 마스터 빌드 파일이 있습니다. 이 안드로이드 프로젝트 각각은 동일한 안드로이드 라이브러리 프로젝트를 참조합니다. (CoreLibrary). 다음은 내 하위 작업입니다.마스터 ANT 빌드 파일을 통해 여러 android 프로젝트 빌드

<target name="build" description="Builds (only) all applications"> 
    <subant> 
     <target name="debug" /> 
     <fileset refid="all-applications" /> 
    </subant> 
</target> 

질문 : 내 subant 작업의 모든 응용 프로그램 파일 세트의 각 안드로이드 프로젝트에 대한 재 구축되는 CoreLibrary을 방지하기 위해 내가 할 수있는 일이 있습니까? 이것은 내가 할 수있는 일이 있기를 바라고 내 빌드 타임을 상당히 가속화 할 것입니다.

+0

지금 당장은 그렇게 생각하지 않습니다. 다음 주요 도구 릴리스는 라이브러리 프로젝트를 JAR로 배포하기위한 지원을 제공 할 수 있습니다. 이 경우 Ant 스크립트가 라이브러리 프로젝트를 빌드하고 다른 프로젝트가 직접 라이브러리 프로젝트가 아닌 JAR을 참조하도록 할 수 있습니다. 적어도 이론적으로는. – CommonsWare

+0

감사합니다. 나는 도서관의 반복적 인 건물 건설이 어떻게 든 여기서 도움이 될 수있는 새로운 건물 건설 과정을 기대했다. 즉, Lib A와 Lib B가 Lib C를 참조하고 있다면 Lib C는 Lib A와 B를 참조하는 프로젝트를 빌드 할 때 한 번만 빌드됩니다. 내가 활용할 수있는 방법을 찾아 낼 수 있다면 좋겠다고 생각했습니다. 이 문제가 있습니다. –

+0

@CommonsWare보고자하는 답변을 업데이트했습니다. 내가 할 수있는 한 잘 작동해야한다고 말할 수 있지만,'nodeps' 타겟이 SDK에 추가되었을 때 나는 확신하지 못한다. –

답변

6

사실 저는 최근에이 문제를 해결할 방법을 찾아 냈습니다. 기본 아이디어는 내 ANT 파일이 모든 라이브러리 프로젝트를 찾아서 먼저 빌드 한 다음 nodeps 대상으로 나머지 프로젝트를 빌드한다는 것입니다. 이렇게하면 CoreLibrary이 지속적으로 다시 컴파일되는 상황을 효과적으로 방지 할 수 있습니다. 실제로 그래서 나는 nodeps 대상으로 라이브러리를 구축 할 수있는 라이브러리 의존성 순서를 발견 작업을 쓴 경우

<?xml version="1.0" encoding="UTF-8"?> 
<project name="MasterBuild"> 

<!-- A property for the name of the file that contains 'android.library=true' (which is how we find library projects) --> 
<property name="library.setting.file.name" value="project.properties" /> 

<filelist id="normal-projects" dir="."> 
    <!-- You want to add your own projects here --> 
    <file name="./MyProject/build.xml" /> 
    <file name="./MyProject2/build.xml" /> 
    <file name="./MyProject3/build.xml" /> 
</filelist> 

<fileset id="all-libraries-properties" dir="."> 
    <include name="*/${library.setting.file.name}" /> 
    <contains casesensitive="true" text="android.library=true" /> 
</fileset> 

<pathconvert property="all-libraries" refid="all-libraries-properties"> 
    <globmapper from="*${library.setting.file.name}" to="*build.xml" /> 
</pathconvert>  

<target name="-set-debug-mode"> 
    <property name="build.target" value="debug" /> 
    <property name="install.target" value="installd" /> 
</target> 

<target name="-set-release-mode"> 
    <property name="build.target" value="release" /> 
    <property name="install.target" value="installr" /> 
</target> 

<target name="-build-dependencies" unless="built.dependencies"> 
    <property name="built.dependencies" value="true" /> 
    <subant buildpath="${all-libraries}" target="${build.target}" inheritall="false" /> 
</target> 

<target name="-build-normal-projects" depends="-build-dependencies"> 
    <subant inheritall="false"> 
     <target name="nodeps" /> 
     <target name="${build.target}" /> 
     <resources refid="normal-projects" /> 
    </subant> 
</target> 

<target name="-install-normal-projects"> 
    <subant inheritall="false"> 
     <target name="${install.target}" /> 
     <resources refid="normal-projects" /> 
    </subant> 
</target> 

<target name="debug" depends="-set-debug-mode, -build-normal-projects" description="Builds (only) a debug-key signed application" /> 
<target name="release" depends="-set-release-mode, -build-normal-projects" description="Builds (only) a release-key signed application" /> 

<target name="installd" depends="-set-debug-mode, -install-normal-projects" description="Installs (only) a debug-key signed application" /> 
<target name="installr" depends="-set-release-mode, -install-normal-projects" description="Installs (only) a release-key signed application" /> 

</project> 

이 솔루션을 향상시킬 수있다. 또한, "정상적인 프로젝트"를 자동으로 탐지하는 방법이있을 수 있지만 아직 필요하지 않습니다. 마지막으로, 나는 정상적인 ANT 파일에서 꽤 많은 것들을 풀어 여기에 가져 왔으므로 아무 것도 놓치지 않았다. 그러나 개념은 존재합니다.

0

라이브러리 프로젝트가 java 전용 (리소스 없음) 인 경우이를 모두 jar로 배포 할 수 있으며 빌드 파일의 종속성 해결을 위해 ivy + ivy ant 태스크로 depublencies를 관리 할 수 ​​있습니다. 하지만 그들은 여전히 ​​클래스에서 덱스 파일로 빌드 될 것입니다.

1

Android Maven 플러그인을 사용하는 경우 각 부품을 개별적으로 또는 모듈로 모두 빌드하고 코어 라이브러리를 jar 또는 apklib (리소스가있는 경우)로 다시 사용할 수 있습니다. Maven의 빌트인 의존성 메커니즘은 다른 라이브러리를 통합하는 것을 처리 할 것이다.

RoboGuice 또는 ActionBarSherlock 및 예제 앱을 사용하여 작동 방식을 확인할 수 있습니다.

또한 리포지토리 관리자를 사용하여 거기에 라이브러리를 배포하면 모든 팀 구성원이 여기에서 라이브러리를 가져올 수 있습니다. CI 서버에서 빌드하십시오.

+0

이 플러그인이 실제로 무대 뒤에서 무엇을하는지 압니까? 현재 우리 팀은 Maven을 사용하지 않지만, 그들이 내 대답과 비슷한 것을하고 있다고 생각합니다. –

+0

예 알아요. 나는 그것에 대해 핵심 기여자, 저자 및 발표자입니다. 의존성 관리를 사용하여 저장소에서 아티팩트를 가져오고 배포 할 수 있습니다. 또한 프로젝트를 그룹으로 묶는 일등급 지원을 제공합니다. Google 코드에서 웹 사이트를보십시오. Android SDK는 Xavier에 따라 향후 버전 중 하나에서이 줄을 따라 뭔가를 얻을 것입니다. –

+0

나는 본다. Maven은 모든 것을 함께 컴파일하기 위해 완전히 사용자 정의 빌드 시스템을 사용합니까? 즉, 원시 실행 가능 도구를 사용하고 ANT/eclipse 대신 모든 방법으로 빌드합니까? 그렇다면 특정 프로젝트를 사용자 지정 방식으로 구축해야하기 때문에 문제가 될 수 있습니다. 어쨌든, 기회가 생기면 당신의 플러그인이 할 수있는 것을 보게 될 것입니다. –