版本:
Android Studio 2.2.3
Gradle 3.2.1
Java 1.8.0_31
compileSdkVersion 25
buildToolsVersion 25.0.2
使用Java 8需要用到Jack工具链
因此在module中的build.gradle增加了如下配置:
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Sync之后就能在代码中看到提示了
但是改用Jack进行编译之后打包就遇到了问题,debug包正常,而release包就会出现下面的报错
Information:Gradle tasks [:pub:assembleRelease]
Error:com.android.jack.IllegalOptionsException: Error while parsing 'C:\..\pub\proguard-rules.pro':56
Error:com.android.jack.antlr.runtime.RecognitionException
Error:Execution failed for task ':pub:transformJackWithJackForRelease'.
> com.android.build.api.transform.TransformException: com.android.jack.api.v01.ConfigurationException: Error while parsing 'C:\..\pub\proguard-rules.pro':56
Information:BUILD FAILED
根据提示在proguard-rules.pro中找到问题出在这里
#忽略警告
-ignorewarning
在看过Compiling with Jack之后了解到改用Jack之后proguard-rules.pro需作修改
把不支持的选项删掉之后再打包,出现了另一个报错
Information:Gradle tasks [:pub:assembleRelease]
Error:Execution failed for task ':pub:transformJackWithJackForRelease'.
> com.android.sched.scheduler.PlanError: 'SeedPrinter' need [OriginalNames, SeedMarker] but does not have [OriginalNames] in plan [JDefinedClassOrInterfaceAdapter: [OriginDigestAdder], PreProcessorApplier, MethodIdMerger, Remover, JDefinedClassOrInterfaceAdapter: [MethodIdDuplicateRemover], JDefinedClassOrInterfaceAdapter: [TypeGenericSignatureSplitter, TypeStringLiteralRefiner, SimpleNameRefiner, JMethodAdapter: [MethodGenericSignatureSplitter, ReflectionStringLiteralRefiner, MethodStringLiteralRefiner], JFieldAdapter: [FieldGenericSignatureSplitter, FieldStringLiteralRefiner]], JDefinedClassOrInterfaceAdapter: [JFieldAdapter: [FieldInitializerRemover, FieldContainerAnnotationMarkerAdder]], JDefinedClassOrInterfaceAdapter: [UsedEnumFieldCollector], JDefinedClassOrInterfaceAdapter: [VisibilityBridgeAdder, JMethodAdapter: [TryWithResourcesTransformer]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [ImplicitBlocks, IncDecRemover, CompoundAssignmentRemover, ConcatRemover]], JDefinedClassOrInterfaceAdapter: [InnerAccessorGenerator], JDefinedClassOrInterfaceAdapter: [InnerAccessorAdder, JMethodAdapter: [FlowNormalizer, MethodContainerAnnotationMarkerAdder, SwitchStringSupport], JMethodAdapter: [FieldInitMethodCallRemover], FieldInitMethodRemover], JDefinedClassOrInterfaceAdapter: [SeedFinder, MultiDexAnnotationsFinder, RuntimeAnnotationFinder, AnnotatedFinder], JPackageAdapter: [SubClassOrInterfaceFinder], JDefinedClassOrInterfaceAdapter: [ShrinkAndMainDexTracer], JDefinedClassOrInterfaceAdapter: [TypeShrinker, JMethodAdapter: [MethodShrinker], JFieldAdapter: [FieldShrinker]], JDefinedClassOrInterfaceAdapter: [MainDexCollector], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [SwitchEnumSupport], UsedEnumFieldMarkerRemover, TypeContainerAnnotationMarkerAdder], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [EnumMappingMarkerRemover]], JPackageAdapter: [NameKeeper], ResourceRefiner, ResourceContentRefiner, Renamer, SourceFileRemover, JDefinedClassOrInterfaceAdapter: [TypeAnnotationRemover, LineNumberRemover, JFieldAdapter: [FieldAnnotationRemover], JMethodAdapter: [MethodAnnotationRemover, ParameterAnnotationRemover, LocalVariableGenericSignatureRemover, ThrownExceptionRemover, ParameterNameRemover, LocalVariableAndThisNameRemover]], JDefinedClassOrInterfaceAdapter: [JayceInLibraryWriterAll], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [DefaultBridgeInLambdaAdder]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [BridgeInInterfaceRemover]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [AndroidCompatibilityChecker]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [LambdaCollector]], LambdaGroupClassCreator, JDefinedClassOrInterfaceAdapter: [LambdaGroupClassFinalizer], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [LambdaConverter]], JDefinedClassOrInterfaceAdapter: [TypeDependenciesCollector, FileDependenciesCollector], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [DynamicAssertionTransformer, NotSimplifier]], JDefinedClassOrInterfaceAdapter: [JFieldAdapter: [FieldInitializer], JMethodAdapter: [ConditionalAndOrRemover, BooleanTestTransformer, SplitNewInstance, MultiDimensionNewArrayRemover, InitInNewArrayRemover, PrimitiveClassTransformer, SynchronizeTransformer, NestedAssignRemover, IntersectionTypeRemover, UselessCaseRemover, UselessSwitchesRemover, TypeLegalizer, RopCastLegalizer, FinallyRemover, ExceptionRuntimeValueAdder, DefinitionMarkerAdder, ThreeAddressCodeBuilder, UselessCastRemover, DefinitionMarkerRemover, TryCatchRemover, ExpressionStatementLegalizer, EmptyClinitRemover]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [DalvikProtectedInnerChecker]], TypeDependenciesInLibraryWriter, FileDependenciesInLibraryWriter, LibraryDependenciesInLibraryWriter, SeedPrinter, MappingPrinter, JDefinedClassOrInterfaceAdapter: [ReflectAnnotationsAdder, JMethodAdapter: [DefaultValueAnnotationAdder]], JDefinedClassOrInterfaceAdapter: [ClassDefItemBuilder, TypeContainerAnnotationAdder, ClassAnnotationBuilder], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [RefAsStatementRemover, CfgBuilder, DefinitionMarkerAdder, ReachingDefinitions, UsedVariableAdder, DefUsesAndUseDefsChainComputation, ConstantRefinerAndVariableRemover, UseDefsChainsSimplifier, DefUsesChainsSimplifier, UnusedDefinitionRemover, RefAsStatementRemover, CfgMarkerRemover, CfgBuilder, IfWithConstantSimplifier, UnusedLocalRemover, DefUsesAndUseDefsChainRemover, DefinitionMarkerRemover, UsedVariableRemover, ExpressionSimplifier, UselessIfRemover, CfgMarkerRemover, CfgBuilder]], JDefinedClassOrInterfaceAdapter: [JMethodAdapter: [CodeItemBuilder, CfgMarkerRemover, EncodedMethodBuilder, MethodContainerAnnotationAdder, MethodAnnotationBuilder, MethodBodyRemover]], JDefinedClassOrInterfaceAdapter: [JFieldAdapter: [FieldContainerAnnotationAdder, EncodedFieldBuilder, FieldAnnotationBuilder]], JDefinedClassOrInterfaceAdapter: [DexInLibraryWriterAll], Aborter, DexFileWriter, ResourceWriter, LibraryResourceWriter, LibraryMetaWriter]
Information:BUILD FAILED
这下除了知道是transformJackWithJackForRelease这个task出了问题,其他啥都看不懂了,懵了。
放弃混淆就能成功打包,但还是想把代码作混淆处理,所以继续。
感觉问题还是出在proguard-rules.pro中,于是把里面的一项项删除打包删除打包,终于在删除下面这两项之后成功了。
#未混淆的类和成员
-printseeds seeds.txt
#混淆前后的映射
-printmapping mapping.txt
另外现在的Android Studio已经不需要下面这个配置
shrinkResources true
添加了反而会报如下错误
Information:Gradle tasks [:pub:assembleRelease]
Error:A problem was found with the configuration of task ':pub:packageRelease'.
> File 'C:\..\pub\build\intermediates\res\resources-release-stripped.ap_' specified for property 'resourceFile' does not exist.
Information:BUILD FAILED
好了,收工!