2015-01-30 17 views
5

Tôi cần phải thực thi mã của riêng mình (thông qua javaexec), sau khi dự án Android của tôi đã được biên soạn bởi gradle nhưng trước khi nó được đóng gói thành một apk (và trên thực tế , trước khi các tài nguyên được chuyển đến đích cuối cùng của chúng). Vì vậy, tôi đã sử dụng:Gradle Android Plugin: Hook vào nhiệm vụ sau khi biên dịch cho tất cả các hương vị sản phẩm

gradlew tasks --all 

Để nhận danh sách các tác vụ khả dụng. Tôi đang sử dụng hương vị sản phẩm, vì vậy hầu hết các nhiệm vụ có tên của một hương vị đâu đó ở giữa như:

assembleFlavorA

hoặc

installFlavorB

, vv ..

Tôi có thể làm gì ngay bây giờ, đang thực hiện tác vụ của riêng tôi trước khi bắt đầu biên dịch bằng cách móc vào nhiệm vụ preBuild:

preBuild <<{ 
    //Do some stuff 
} 

Ở trên được gọi cho mọi biến thể xây dựng chính xác như tôi muốn. Tuy nhiên khi tôi cố gắng cùng với lắp ráp nhiệm vụ hoặc xây dựng nhiệm vụ:

assemble <<{ 
    //Get's never executed 
} 

build <<{ 
    //Get's never executed 
} 

Đoạn mã trên là không bao giờ được thực thi, bất kể là sản phẩm hương vị Tôi đang xây dựng. Nhìn vào danh sách phụ thuộc cho releaseFlavorA:

myapp:assembleFlavorARelease - Assembles the Release build for flavor FlavorA [library:bundleRelease] 
    myapp:checkFlavorAReleaseManifest 
    myapp:compileFlavorAReleaseAidl 
    myapp:compileFlavorAReleaseJava 
    myapp:compileFlavorAReleaseNdk 
    myapp:compileFlavorAReleaseRenderscript 
    myapp:dexFlavorARelease 
    myapp:generateFlavorAReleaseAssets 
    myapp:generateFlavorAReleaseBuildConfig 
    myapp:generateFlavorAReleaseResValues 
    myapp:generateFlavorAReleaseResources 
    myapp:generateFlavorAReleaseSources 
    myapp:lintVitalFlavorARelease - Runs lint on just the fatal issues in the FlavorARelease build 
    myapp:mergeFlavorAReleaseAssets 
    myapp:mergeFlavorAReleaseResources 
    myapp:packageFlavorARelease 
    myapp:preFlavorADebugBuild 
    myapp:preFlavorAReleaseBuild 
    myapp:preAltdorfDebugBuild 
    myapp:preAltdorfReleaseBuild 
    myapp:preBerlinDebugBuild 
    myapp:preBerlinReleaseBuild 
    myapp:preBuild 
    myapp:prepareFlavorAReleaseDependencies 
    myapp:prepareComAndroidSupportAppcompatV71910Library - Prepare com.android.support:appcompat-v7:19.1.0 
    myapp:prepareTrunkGradleLibraryUnspecifiedLibrary - Prepare trunk-gradle:library:unspecified 
    myapp:processFlavorAReleaseJavaRes 
    myapp:processFlavorAReleaseManifest 
    myapp:processFlavorAReleaseResources 
    myapp:validateReleaseSigning 
    myapp:zipalignFlavorARelease 

tôi chỉ thấy prebuild nhưng không lắp ráp cũng không xây dựng, mà là số lẻ, vì nó hiển thị khi chạy

gradlew tasks 

Nhưng hầu hết các phương pháp trong danh sách trên là hương vị đặc biệt và tôi không muốn có cùng nhiệm vụ 20 lần, bởi vì tôi có 20 hương vị khác nhau ... Vậy làm thế nào tôi có thể thực hiện các nhiệm vụ cần thiết của mình, sau khi biên dịch xong, nhưng APK chưa được đóng gói cho tất cả hương vị? Một cái gì đó như:

//I know there is no task called "postCompile" - so anything post compiling and pre-packaging would be fine 
postCompile << { 
    //Do something that needs to be done for all flavors 
} 

EDIT Vì vậy, tôi kiểm tra lại sản lượng dòng lệnh khi xây dựng customerà ví dụ qua:

gradlew assembleCustomerARelease

