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.
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ó. –
@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