Skip to content

Commit

Permalink
bug fixed: update splits maybe occur exception under incremental build.
Browse files Browse the repository at this point in the history
  • Loading branch information
kissonchan committed Dec 25, 2019
1 parent 30bba52 commit 6bf8aa9
Show file tree
Hide file tree
Showing 12 changed files with 182 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.iqiyi.qigsaw.buildtool.gradle.compiling.DexReMergeHandler
import com.iqiyi.qigsaw.buildtool.gradle.compiling.FixedMainDexList
import com.iqiyi.qigsaw.buildtool.gradle.compiling.SplitContentProviderProcessor
import com.iqiyi.qigsaw.buildtool.gradle.extension.QigsawSplitExtension
import com.iqiyi.qigsaw.buildtool.gradle.extension.QigsawSplitExtensionHelper
import com.iqiyi.qigsaw.buildtool.gradle.internal.tool.AGPCompat
import com.iqiyi.qigsaw.buildtool.gradle.task.*
import com.iqiyi.qigsaw.buildtool.gradle.transform.ComponentInfoTransform
Expand Down Expand Up @@ -109,15 +110,17 @@ class QigsawAppBasePlugin extends QigsawPlugin {
generateQigsawConfigTask.setApplicationId(applicationId)
generateQigsawConfigTask.setSourceOutputDir(variant.variantData.scope.buildConfigSourceOutputDir)
String qigsawId = getQigsawId(project, versionName)
String splitInfoVersion = versionName + "_" + project.extensions.qigsawSplit.splitInfoVersion
String splitInfoVersion = versionName + "_" + QigsawSplitExtensionHelper.getSplitInfoVersion(project)
generateQigsawConfigTask.initArgs(hasQigsawTask, qigsawId, versionName, splitInfoVersion, dfNames)
generateBuildConfigTask.finalizedBy generateQigsawConfigTask
generateBuildConfigTask.dependsOn processManifestTask

QigsawAssembleTask qigsawAssembleTask = project.tasks.create("qigsawAssemble${variantName}", QigsawAssembleTask)
qigsawAssembleTask.outputDir = project.mkdir(QIGSAW_INTERMEDIATES + "split_info" + File.separator + variantName.uncapitalize())

qigsawAssembleTask.initArgs(
qigsawId,
splitInfoVersion,
variantName,
variant.flavorName,
versionName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,9 @@ class SplitApkProcessorImpl implements SplitApkProcessor {
int minApiLevel,
List<String> dfDependencies,
File splitManifest,
File splitSignedApk) {
File splitSignedApk,
boolean releaseSplitApk,
List<String> restrictWorkProcessesForSplits) {
SplitInfoCreator infoCreator = new SplitInfoCreatorImpl(
baseProject,
variantName,
Expand All @@ -102,7 +104,9 @@ class SplitApkProcessorImpl implements SplitApkProcessor {
minApiLevel,
dfDependencies,
splitSignedApk,
splitManifest
splitManifest,
releaseSplitApk,
restrictWorkProcessesForSplits
)
SplitInfo splitInfo = infoCreator.create()
return splitInfo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ class SplitInfoCreatorImpl implements SplitInfoCreator {

final List<String> dfDependencies

final boolean releaseSplitApk

final List<String> restrictWorkProcessesForSplits

SplitInfoCreatorImpl(Project appProject,
String variantName,
String splitName,
Expand All @@ -61,7 +65,9 @@ class SplitInfoCreatorImpl implements SplitInfoCreator {
int minApiLevel,
List<String> dfDependencies,
File splitApk,
File splitManifestFile) {
File splitManifestFile,
boolean releaseSplitApk,
List<String> restrictWorkProcessesForSplits) {
this.appProject = appProject
this.variantName = variantName
this.splitName = splitName
Expand All @@ -71,6 +77,8 @@ class SplitInfoCreatorImpl implements SplitInfoCreator {
this.dfDependencies = dfDependencies
this.splitApk = splitApk
this.splitManifestFile = splitManifestFile
this.releaseSplitApk = releaseSplitApk
this.restrictWorkProcessesForSplits = restrictWorkProcessesForSplits
}

@Override
Expand All @@ -85,7 +93,6 @@ class SplitInfoCreatorImpl implements SplitInfoCreator {
)
splitInfo.dependencies = dfDependencies.isEmpty() ? null : dfDependencies
ManifestReader manifestReader = new ManifestReaderImpl(splitManifestFile)
boolean releaseSplitApk = appProject.extensions.qigsawSplit.releaseSplitApk
splitInfo.builtIn = !manifestReader.readOnDemand() || !releaseSplitApk
List<String> processes = new ArrayList<>()
Set<ComponentInfo> activities = manifestReader.readActivities()
Expand All @@ -112,9 +119,7 @@ class SplitInfoCreatorImpl implements SplitInfoCreator {
processes.add(it.process)
}
}
List<String> restrictWorkProcessesForSplits = appProject.extensions.qigsawSplit.restrictWorkProcessesForSplits

if (restrictWorkProcessesForSplits != null && !restrictWorkProcessesForSplits.empty) {
if (!restrictWorkProcessesForSplits.empty) {
if (restrictWorkProcessesForSplits.contains(splitName)) {
splitInfo.workProcesses = processes.isEmpty() ? null : processes
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,64 +25,63 @@
package com.iqiyi.qigsaw.buildtool.gradle.compiling

import com.android.SdkConstants
import com.android.build.gradle.api.ApplicationVariant
import com.google.gson.Gson
import com.iqiyi.qigsaw.buildtool.gradle.internal.entity.SplitDetails
import com.iqiyi.qigsaw.buildtool.gradle.internal.model.SplitJsonFileCreator
import com.iqiyi.qigsaw.buildtool.gradle.internal.entity.SplitInfo
import com.iqiyi.qigsaw.buildtool.gradle.internal.tool.AGPCompat
import com.iqiyi.qigsaw.buildtool.gradle.internal.tool.FileUtils
import com.iqiyi.qigsaw.buildtool.gradle.task.AppliedSplitJsonFileGetter
import com.iqiyi.qigsaw.buildtool.gradle.upload.SplitApkUploader
import com.iqiyi.qigsaw.buildtool.gradle.upload.SplitApkUploaderInstance
import org.gradle.api.Project
import org.gradle.api.Task

class SplitDetailsCreatorImpl implements SplitJsonFileCreator {
class SplitJsonFileCreatorImpl implements SplitJsonFileCreator {

final static String JSON_SUFFIX = SdkConstants.DOT_JSON

Project appProject
final static String QIGSAWPREFIX = "qigsaw_"

String appVersionName
final String qigsawId

String splitDetailsFilePrefix
final String appVersionName

File outputDir
final String splitInfoVersion

String qigsawId
final String oldApkPath

Set<String> abiFilters
final Project appProject

boolean copyToAssets
final File outputDir

SplitDetailsCreatorImpl(String qigsawId,
String appVersionName,
boolean copyToAssets,
Project appProject,
File outputDir,
Set<String> abiFilters) {
final Set<String> abiFilters

final boolean copyToAssets

SplitJsonFileCreatorImpl(String qigsawId,
String appVersionName,
String splitInfoVersion,
String oldApkPath,
boolean copyToAssets,
Project appProject,
File outputDir,
Set<String> abiFilters) {
this.qigsawId = qigsawId
this.appVersionName = appVersionName
this.splitInfoVersion = splitInfoVersion
this.oldApkPath = oldApkPath
this.copyToAssets = copyToAssets
this.appProject = appProject
this.outputDir = outputDir
this.appVersionName = appVersionName
this.splitDetailsFilePrefix = "qigsaw_" + appVersionName + "_"
this.abiFilters = abiFilters
}

@Override
File createSplitDetailsJsonFile(List<SplitInfo> splits) {
AppliedSplitJsonFileGetter fileGetter = new AppliedSplitJsonFileGetter(appProject, splitDetailsFilePrefix)
File splitInfoJsonFromTinker = fileGetter.getSplitJsonFileFromTinkerOldApk()
if (splitInfoJsonFromTinker != null) {
return createAppliedSplitInfoJsonFile(splitInfoJsonFromTinker, splits)
}
File splitInfoJsonFromQigsaw = fileGetter.getSplitJsonFileFromQigsawOldApk()
if (splitInfoJsonFromQigsaw != null) {
return createAppliedSplitInfoJsonFile(splitInfoJsonFromQigsaw, splits)
File createSplitJsonFile(List<SplitInfo> splits) {
AppliedSplitJsonFileGetter fileGetter = new AppliedSplitJsonFileGetter(oldApkPath, QIGSAWPREFIX + appVersionName)
File splitInfoJsonFromOldApk = fileGetter.getSplitJsonFileFromOldApk()
if (splitInfoJsonFromOldApk != null) {
return createAppliedSplitInfoJsonFile(splitInfoJsonFromOldApk, splits)
}

for (SplitInfo info : splits) {
uploadSplitAPKIfNeed(info)
}
Expand All @@ -107,8 +106,7 @@ class SplitDetailsCreatorImpl implements SplitJsonFileCreator {
if (!outputDir.exists()) {
outputDir.mkdirs()
}
String splitInfoVersion = appProject.extensions.qigsawSplit.splitInfoVersion
String fileName = splitDetailsFilePrefix + splitInfoVersion + JSON_SUFFIX
String fileName = QIGSAWPREFIX + splitInfoVersion + JSON_SUFFIX
File splitDetailsFile = new File(outputDir, fileName)
if (splitDetailsFile.exists()) {
splitDetailsFile.delete()
Expand Down Expand Up @@ -192,13 +190,10 @@ class SplitDetailsCreatorImpl implements SplitJsonFileCreator {
for (SplitInfo appliedInfo : appliedSplitDetails.splits) {
if (info.splitName.equals(appliedInfo.splitName)) {
if (info.version.equals(appliedInfo.version)) {
if (info.md5.equals(appliedInfo.md5)) {
info.url = appliedInfo.url
} else {
uploadSplitAPKIfNeed(info)
appProject.logger.error(String.format("Split %s md5 has been changed, but version is not changed!!!!", info.splitName))
}
appProject.logger.error("Built-in split ${info.splitName} version ${info.version} is not changed, using old splitInfo ${appliedInfo.toString()}!")
info.copySplitInfo(appliedInfo)
} else {
appProject.logger.error("Split ${info.splitName} version ${info.version} is changed, it need to be updated!")
info.builtIn = false
updateSplits.add(info.splitName)
uploadSplitAPKIfNeed(info)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,17 @@ class QigsawSplitExtension {

final static String DEFAULT_SPLIT_INFO_VERSION = "1.0.0"

final static String EMPTY = ""

/**
* Specifies the last old apk's mapping file for proguard to applymapping
*/
String applyMapping
String applyMapping = EMPTY

/**
* the old apk path
*/
String oldApk
String oldApk = EMPTY

/**
* Specifies the version of json file of split-info, default value is 1.0.0
Expand All @@ -52,7 +54,7 @@ class QigsawSplitExtension {
* Restrict splits working process, if you do not assign split name, this split will work on
* all processes, otherwise only work processes declared in its manifest.
*/
List<String> restrictWorkProcessesForSplits
List<String> restrictWorkProcessesForSplits = Collections.emptyList()

@Override
String toString() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.iqiyi.qigsaw.buildtool.gradle.extension

import org.gradle.api.Project

class QigsawSplitExtensionHelper {

static String getSplitInfoVersion(Project project) {
try {
return project.extensions.qigsawSplit.splitInfoVersion
} catch (Throwable e) {
return QigsawSplitExtension.DEFAULT_SPLIT_INFO_VERSION
}
}

static String getOldApk(Project project) {
try {
String oldApk = project.extensions.tinkerPatch.oldApk
if (oldApk != null && new File(oldApk).exists()) {
return oldApk
}
} catch (Throwable ignored) {

}
try {
return project.extensions.qigsawSplit.oldApk
} catch (Throwable ignored) {
return QigsawSplitExtension.EMPTY
}
}

static boolean getReleaseSplitApk(Project project) {
try {
return project.extensions.qigsawSplit.releaseSplitApk
} catch (Throwable ignored) {
return false
}
}

static List<String> getRestrictWorkProcessesForSplits(Project project) {
try {
return project.extensions.qigsawSplit.restrictWorkProcessesForSplits
} catch (Throwable ignored) {
return Collections.emptyList()
}
}

static String getApplyMapping(Project project) {
try {
return project.extensions.qigsawSplit.applyMapping
} catch (Throwable ignored) {
return QigsawSplitExtension.EMPTY
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ package com.iqiyi.qigsaw.buildtool.gradle.internal.entity;

class SplitInfo {


SplitInfo(String splitName,
File splitApk,
String md5,
Expand All @@ -40,12 +39,28 @@ class SplitInfo {
this.version = version
}

void copySplitInfo(SplitInfo origin) {
this.splitName = origin.splitName
this.url = origin.url
this.builtIn = origin.builtIn
this.size = origin.size
this.applicationName = origin.applicationName
this.version = origin.version
this.md5 = origin.md5
this.workProcesses = origin.workProcesses
this.minSdkVersion = origin.minSdkVersion
this.dexNumber = origin.dexNumber
this.nativeLibraries = origin.nativeLibraries
this.dependencies = origin.dependencies
this.abiFilters = origin.abiFilters
}

final transient File splitApk

/**
* The name of split apk
*/
final String splitName
String splitName

/**
* Download link of split apk
Expand All @@ -60,7 +75,7 @@ class SplitInfo {
/**
* size of split apk file
*/
final long size
long size

/**
* application name in split AndroidManifest.xml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ interface SplitApkProcessor {
int minApiLevel,
List<String> dfDependencies,
File splitManifest,
File splitSignedApk)
File splitSignedApk,
boolean releaseSplitApk,
List<String> restrictWorkProcessesForSplits)

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,5 @@ import com.iqiyi.qigsaw.buildtool.gradle.internal.entity.SplitInfo

interface SplitJsonFileCreator {

File createSplitDetailsJsonFile(List<SplitInfo> splits)
File createSplitJsonFile(List<SplitInfo> splits)
}
Loading

0 comments on commit 6bf8aa9

Please sign in to comment.