C:\Users\user\workspace\android\trunk-gradle>gradlew assembleCustomerARelease 
:library:compileLint 
:library:copyReleaseLint UP-TO-DATE 
:library:mergeReleaseProguardFiles UP-TO-DATE 
:library:preBuild 
:library:preReleaseBuild 
:library:checkReleaseManifest 
:library:preDebugBuild 
:library:preDebugTestBuild 
:library:prepareComAndroidSupportAppcompatV71910Library UP-TO-DATE 
:library:prepareReleaseDependencies 
:library:compileReleaseAidl UP-TO-DATE 
:library:compileReleaseRenderscript UP-TO-DATE 
:library:generateReleaseBuildConfig UP-TO-DATE 
:library:generateReleaseAssets UP-TO-DATE 
:library:mergeReleaseAssets UP-TO-DATE 
:library:generateReleaseResValues UP-TO-DATE 
:library:generateReleaseResources UP-TO-DATE 
:library:mergeReleaseResources UP-TO-DATE 
:library:processReleaseManifest UP-TO-DATE 
:library:processReleaseResources UP-TO-DATE 
:library:generateReleaseSources UP-TO-DATE 
:library:compileReleaseJava UP-TO-DATE 
:library:processReleaseJavaRes UP-TO-DATE 
:library:packageReleaseJar UP-TO-DATE 
:library:compileReleaseNdk UP-TO-DATE 
:library:packageReleaseJniLibs UP-TO-DATE 
:library:packageReleaseLocalJar UP-TO-DATE 
:library:packageReleaseRenderscript UP-TO-DATE 
:library:packageReleaseResources UP-TO-DATE 
:library:bundleRelease UP-TO-DATE 
:myapp:preBuild 
Path to customer file: C:\Users\user\workspace\android\trunk-gradle\myapp\src\CustomerA\res\xml\customer.xml 
Selected server: release 
:myapp:preCustomerAReleaseBuild 
:myapp:checkCustomerAReleaseManifest 
:myapp:preCustomerADebugBuild 
:myapp:preCustomerBDebugBuild 
:myapp:preCustomerBReleaseBuild 
:myapp:preCustomerCDebugBuild 
:myapp:preCustomerCReleaseBuild 
:myapp:prepareComAndroidSupportAppcompatV71910Library UP-TO-DATE 
:myapp:prepareTrunkGradleLibraryUnspecifiedLibrary UP-TO-DATE 
:myapp:prepareCustomerAReleaseDependencies 
:myapp:compileCustomerAReleaseAidl UP-TO-DATE 
:myapp:compileCustomerAReleaseRenderscript UP-TO-DATE 
:myapp:generateCustomerAReleaseBuildConfig UP-TO-DATE 
:myapp:generateCustomerAReleaseAssets UP-TO-DATE 
:myapp:mergeCustomerAReleaseAssets UP-TO-DATE 
:myapp:generateCustomerAReleaseResValues UP-TO-DATE 
:myapp:generateCustomerAReleaseResources UP-TO-DATE 
:myapp:mergeCustomerAReleaseResources UP-TO-DATE 
:myapp:processCustomerAReleaseManifest UP-TO-DATE 
:myapp:processCustomerAReleaseResources UP-TO-DATE 
:myapp:generateCustomerAReleaseSources UP-TO-DATE 
:myapp:compileCustomerAReleaseJava UP-TO-DATE 
:myapp:lintVitalCustomerARelease 
//Some logoutput from the dex-ing task not really relevant in this case 
:myapp:dexCustomerARelease UP-TO-DATE 
:myapp:processCustomerAReleaseJavaRes UP-TO-DATE 
:myapp:validateReleaseSigning 
:myapp:packageCustomerARelease UP-TO-DATE 
:myapp:zipalignCustomerARelease UP-TO-DATE 
:myapp:assembleCustomerARelease 

BUILD SUCCESSFUL 

Total time: 25.451 secs 

Vì vậy, dựa trên trên xây dựng đầu ra, tôi giả định rằng preBuild thực sự xảy ra sau giai đoạn biên dịch? Vì nó được liệt kê sau compileReleaseJava và các tác vụ biên dịch khác. Nếu đây là trường hợp, sau đó "preBuild" sẽ đủ cho tôi yêu cầu.

CẬP NHẬT 04.02.2015

Câu hỏi đặt ra vẫn mở, nhưng tôi đã thay đổi mã của tôi để không còn phụ thuộc vào nó.Thay vì cố gắng sử dụng một lớp java sẽ phải được biên soạn bởi dự án của tôi trước, tôi đã tạo một dự án khác cho lớp đó, tạo ra tệp jar mà lần lượt tôi sử dụng - chi tiết có thể tìm thấy ở đây:

https://stackoverflow.com/a/28303047/1041533

Tuy nhiên - tôi nghĩ rằng vẫn có thể thú vị khi biết câu trả lời cho câu hỏi này.

+0

Tôi không chắc bạn muốn tác vụ này làm gì. Có điều gì đó như thế này giúp đỡ không? http://stackoverflow.com/questions/25997866/gradle-warning-variant-getoutputfile-and-variant-setoutputfile-are-deprecat Nó có liên quan đến việc cố gắng làm một cái gì đó cho mỗi APK khi nó được tạo ra, nhưng bạn có thể vẽ một số cảm hứng từ nó. –

+0

@ScottBarta Tôi đã vấp phải liên kết trên u được đề cập trước đó:). Nó rất hữu ích để đặt tên cho tập tin apk nhưng trong trường hợp này móc cần phải được sau khi biên dịch (mà tôi nghĩ rằng preBuild thực sự có thể được - mặc dù tên cho thấy nếu không? Xem Chỉnh sửa để biết chi tiết) nhưng trước khi toàn bộ điều được đóng gói vào một apk tập tin và afaik đoạn trích từ liên kết thực sự lặp lại trên đầu ra sau khi nó đã được đóng gói. – AgentKnopf

Trả lời

8

Bạn không thể kéo dài việc tập hợp và tạo các tác vụ như vậy bởi vì chúng được thay thế bằng các tác vụ liên quan đến biến thể xây dựng thích hợp ngay trước giai đoạn thực hiện của Gradle. Ví dụ: lắp ráp trở thành assembleRelease.

Bạn vẫn có thể tham gia vào quá trình tạo khi biểu đồ xây dựng đang được kết hợp với nhau. Nếu bạn muốn thực thi mã của riêng bạn ngay trước tác vụ gói, bạn có thể sử dụng đoạn mã này:

task doStuff << { 
    // Do stuff 
} 

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.contains('package')) { 
     theTask.dependsOn 'doStuff' 
    } 
} 

Mã này sẽ không phân biệt giữa các biến thể xây dựng; bạn có thể làm điều đó trong điều kiện if, nếu cần thiết.

+0

Cảm ơn vì điều này! –

Các vấn đề liên quan