Showing preview only (4,890K chars total). Download the full file or copy to clipboard to get everything.
Repository: open-obfuscator/dProtect
Branch: main
Commit: 25173cc11644
Files: 690
Total size: 4.5 MB
Directory structure:
gitextract_i4svht9p/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── scripts/
│ │ └── s3-deploy.py
│ └── workflows/
│ ├── continuous_integration.yml
│ └── main.yml
├── .gitignore
├── .hgignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── annotations/
│ ├── annotations.pro
│ ├── build.gradle
│ └── src/
│ └── proguard/
│ └── annotation/
│ ├── Keep.java
│ ├── KeepApplication.java
│ ├── KeepClassMemberNames.java
│ ├── KeepClassMembers.java
│ ├── KeepGettersSetters.java
│ ├── KeepImplementations.java
│ ├── KeepName.java
│ ├── KeepPublicClassMemberNames.java
│ ├── KeepPublicClassMembers.java
│ ├── KeepPublicGettersSetters.java
│ ├── KeepPublicImplementations.java
│ ├── KeepPublicProtectedClassMemberNames.java
│ └── KeepPublicProtectedClassMembers.java
├── ant/
│ ├── build.gradle
│ └── src/
│ └── proguard/
│ └── ant/
│ ├── ClassPathElement.java
│ ├── ClassSpecificationElement.java
│ ├── ConfigurationElement.java
│ ├── ConfigurationTask.java
│ ├── FilterElement.java
│ ├── KeepSpecificationElement.java
│ ├── MemberSpecificationElement.java
│ ├── ProGuardTask.java
│ ├── package.html
│ └── task.properties
├── base/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── dprotect/
│ │ │ │ ├── ArithmeticObfuscationClassSpecification.java
│ │ │ │ ├── CFObfuscationClassSpecification.java
│ │ │ │ ├── ClassObfuSpecVisitorFactory.java
│ │ │ │ ├── Configuration.java
│ │ │ │ ├── ConfigurationConstants.java
│ │ │ │ ├── ConfigurationParser.java
│ │ │ │ ├── ConstantObfuscationClassSpecification.java
│ │ │ │ ├── DProtect.java
│ │ │ │ ├── ObfuscationClassSpecification.java
│ │ │ │ ├── deobfuscation/
│ │ │ │ │ ├── Deobfuscator.java
│ │ │ │ │ └── strings/
│ │ │ │ │ └── XoredStrings.java
│ │ │ │ ├── obfuscation/
│ │ │ │ │ ├── CodeObfuscator.java
│ │ │ │ │ ├── Marker.java
│ │ │ │ │ ├── arithmetic/
│ │ │ │ │ │ ├── ArithmeticObfuscationFilter.java
│ │ │ │ │ │ ├── ArithmeticObfuscationInfo.java
│ │ │ │ │ │ ├── ArithmeticObfuscationMarker.java
│ │ │ │ │ │ ├── MBANormalizer.java
│ │ │ │ │ │ ├── MBAObfuscationAdd.java
│ │ │ │ │ │ ├── MBAObfuscationAnd.java
│ │ │ │ │ │ ├── MBAObfuscationOr.java
│ │ │ │ │ │ ├── MBAObfuscationSub.java
│ │ │ │ │ │ └── MBAObfuscationXor.java
│ │ │ │ │ ├── constants/
│ │ │ │ │ │ ├── ConstantFieldMarker.java
│ │ │ │ │ │ ├── ConstantObfuscationInfo.java
│ │ │ │ │ │ ├── ConstantObfuscationMarker.java
│ │ │ │ │ │ └── ConstantsObfuscator.java
│ │ │ │ │ ├── controlflow/
│ │ │ │ │ │ ├── ControlFlowObfuscation.java
│ │ │ │ │ │ ├── ControlFlowObfuscationInfo.java
│ │ │ │ │ │ └── ControlFlowObfuscationMarker.java
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── ObfuscationInfo.java
│ │ │ │ │ │ └── ObfuscationInfoSetter.java
│ │ │ │ │ └── strings/
│ │ │ │ │ ├── StringFieldMarker.java
│ │ │ │ │ ├── StringObfuscationMarker.java
│ │ │ │ │ └── StringObfuscator.java
│ │ │ │ └── runtime/
│ │ │ │ ├── strings/
│ │ │ │ │ └── StringEncoding.java
│ │ │ │ └── util/
│ │ │ │ ├── Helpers.java
│ │ │ │ └── Loader.java
│ │ │ └── proguard/
│ │ │ ├── AfterInitConfigurationVerifier.java
│ │ │ ├── AppView.java
│ │ │ ├── ArgumentWordReader.java
│ │ │ ├── AssumeNoSideEffectsChecker.java
│ │ │ ├── ClassMemberChecker.java
│ │ │ ├── ClassPath.java
│ │ │ ├── ClassPathEntry.java
│ │ │ ├── ClassSpecification.java
│ │ │ ├── ClassSpecificationVisitorFactory.java
│ │ │ ├── Configuration.java
│ │ │ ├── ConfigurationConstants.java
│ │ │ ├── ConfigurationParser.java
│ │ │ ├── ConfigurationVerifier.java
│ │ │ ├── ConfigurationWriter.java
│ │ │ ├── DataEntryReaderFactory.java
│ │ │ ├── DataEntryWriterFactory.java
│ │ │ ├── DescriptorKeepChecker.java
│ │ │ ├── Dumper.java
│ │ │ ├── DuplicateClassPrinter.java
│ │ │ ├── DuplicateResourceFilePrinter.java
│ │ │ ├── FileWordReader.java
│ │ │ ├── FullyQualifiedClassNameChecker.java
│ │ │ ├── GPL.java
│ │ │ ├── GetAnnotationChecker.java
│ │ │ ├── GetEnclosingClassChecker.java
│ │ │ ├── GetEnclosingMethodChecker.java
│ │ │ ├── GetSignatureChecker.java
│ │ │ ├── Initializer.java
│ │ │ ├── InputReader.java
│ │ │ ├── KeepClassMemberChecker.java
│ │ │ ├── KeepClassSpecification.java
│ │ │ ├── KeepClassSpecificationVisitorFactory.java
│ │ │ ├── KotlinMetadataAdapter.java
│ │ │ ├── LibraryKeepChecker.java
│ │ │ ├── LineWordReader.java
│ │ │ ├── MemberSpecification.java
│ │ │ ├── MemberValueSpecification.java
│ │ │ ├── OutputWriter.java
│ │ │ ├── ParseException.java
│ │ │ ├── ProGuard.java
│ │ │ ├── SeedPrinter.java
│ │ │ ├── SubclassedClassFilter.java
│ │ │ ├── Targeter.java
│ │ │ ├── UpToDateChecker.java
│ │ │ ├── WordReader.java
│ │ │ ├── backport/
│ │ │ │ ├── AbstractAPIConverter.java
│ │ │ │ ├── Backporter.java
│ │ │ │ ├── DefaultInterfaceMethodConverter.java
│ │ │ │ ├── JSR310Converter.java
│ │ │ │ ├── LambdaExpression.java
│ │ │ │ ├── LambdaExpressionCollector.java
│ │ │ │ ├── LambdaExpressionConverter.java
│ │ │ │ ├── StaticInterfaceMethodConverter.java
│ │ │ │ ├── StreamSupportConverter.java
│ │ │ │ └── StringConcatenationConverter.java
│ │ │ ├── classfile/
│ │ │ │ ├── ClassMemberPair.java
│ │ │ │ ├── pass/
│ │ │ │ │ └── PrimitiveArrayConstantIntroducer.java
│ │ │ │ └── visitor/
│ │ │ │ └── InjectedClassFilter.java
│ │ │ ├── configuration/
│ │ │ │ ├── ConfigurationLogger.java
│ │ │ │ ├── ConfigurationLoggingAdder.java
│ │ │ │ ├── ConfigurationLoggingInstructionSequenceConstants.java
│ │ │ │ ├── ConfigurationLoggingInstructionSequenceReplacer.java
│ │ │ │ ├── ConfigurationLoggingInstructionSequencesReplacer.java
│ │ │ │ └── InitialStateInfo.java
│ │ │ ├── evaluation/
│ │ │ │ └── AssumeClassSpecificationVisitorFactory.java
│ │ │ ├── fixer/
│ │ │ │ └── kotlin/
│ │ │ │ ├── KotlinAnnotationCounter.java
│ │ │ │ └── KotlinAnnotationFlagFixer.java
│ │ │ ├── io/
│ │ │ │ ├── ClassMapDataEntryReplacer.java
│ │ │ │ ├── ExtraDataEntryNameMap.java
│ │ │ │ ├── ExtraDataEntryReader.java
│ │ │ │ ├── KotlinModuleRewriter.java
│ │ │ │ └── UniqueDataEntryWriter.java
│ │ │ ├── logging/
│ │ │ │ └── Logging.java
│ │ │ ├── mark/
│ │ │ │ └── Marker.java
│ │ │ ├── obfuscate/
│ │ │ │ ├── AttributeShrinker.java
│ │ │ │ ├── AttributeUsageMarker.java
│ │ │ │ ├── ClassNameAdapterFunction.java
│ │ │ │ ├── ClassObfuscator.java
│ │ │ │ ├── ClassRenamer.java
│ │ │ │ ├── DictionaryNameFactory.java
│ │ │ │ ├── MapCleaner.java
│ │ │ │ ├── MappingKeeper.java
│ │ │ │ ├── MappingPrinter.java
│ │ │ │ ├── MappingProcessor.java
│ │ │ │ ├── MappingReader.java
│ │ │ │ ├── MemberNameCleaner.java
│ │ │ │ ├── MemberNameCollector.java
│ │ │ │ ├── MemberNameConflictFixer.java
│ │ │ │ ├── MemberObfuscator.java
│ │ │ │ ├── MemberSpecialNameFilter.java
│ │ │ │ ├── MultiMappingProcessor.java
│ │ │ │ ├── NameFactory.java
│ │ │ │ ├── NameFactoryResetter.java
│ │ │ │ ├── NameMarker.java
│ │ │ │ ├── NameObfuscationReferenceFixer.java
│ │ │ │ ├── NewMemberNameFilter.java
│ │ │ │ ├── NumericNameFactory.java
│ │ │ │ ├── ObfuscationPreparation.java
│ │ │ │ ├── Obfuscator.java
│ │ │ │ ├── OriginalClassNameFilter.java
│ │ │ │ ├── ParameterNameMarker.java
│ │ │ │ ├── PrefixingNameFactory.java
│ │ │ │ ├── RenamedFlagSetter.java
│ │ │ │ ├── ResourceFileNameAdapter.java
│ │ │ │ ├── ResourceFileNameObfuscator.java
│ │ │ │ ├── ResourceJavaReferenceFixer.java
│ │ │ │ ├── SimpleNameFactory.java
│ │ │ │ ├── SourceFileRenamer.java
│ │ │ │ ├── SpecialNameFactory.java
│ │ │ │ ├── UniqueMemberNameFactory.java
│ │ │ │ ├── kotlin/
│ │ │ │ │ ├── KotlinAliasNameObfuscator.java
│ │ │ │ │ ├── KotlinAliasReferenceFixer.java
│ │ │ │ │ ├── KotlinCallableReferenceFixer.java
│ │ │ │ │ ├── KotlinCompanionEqualizer.java
│ │ │ │ │ ├── KotlinDefaultImplsMethodNameEqualizer.java
│ │ │ │ │ ├── KotlinDefaultMethodNameEqualizer.java
│ │ │ │ │ ├── KotlinIntrinsicsReplacementSequences.java
│ │ │ │ │ ├── KotlinModuleFixer.java
│ │ │ │ │ ├── KotlinModuleNameObfuscator.java
│ │ │ │ │ ├── KotlinMultiFileFacadeFixer.java
│ │ │ │ │ ├── KotlinObjectFixer.java
│ │ │ │ │ ├── KotlinPropertyNameObfuscator.java
│ │ │ │ │ ├── KotlinPropertyRenamer.java
│ │ │ │ │ ├── KotlinSourceDebugExtensionAttributeObfuscator.java
│ │ │ │ │ ├── KotlinSyntheticClassFixer.java
│ │ │ │ │ ├── KotlinSyntheticToStringObfuscator.java
│ │ │ │ │ ├── KotlinUnsupportedExceptionReplacementSequences.java
│ │ │ │ │ ├── KotlinValueParameterNameShrinker.java
│ │ │ │ │ └── KotlinValueParameterUsageMarker.java
│ │ │ │ ├── obfuscate/
│ │ │ │ │ └── package.html
│ │ │ │ └── util/
│ │ │ │ ├── InstructionSequenceObfuscator.java
│ │ │ │ └── ReplacementSequences.java
│ │ │ ├── optimize/
│ │ │ │ ├── BootstrapMethodArgumentShrinker.java
│ │ │ │ ├── CalledMemberVisitor.java
│ │ │ │ ├── ChangedCodePrinter.java
│ │ │ │ ├── ConstantMemberFilter.java
│ │ │ │ ├── ConstantParameterFilter.java
│ │ │ │ ├── DuplicateInitializerFixer.java
│ │ │ │ ├── DuplicateInitializerInvocationFixer.java
│ │ │ │ ├── InfluenceFixpointVisitor.java
│ │ │ │ ├── KeepMarker.java
│ │ │ │ ├── KeptClassFilter.java
│ │ │ │ ├── KeptMemberFilter.java
│ │ │ │ ├── LineNumberTrimmer.java
│ │ │ │ ├── MemberDescriptorSpecializer.java
│ │ │ │ ├── MemberReferenceGeneralizer.java
│ │ │ │ ├── MethodDescriptorShrinker.java
│ │ │ │ ├── MethodStaticizer.java
│ │ │ │ ├── OptimizationInfoClassFilter.java
│ │ │ │ ├── OptimizationInfoMemberFilter.java
│ │ │ │ ├── Optimizer.java
│ │ │ │ ├── ParameterShrinker.java
│ │ │ │ ├── ReverseDependencyCalculator.java
│ │ │ │ ├── ReverseDependencyStore.java
│ │ │ │ ├── SideEffectVisitorMarkerFactory.java
│ │ │ │ ├── TailRecursionSimplifier.java
│ │ │ │ ├── TimedClassPoolVisitor.java
│ │ │ │ ├── WriteOnlyFieldFilter.java
│ │ │ │ ├── evaluation/
│ │ │ │ │ ├── EvaluationShrinker.java
│ │ │ │ │ ├── EvaluationSimplifier.java
│ │ │ │ │ ├── InstructionUsageMarker.java
│ │ │ │ │ ├── LoadingInvocationUnit.java
│ │ │ │ │ ├── ParameterTracingInvocationUnit.java
│ │ │ │ │ ├── SimpleEnumArrayPropagator.java
│ │ │ │ │ ├── SimpleEnumClassChecker.java
│ │ │ │ │ ├── SimpleEnumClassSimplifier.java
│ │ │ │ │ ├── SimpleEnumDescriptorSimplifier.java
│ │ │ │ │ ├── SimpleEnumUseChecker.java
│ │ │ │ │ ├── SimpleEnumUseSimplifier.java
│ │ │ │ │ ├── StoringInvocationUnit.java
│ │ │ │ │ └── VariableOptimizer.java
│ │ │ │ ├── gson/
│ │ │ │ │ ├── DuplicateJsonFieldNameChecker.java
│ │ │ │ │ ├── FieldSignatureCollector.java
│ │ │ │ │ ├── GsonAnnotationCleaner.java
│ │ │ │ │ ├── GsonBuilderInvocationFinder.java
│ │ │ │ │ ├── GsonClassConstants.java
│ │ │ │ │ ├── GsonConstructorPatcher.java
│ │ │ │ │ ├── GsonContext.java
│ │ │ │ │ ├── GsonDeserializationInvocationFinder.java
│ │ │ │ │ ├── GsonDeserializationOptimizer.java
│ │ │ │ │ ├── GsonDomainClassFinder.java
│ │ │ │ │ ├── GsonInstrumentationAdder.java
│ │ │ │ │ ├── GsonOptimizer.java
│ │ │ │ │ ├── GsonRuntimeSettings.java
│ │ │ │ │ ├── GsonSerializationInvocationFinder.java
│ │ │ │ │ ├── GsonSerializationOptimizer.java
│ │ │ │ │ ├── InlineDeserializer.java
│ │ │ │ │ ├── InlineDeserializers.java
│ │ │ │ │ ├── InlineSerializer.java
│ │ │ │ │ ├── InlineSerializers.java
│ │ │ │ │ ├── LocalOrAnonymousClassChecker.java
│ │ │ │ │ ├── MarkedAnnotationDeleter.java
│ │ │ │ │ ├── OptimizedClassConstants.java
│ │ │ │ │ ├── OptimizedJsonFieldCollector.java
│ │ │ │ │ ├── OptimizedJsonFieldVisitor.java
│ │ │ │ │ ├── OptimizedJsonInfo.java
│ │ │ │ │ ├── OptimizedJsonReaderImplInitializer.java
│ │ │ │ │ ├── OptimizedJsonWriterImplInitializer.java
│ │ │ │ │ ├── OptimizedTypeAdapterAdder.java
│ │ │ │ │ ├── OptimizedTypeAdapterFactoryInitializer.java
│ │ │ │ │ ├── OptimizedTypeAdapterInitializer.java
│ │ │ │ │ ├── TypeArgumentFinder.java
│ │ │ │ │ ├── TypeParameterClassChecker.java
│ │ │ │ │ ├── TypeTokenClassBuilder.java
│ │ │ │ │ ├── _GsonUtil.java
│ │ │ │ │ ├── _OptimizedJsonReader.java
│ │ │ │ │ ├── _OptimizedJsonReaderImpl.java
│ │ │ │ │ ├── _OptimizedJsonWriter.java
│ │ │ │ │ ├── _OptimizedJsonWriterImpl.java
│ │ │ │ │ ├── _OptimizedTypeAdapter.java
│ │ │ │ │ ├── _OptimizedTypeAdapterFactory.java
│ │ │ │ │ ├── _OptimizedTypeAdapterImpl.java
│ │ │ │ │ └── package.html
│ │ │ │ ├── info/
│ │ │ │ │ ├── AccessMethodMarker.java
│ │ │ │ │ ├── BackwardBranchMarker.java
│ │ │ │ │ ├── CatchExceptionMarker.java
│ │ │ │ │ ├── CaughtClassFilter.java
│ │ │ │ │ ├── CaughtClassMarker.java
│ │ │ │ │ ├── ClassOptimizationInfo.java
│ │ │ │ │ ├── CodeAttributeOptimizationInfo.java
│ │ │ │ │ ├── ContainsConstructorsMarker.java
│ │ │ │ │ ├── DotClassFilter.java
│ │ │ │ │ ├── DotClassMarker.java
│ │ │ │ │ ├── DynamicInvocationMarker.java
│ │ │ │ │ ├── EscapingClassFilter.java
│ │ │ │ │ ├── EscapingClassMarker.java
│ │ │ │ │ ├── ExceptionInstructionChecker.java
│ │ │ │ │ ├── FieldOptimizationInfo.java
│ │ │ │ │ ├── FinalFieldAssignmentMarker.java
│ │ │ │ │ ├── InstanceofClassFilter.java
│ │ │ │ │ ├── InstanceofClassMarker.java
│ │ │ │ │ ├── InstantiationClassFilter.java
│ │ │ │ │ ├── InstantiationClassMarker.java
│ │ │ │ │ ├── MethodInvocationMarker.java
│ │ │ │ │ ├── MethodOptimizationInfo.java
│ │ │ │ │ ├── MutableBoolean.java
│ │ │ │ │ ├── NoEscapingParametersMethodMarker.java
│ │ │ │ │ ├── NoExternalReturnValuesMethodMarker.java
│ │ │ │ │ ├── NoExternalSideEffectMethodMarker.java
│ │ │ │ │ ├── NoSideEffectClassMarker.java
│ │ │ │ │ ├── NoSideEffectMethodMarker.java
│ │ │ │ │ ├── NonEmptyStackReturnMarker.java
│ │ │ │ │ ├── NonPrivateMemberMarker.java
│ │ │ │ │ ├── OptimizationCodeAttributeFilter.java
│ │ │ │ │ ├── PackageVisibleMemberContainingClassMarker.java
│ │ │ │ │ ├── PackageVisibleMemberInvokingClassMarker.java
│ │ │ │ │ ├── ParameterEscapeMarker.java
│ │ │ │ │ ├── ParameterEscapedMarker.java
│ │ │ │ │ ├── ParameterUsageMarker.java
│ │ │ │ │ ├── ProgramClassOptimizationInfo.java
│ │ │ │ │ ├── ProgramClassOptimizationInfoSetter.java
│ │ │ │ │ ├── ProgramFieldOptimizationInfo.java
│ │ │ │ │ ├── ProgramMemberOptimizationInfoSetter.java
│ │ │ │ │ ├── ProgramMethodOptimizationInfo.java
│ │ │ │ │ ├── ReadWriteFieldMarker.java
│ │ │ │ │ ├── ReferenceEscapeChecker.java
│ │ │ │ │ ├── RepeatedClassPoolVisitor.java
│ │ │ │ │ ├── SideEffectClassChecker.java
│ │ │ │ │ ├── SideEffectClassFilter.java
│ │ │ │ │ ├── SideEffectClassMarker.java
│ │ │ │ │ ├── SideEffectInstructionChecker.java
│ │ │ │ │ ├── SideEffectMethodFilter.java
│ │ │ │ │ ├── SideEffectMethodMarker.java
│ │ │ │ │ ├── SimpleEnumFilter.java
│ │ │ │ │ ├── SimpleEnumMarker.java
│ │ │ │ │ ├── SuperInvocationMarker.java
│ │ │ │ │ ├── SynchronizedBlockMethodMarker.java
│ │ │ │ │ ├── UnusedParameterMethodFilter.java
│ │ │ │ │ ├── UnusedParameterOptimizationInfoUpdater.java
│ │ │ │ │ ├── UsedParameterFilter.java
│ │ │ │ │ ├── VariableUsageMarker.java
│ │ │ │ │ └── WrapperClassMarker.java
│ │ │ │ ├── kotlin/
│ │ │ │ │ └── KotlinContextReceiverUsageMarker.java
│ │ │ │ └── peephole/
│ │ │ │ ├── ClassFinalizer.java
│ │ │ │ ├── ClassMerger.java
│ │ │ │ ├── GotoCommonCodeReplacer.java
│ │ │ │ ├── GotoGotoReplacer.java
│ │ │ │ ├── GotoReturnReplacer.java
│ │ │ │ ├── HorizontalClassMerger.java
│ │ │ │ ├── InstructionSequenceConstants.java
│ │ │ │ ├── LineNumberLinearizer.java
│ │ │ │ ├── MemberPrivatizer.java
│ │ │ │ ├── MethodFinalizer.java
│ │ │ │ ├── MethodInliner.java
│ │ │ │ ├── NoConstructorReferenceReplacer.java
│ │ │ │ ├── NopRemover.java
│ │ │ │ ├── ReachableCodeMarker.java
│ │ │ │ ├── RetargetedClassFilter.java
│ │ │ │ ├── RetargetedInnerClassAttributeRemover.java
│ │ │ │ ├── ShortMethodInliner.java
│ │ │ │ ├── SingleInvocationMethodInliner.java
│ │ │ │ ├── TargetClassChanger.java
│ │ │ │ ├── UnreachableCodeRemover.java
│ │ │ │ ├── UnreachableExceptionRemover.java
│ │ │ │ ├── VariableShrinker.java
│ │ │ │ ├── VerticalClassMerger.java
│ │ │ │ ├── WrapperClassMerger.java
│ │ │ │ └── WrapperClassUseSimplifier.java
│ │ │ ├── pass/
│ │ │ │ ├── Pass.java
│ │ │ │ └── PassRunner.java
│ │ │ ├── preverify/
│ │ │ │ ├── PreverificationClearer.java
│ │ │ │ ├── Preverifier.java
│ │ │ │ └── SubroutineInliner.java
│ │ │ ├── shrink/
│ │ │ │ ├── AnnotationUsageMarker.java
│ │ │ │ ├── ClassShrinker.java
│ │ │ │ ├── ClassUsageMarker.java
│ │ │ │ ├── InnerUsageMarker.java
│ │ │ │ ├── InterfaceUsageMarker.java
│ │ │ │ ├── KotlinModuleShrinker.java
│ │ │ │ ├── KotlinModuleUsageMarker.java
│ │ │ │ ├── KotlinShrinker.java
│ │ │ │ ├── LocalVariableTypeUsageMarker.java
│ │ │ │ ├── NestUsageMarker.java
│ │ │ │ ├── RecordComponentUsageMarker.java
│ │ │ │ ├── ShortestClassUsageMarker.java
│ │ │ │ ├── ShortestUsageMark.java
│ │ │ │ ├── ShortestUsageMarker.java
│ │ │ │ ├── ShortestUsagePrinter.java
│ │ │ │ ├── Shrinker.java
│ │ │ │ ├── SimpleUsageMarker.java
│ │ │ │ ├── UsageMarker.java
│ │ │ │ ├── UsagePrinter.java
│ │ │ │ ├── UsedClassFilter.java
│ │ │ │ ├── UsedMemberFilter.java
│ │ │ │ └── shrink/
│ │ │ │ └── package.html
│ │ │ ├── strip/
│ │ │ │ └── KotlinAnnotationStripper.java
│ │ │ └── util/
│ │ │ ├── Benchmark.java
│ │ │ ├── HashUtil.java
│ │ │ ├── PrintWriterUtil.java
│ │ │ ├── TimeUtil.java
│ │ │ ├── TransformedStringMatcher.java
│ │ │ └── kotlin/
│ │ │ ├── KotlinUnsupportedVersionChecker.java
│ │ │ └── asserter/
│ │ │ ├── KotlinMetadataVerifier.java
│ │ │ └── Reporter.java
│ │ └── resources/
│ │ └── log4j2.xml
│ └── test/
│ └── kotlin/
│ ├── proguard/
│ │ ├── AfterInitConfigurationVerifierTest.kt
│ │ ├── ClassMergerTest.kt
│ │ ├── ClassSpecificationVisitorFactoryTest.kt
│ │ ├── ConfigurationParserTest.kt
│ │ ├── Java19RecordPatternTest.kt
│ │ ├── Java20RecordPatternTest.kt
│ │ ├── LoggingTest.kt
│ │ ├── MarkerTest.kt
│ │ ├── obfuscate/
│ │ │ ├── SimpleNameFactoryTest.kt
│ │ │ └── kotlin/
│ │ │ ├── KotlinCallableReferenceFixerTest.kt
│ │ │ ├── KotlinIntrinsicsReplacementSequencesTest.kt
│ │ │ └── KotlinValueParameterNameShrinkerTest.kt
│ │ ├── optimize/
│ │ │ ├── KotlinContextReceiverParameterShrinkingTest.kt
│ │ │ ├── MemberDescriptorSpecializerTest.kt
│ │ │ ├── SimpleEnumClassCheckerTest.kt
│ │ │ ├── gson/
│ │ │ │ ├── MarkedAnnotationDeleterTest.kt
│ │ │ │ └── TypeArgumentFinderTest.kt
│ │ │ ├── info/
│ │ │ │ └── InstantiationClassMarkerTest.kt
│ │ │ └── peephole/
│ │ │ └── MethodInlinerTest.kt
│ │ ├── shrink/
│ │ │ └── ClassUsageMarkerTest.kt
│ │ └── util/
│ │ └── ProguardAssemblerTest.kt
│ └── testutils/
│ ├── ConfigurationUtil.kt
│ ├── JavaUtil.kt
│ ├── LogUtils.kt
│ ├── ProcessingFlagUtil.kt
│ └── TestConfig.kt
├── bin/
│ ├── dprotect.sh
│ ├── proguard.bat
│ ├── proguard.sh
│ ├── proguardgui.bat
│ ├── proguardgui.sh
│ ├── retrace.bat
│ └── retrace.sh
├── build.gradle
├── docs/
│ ├── md/
│ │ ├── css/
│ │ │ ├── admonition.css
│ │ │ └── extra.css
│ │ ├── downloads.md
│ │ ├── index.md
│ │ ├── manual/
│ │ │ ├── FAQ.md
│ │ │ ├── building.md
│ │ │ ├── configuration/
│ │ │ │ ├── attributes.md
│ │ │ │ ├── examples.md
│ │ │ │ ├── optimizations.md
│ │ │ │ └── usage.md
│ │ │ ├── feedback.md
│ │ │ ├── home.md
│ │ │ ├── languages/
│ │ │ │ ├── java.md
│ │ │ │ └── kotlin.md
│ │ │ ├── license/
│ │ │ │ ├── gpl.md
│ │ │ │ ├── gplexception.md
│ │ │ │ └── license.md
│ │ │ ├── quickstart.md
│ │ │ ├── refcard.md
│ │ │ ├── releasenotes.md
│ │ │ ├── setup/
│ │ │ │ ├── ant.md
│ │ │ │ ├── gradle.md
│ │ │ │ ├── gradleplugin.md
│ │ │ │ └── standalone.md
│ │ │ ├── tools/
│ │ │ │ ├── appsweep.md
│ │ │ │ ├── playground.md
│ │ │ │ └── retrace.md
│ │ │ └── troubleshooting/
│ │ │ ├── limitations.md
│ │ │ └── troubleshooting.md
│ │ └── results.md
│ ├── mkdocs.yml
│ └── notices/
│ └── Gson
├── dprotect/
│ └── build.gradle
├── examples/
│ ├── android-agp3-agp4/
│ │ ├── AndroidManifest.xml
│ │ ├── build.gradle
│ │ ├── debug.keystore
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard-project.txt
│ │ ├── res/
│ │ │ └── values/
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── settings.gradle
│ │ └── src/
│ │ └── com/
│ │ └── example/
│ │ └── HelloWorldActivity.java
│ ├── android-plugin/
│ │ ├── AndroidManifest.xml
│ │ ├── build.gradle
│ │ ├── debug.keystore
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard-project.txt
│ │ ├── res/
│ │ │ └── values/
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── settings.gradle
│ │ └── src/
│ │ └── com/
│ │ └── example/
│ │ └── HelloWorldActivity.java
│ ├── annotations/
│ │ ├── examples/
│ │ │ ├── Applet.java
│ │ │ ├── Application.java
│ │ │ ├── Bean.java
│ │ │ └── NativeCallBack.java
│ │ └── examples.pro
│ ├── ant/
│ │ ├── applets.xml
│ │ ├── applications1.xml
│ │ ├── applications2.xml
│ │ ├── applications3.xml
│ │ ├── library.xml
│ │ ├── midlets.xml
│ │ ├── proguard.xml
│ │ └── servlets.xml
│ ├── application/
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard.pro
│ │ ├── settings.gradle
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── App.java
│ ├── application-kotlin/
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── proguard.pro
│ │ ├── settings.gradle
│ │ └── src/
│ │ └── main/
│ │ └── kotlin/
│ │ └── App.kt
│ ├── dictionaries/
│ │ ├── compact.txt
│ │ ├── keywords.txt
│ │ ├── shakespeare.txt
│ │ └── windows.txt
│ ├── gradle/
│ │ ├── android.gradle
│ │ ├── applets.gradle
│ │ ├── applications.gradle
│ │ ├── library.gradle
│ │ ├── midlets.gradle
│ │ ├── proguard.gradle
│ │ ├── proguardgui.gradle
│ │ ├── retrace.gradle
│ │ ├── scala.gradle
│ │ ├── servlets.gradle
│ │ └── settings.gradle
│ ├── gradle-kotlin-dsl/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── settings.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── gradlekotlindsl/
│ │ │ └── App.java
│ │ └── test/
│ │ └── java/
│ │ └── gradlekotlindsl/
│ │ └── AppTest.java
│ ├── spring-boot/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── settings.gradle
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── TestComponent.java
│ │ │ └── sub/
│ │ │ └── TestComponent2.java
│ │ └── resources/
│ │ └── application.properties
│ └── standalone/
│ ├── android.pro
│ ├── applets.pro
│ ├── applications.pro
│ ├── library.pro
│ ├── midlets.pro
│ ├── proguard.pro
│ ├── proguardgui.pro
│ ├── retrace.pro
│ ├── scala.pro
│ └── servlets.pro
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle-plugin/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── proguard/
│ │ │ └── gradle/
│ │ │ └── ProGuardTask.java
│ │ ├── kotlin/
│ │ │ └── proguard/
│ │ │ └── gradle/
│ │ │ └── plugin/
│ │ │ ├── ProGuardPlugin.kt
│ │ │ └── android/
│ │ │ ├── AndroidPlugin.kt
│ │ │ ├── ProGuardTransform.kt
│ │ │ ├── dsl/
│ │ │ │ ├── ProGuardAndroidExtension.kt
│ │ │ │ ├── ProGuardConfiguration.kt
│ │ │ │ └── VariantConfiguration.kt
│ │ │ ├── tasks/
│ │ │ │ ├── CollectConsumerRulesTask.kt
│ │ │ │ └── PrepareProguardConfigDirectoryTask.kt
│ │ │ └── transforms/
│ │ │ ├── AndroidConsumerRulesTransform.kt
│ │ │ └── ArchiveConsumerRulesTransform.kt
│ │ └── resources/
│ │ └── lib/
│ │ ├── proguard-android-common.txt
│ │ ├── proguard-android-debug.txt
│ │ ├── proguard-android-optimize.txt
│ │ └── proguard-android.txt
│ └── test/
│ └── kotlin/
│ ├── proguard/
│ │ └── gradle/
│ │ ├── AgpVersionParserTest.kt
│ │ ├── ConsumerRulesCollectionTest.kt
│ │ ├── ConsumerRulesFilterTest.kt
│ │ ├── GradlePluginIntegrationTest.kt
│ │ ├── ProGuardPluginLegacyAGPIntegrationTest.kt
│ │ ├── ProGuardPluginTest.kt
│ │ ├── ProguardCacheRelocateabilityIntegrationTest.kt
│ │ └── plugin/
│ │ └── android/
│ │ └── dsl/
│ │ ├── AaptRulesTest.kt
│ │ ├── ConfigurationOrderTest.kt
│ │ ├── ConfigurationTest.kt
│ │ ├── DefaultConfigurationTest.kt
│ │ └── FlavorsConfigurationTest.kt
│ └── testutils/
│ ├── AndroidProjectBuilder.kt
│ ├── GradleRunnerUtil.kt
│ └── TestPluginClasspath.kt
├── gradle.properties
├── gradlew
├── gradlew.bat
├── gui/
│ ├── build.gradle
│ └── src/
│ └── proguard/
│ └── gui/
│ ├── ClassPathPanel.java
│ ├── ClassSpecificationDialog.java
│ ├── ClassSpecificationsPanel.java
│ ├── ExtensionFileFilter.java
│ ├── FilterBuilder.java
│ ├── FilterDialog.java
│ ├── GUIResources.java
│ ├── GUIResources.properties
│ ├── JavaUtil.java
│ ├── KeepSpecificationsPanel.java
│ ├── ListPanel.java
│ ├── MemberSpecificationDialog.java
│ ├── MemberSpecificationsPanel.java
│ ├── MessageDialogRunnable.java
│ ├── OptimizationsDialog.java
│ ├── ProGuardGUI.java
│ ├── ProGuardRunnable.java
│ ├── ReTraceRunnable.java
│ ├── SwingUtil.java
│ ├── TabbedPane.java
│ ├── TextAreaOutputStream.java
│ ├── TextAreaWriter.java
│ ├── boilerplate.pro
│ ├── default.pro
│ ├── package.html
│ └── splash/
│ ├── BufferedSprite.java
│ ├── CircleSprite.java
│ ├── ClipSprite.java
│ ├── ColorSprite.java
│ ├── CompositeSprite.java
│ ├── ConstantColor.java
│ ├── ConstantDouble.java
│ ├── ConstantFont.java
│ ├── ConstantInt.java
│ ├── ConstantString.java
│ ├── ConstantTiming.java
│ ├── FontSprite.java
│ ├── ImageSprite.java
│ ├── LinearColor.java
│ ├── LinearDouble.java
│ ├── LinearInt.java
│ ├── LinearTiming.java
│ ├── OverrideGraphics2D.java
│ ├── RectangleSprite.java
│ ├── SawToothTiming.java
│ ├── ShadowedSprite.java
│ ├── SineTiming.java
│ ├── SmoothTiming.java
│ ├── SplashPanel.java
│ ├── Sprite.java
│ ├── TextSprite.java
│ ├── TimeSwitchSprite.java
│ ├── Timing.java
│ ├── TypeWriterString.java
│ ├── VariableColor.java
│ ├── VariableDouble.java
│ ├── VariableFont.java
│ ├── VariableInt.java
│ ├── VariableSizeFont.java
│ ├── VariableString.java
│ └── package.html
├── proguard-app/
│ └── build.gradle
├── retrace/
│ ├── build.gradle
│ └── src/
│ └── proguard/
│ └── retrace/
│ ├── FrameInfo.java
│ ├── FramePattern.java
│ ├── FrameRemapper.java
│ ├── ReTrace.java
│ └── package.html
├── scripts/
│ ├── docker/
│ │ ├── gh_action.sh
│ │ └── publish_gradle_plugin.sh
│ └── fetch_dprotect_core.py
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*.java]
indent_style = space
indent_size = 4
================================================
FILE: .gitattributes
================================================
gradlew -text
gradlew.bat -text
================================================
FILE: .github/scripts/s3-deploy.py
================================================
#!/usr/bin/env python3
import sys
import os
import logging
import pathlib
from mako.template import Template
from enum import Enum, auto
import tempfile
import boto3
from botocore.exceptions import ClientError
class CI(Enum):
UNKNOWN = auto()
GITHUB_ACTIONS = auto()
def pretty_ci_name(ci):
return str(ci).split(".")[-1].replace("_", "-").lower()
def is_pr(ci):
if ci == CI.GITHUB_ACTIONS:
cond1 = os.getenv("GITHUB_HEAD_REF", "") != ""
cond2 = not (os.getenv("GITHUB_REPOSITORY", "").startswith("open-obfuscator/") or os.getenv("GITHUB_REPOSITORY", "").startswith("romainthomas/"))
return cond1 or cond2
return True
def get_branch(ci):
if ci == CI.GITHUB_ACTIONS:
return os.getenv("GITHUB_REF").replace("refs/heads/", "")
return None
def get_ci_workdir(ci):
if ci == CI.GITHUB_ACTIONS:
return os.getenv("GITHUB_WORKSPACE")
logger.critical("Unsupported CI to resolve working directory")
sys.exit(1)
def get_tag(ci):
if ci == CI.GITHUB_ACTIONS:
ref = os.getenv("GITHUB_REF", "")
logger.info("Github Action tag: {}".format(ref))
if ref.startswith("refs/tags/"):
return ref.replace("refs/tags/", "")
return ""
logger.critical("Unsupported CI to resolve working directory")
sys.exit(1)
LOG_LEVEL = logging.INFO
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
logging.getLogger().setLevel(LOG_LEVEL)
logger = logging.getLogger(__name__)
CURRENT_CI = CI.GITHUB_ACTIONS
CI_PRETTY_NAME = pretty_ci_name(CURRENT_CI)
logger.info("CI: %s", CI_PRETTY_NAME)
ALLOWED_BRANCHES = {"main", "deploy", "devel"}
BRANCH_NAME = get_branch(CURRENT_CI)
TAG_NAME = get_tag(CURRENT_CI)
IS_TAGGED = TAG_NAME is not None and len(TAG_NAME) > 0
logger.info("Branch: %s", BRANCH_NAME)
logger.info("Tag: %s", TAG_NAME)
if BRANCH_NAME.startswith("release-"):
logger.info("Branch release")
elif BRANCH_NAME not in ALLOWED_BRANCHES and not IS_TAGGED:
logger.info("Skip deployment for branch '%s'", BRANCH_NAME)
sys.exit(0)
if is_pr(CURRENT_CI):
logger.info("Skip pull request")
sys.exit(0)
CURRENTDIR = pathlib.Path(__file__).resolve().parent
REPODIR = CURRENTDIR / ".." / ".."
# According to Scaleway S3 documentation, the endpoint
# should starts with '<bucket>'.s3.<region>.scw.cloud
# Nevertheless boto3 uses /{Bucket} endpoints suffix
# which create issues (see: https://stackoverflow.com/a/70383653)
DPROTECT_S3_REGION = "fr-par"
DPROTECT_S3_ENDPOINT = "https://s3.{region}.scw.cloud".format(region=DPROTECT_S3_REGION)
DPROTECT_S3_BUCKET = "obfuscator"
DPROTECT_S3_KEY = os.getenv("DPROTECT_S3_KEY", None)
DPROTECT_S3_SECRET = os.getenv("DPROTECT_S3_SECRET", None)
if DPROTECT_S3_KEY is None or len(DPROTECT_S3_KEY) == 0:
logger.error("OPEN_OBFUSCATOR_S3_KEY is not set!")
sys.exit(1)
if DPROTECT_S3_SECRET is None or len(DPROTECT_S3_SECRET) == 0:
logger.error("OPEN_OBFUSCATOR_S3_SECRET is not set!")
sys.exit(1)
CI_CWD = pathlib.Path(get_ci_workdir(CURRENT_CI))
if CI_CWD is None:
logger.error("Can't resolve CI working dir")
sys.exit(1)
DIST_DIR = REPODIR / "dist"
logger.info("Working directory: %s", CI_CWD)
INDEX_TEMPLATE = r"""
<!DOCTYPE html>
<html>
<title>Packages for dProtect</title>
<body>
<h1>Packages for dProtect</h1>
% for path, filename in files:
<a href="/${path}">${filename}</a><br />
% endfor
</body>
</html>
"""
SKIP_LIST = ["index.html"]
s3 = boto3.resource(
's3',
region_name=DPROTECT_S3_REGION,
use_ssl=True,
endpoint_url=DPROTECT_S3_ENDPOINT,
aws_access_key_id=DPROTECT_S3_KEY,
aws_secret_access_key=DPROTECT_S3_SECRET
)
def push(file: str, dir_name: str):
zipfile = pathlib.Path(file)
dst = f"{dir_name}/dprotect/{zipfile.name}"
logger.info("Uploading %s to %s", file, dst)
try:
obj = s3.Object(DPROTECT_S3_BUCKET, dst)
obj.put(Body=zipfile.read_bytes())
return 0
except ClientError as e:
logger.error("S3 push failed: %s", e)
return 1
def filename(object):
return pathlib.Path(object.key).name
def generate_index(dir_name: str):
files = s3.Bucket(DPROTECT_S3_BUCKET).objects.filter(Prefix=f'{dir_name}/dprotect')
tmpl_info = [(object.key, filename(object)) for object in files if filename(object) not in SKIP_LIST]
html = Template(INDEX_TEMPLATE).render(files=tmpl_info)
return html
dir_name = "latest"
if BRANCH_NAME != "main":
dir_name = "{}".format(BRANCH_NAME.replace("/", "-").replace("_", "-"))
if BRANCH_NAME.startswith("release-"):
_, dir_name = BRANCH_NAME.split("release-")
if IS_TAGGED:
dir_name = str(TAG_NAME)
logger.info("Destination directory: %s", dir_name)
for file in DIST_DIR.glob("*.zip"):
logger.info("[ZIP ] Uploading '%s'", file.as_posix())
push(file.as_posix(), dir_name)
nightly_index = generate_index(dir_name)
with tempfile.TemporaryDirectory() as tmp:
tmp = pathlib.Path(tmp)
index = (tmp / "index.html")
index.write_text(nightly_index)
push(index.as_posix(), dir_name)
logger.info("Done!")
================================================
FILE: .github/workflows/continuous_integration.yml
================================================
name: Continuous Integration
on:
pull_request:
branches:
- skip
- skip
push:
branches:
- skip
- skip
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v2
with:
path: proguard-main
- uses: actions/setup-java@v1
with:
java-version: 8
- uses: eskatos/gradle-command-action@v1
with:
build-root-directory: proguard-main/
wrapper-directory: proguard-main/
arguments: test :base:testAllJavaVersions :base:jacocoTestReport jar --info
- name: Publish Test Report
uses: mikepenz/action-junit-report@v3
if: always() # always run even if the previous step fails
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
================================================
FILE: .github/workflows/main.yml
================================================
name: 'dProtect Main'
on: [push, workflow_dispatch]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Build dProtect-core & dProtect
shell: bash
run: |
mkdir -p $GITHUB_WORKSPACE/dist
docker run --rm \
-v $GITHUB_WORKSPACE:/dprotect \
openobfuscator/dprotect-build:latest bash /dprotect/scripts/docker/gh_action.sh
- name: Deploy
env:
DPROTECT_S3_KEY: ${{ secrets.DPROTECT_S3_KEY }}
DPROTECT_S3_SECRET: ${{ secrets.DPROTECT_S3_SECRET }}
shell: bash
run: |
docker run \
-v $GITHUB_WORKSPACE:/dprotect \
-e GITHUB_ACTIONS="true" \
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
-e GITHUB_REF=$GITHUB_REF \
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
-e DPROTECT_S3_KEY=$DPROTECT_S3_KEY \
-e DPROTECT_S3_SECRET=$DPROTECT_S3_SECRET \
--rm \
openobfuscator/deployment python3 /dprotect/.github/scripts/s3-deploy.py
================================================
FILE: .gitignore
================================================
.gradle
.hg/**
.hgtags
.idea
build
local.properties
/lib/
docs/html
================================================
FILE: .hgignore
================================================
syntax: glob
.git/*
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to ProGuard
Thank you for contributing!
- You can report issues on our [issue tracker](issues) on GitHub. Please be
concise and complete. If we can't reproduce an issue, we most likely can't
fix it.
- You can also clone the [source code](.) yourself and create [pull
requests](pulls) on GitHub.
These are a few guidelines for our code and documentation.
## Basic principle
Above all, code should be consistent. Study, respect, and follow the style of
the existing code.
## Code design
The code generally defines many short classes, as the building blocks for
classes that contain the real logic. This is sometimes taken to the extreme:
even loops and conditional statements can often be implemented as separate
classes. Even though these classes are verbose and repetitive, the resulting
main code becomes much more compact, flexible, and robust.
### Data classes
Basic data classes define the data structures, with just a minimum number of
operations: Java bytecode classes, Dex bytecode classes, XML data, native
libraries, etc. They typically reflect their respective specifications
literally. The data classes have one or more `accept` methods to let the
visitor classes below operate on them.
### Visitors
The code relies a lot on the visitor pattern. Visitor classes define the
operations on the data: reading, writing, editing, transforming, etc. The
visitor classes have one or more `visit` methods to operate on data classes of
the same basic type.
For example, a Java bytecode class contains a constant pool with constants of
different types: integer constants, float constants, string constants, etc.
The data classes IntegerConstant, FloatConstant, StringConstant, etc. all
implement the basic type Constant. The visitor interface ConstantVisitor
contains methods 'visitIntegerConstant', 'visitFloatConstant',
'visitStringConstant', etc. Implementations of this visitor interface can
perform all kinds of operations on the constants.
The reasoning behind this pattern is that the data classes are very stable,
because they are directly based on the specifications (class files, dex files,
binary XML files, ELF files, etc). The operations are more dynamic. They are
changed and extended all the time. It is practically impossible to add all
possible operations in the data classes, but it is easy to add another
implementation of a visitor interface. Implementing an interface in practice
helps a lot to think of all possible cases.
The visitor pattern uses visitor interfaces to operate on the similar elements
of a data structure. Each interface often has many implementations. A great
disadvantage at this time is that visitor methods can invoke one another
(directly or indirectly), but they can't communicate easily. Since the
implementations can't add their own parameters or return values, they often
have to rely on fields to pass values back and forth. This is more
error-prone. Still, the advantages of the visitor pattern outweigh the
disadvantages.
We prefer (visitor) interfaces with many classes that implement them, so the
implementations can be used as building blocks.
### Facade classes
With many small visitor classes available as building blocks, the important
code chains these visitors together. The main ProGuard packages contain a
number of facade classes that construct and run these chains. Notably:
- `ProGuard` is the main entry point, with a long linear sequence of
operations that it delegates to the facade classes.
- `InputReader` reads the code and resources.
- `Initializer` initializes links between the code and resources, to traverse
the data structures more easily.
- `Marker` marks code and resources to be kept, encrypted, etc., based on the
configuration.
- `Backporter` backports code to older versions of Java.
- `ConfigurationLoggingAdder` instruments code to give feedback about
potentially missing configuration.
- `Shrinker` removes unused code and resources.
- `Optimizer` optimizes the code and resources.
- `Obfuscator` obfuscates the code and resources.
- `Preverifier` adds preverification metadata to code for Java 6 and higher.
### Data flow
At a high level, the flow of data inside ProGuard is as follows:
- Traverse the input data, to parse any useful data structures.
- Process the data structures in a number of steps (mainly shrinking, string
encryption, optimization, obfuscation, class encryption).
- Traverse the input data again, this time to write to the output, by copying,
transforming, replacing, or removing data entries. The transformations can
be small (e.g. replacing class names in properties files) or large (e.g.
replacing all classes and resources by obfuscated counterparts).
Important interfaces for this flow:
- `DataEntryReader` uses a push mechanism. It typically traverses data entries
(files and nested zip entries) in the input and pushes them to data entry
visitors. The visitors can access the actual data through input streams.
- `DataEntryWriter` uses a pull mechanism. It can return output streams for
data entries.
The first traversal and parsing of the input data is based on implementations
of DataEntryReader.
The second traversal of the input data is based on the same implementations of
DataEntryReader, with additional implementations that use implementations of
DataEntryWriter to transform and write the output data.
### Dependency injection
We heavily use **constructor-based dependency injection**, to create immutable
objects. Notably the visitors are often like commands that are combined in an
immutable structure, via constructors. The commands are then executed by
applying the visitors to the classes or other data structures.
### Getters and setters
We try to **avoid getters and setters** outside of pure data classes.
Generally, getters and setters break data encapsulation -- "Tell, don't ask".
In our architecture, visitors often delegate to a chain of other visitors,
with the final visitor applying actual changes to the data structures.
Visitors that change the data classes often access fields directly, since they
conceptually have the same purpose as methods inside the data classes.
## Code style
Over time, we've adopted a few guidelines:
- Historically, ProGuard hasn't used generics, enums, iterable loops, variable
arguments, or closures. More recent code can use the features of Java 8, but
be consistent.
- Prefer **arrays** over lists, if their sizes are relatively static. The
resulting code is easier to read, without casts or generics.
- Prefer **short classes** over long classes, although long classes that simply
implement the many methods of their interfaces are okay.
- Prefer **short methods**, although long methods with a linear flow are okay.
- **Declare and initialize** fields and variables at the same time, when
possible.
- Make fields **final**, when possible:
```
private final CodeAttributeComposer composer = new CodeAttributeComposer();
```
- We generally don't make local variables final, to avoid cluttering the code
too much.
- Maintain a **consistent order** for fields, methods (e.g.. getters and
setters), case statements, etc. A good basic rule for new classes is that
their contents should be in chronological order or respecting the natural
hierarchical order of the data -- Which fields are accessed first? Which
methods are accessed first? Which data comes first in the data structures?
For classes that implement or resemble other classes, the contents should
respect the same order.
## Documentation
All classes must have main javadoc:
/**
* This {@link ClassVisitor} collects the names of the classes that it
* visits in the given collection.
*
* @author Eric Lafortune
*/
Methods should have javadoc:
/**
* Returns the number of parameters of the given internal method descriptor.
* @param internalMethodDescriptor the internal method descriptor,
* e.g. "<code>(ID)Z</code>".
* @param isStatic specifies whether the method is static,
* e.g. false.
* @return the number of parameters,
* e.g. 3.
*/
In practice, fields rarely have javadoc (this is debatable...)
Methods that implement interfaces generally don't have javadoc, since they
simply implement the behavior specified by the interfaces. Instead, a group of
methods that implements an interface is documented with:
// Implementations for SomeInterface.
Most code has comments for each block of statements. The idea is to make the
code readable by just glancing over the comments (which works well if they are
colored in an IDE).
Comments are generally short sentences, starting with a capital and ending
with a period:
// This is a comment.
For the manual (written as markdown), you should follow the excellent advice
of the [Google Developer Documentation Style
Guide](https://developers.google.com/style/).
## Code format
We strive for code that is super-aligned. Ideally, the code should look like a
set of tables, for variable declarations, parameter declarations, ternary
operators, etc.
- The basic indentation is 4 spaces (never tabs).
- Curly braces are on separate lines.
- The ideal maximum line length is 120 characters. Documentation and comments
should stick to this limit. Code that has a nice table-like structure can
exceed it.
- Imports of multiple classes in the same package are specified with a
wildcard '*'.
- Try to preserve a logical, consistent order in fields, getters/setters,
methods, variables.
- Whenever overriding a method, add the @Override annotation.
In practice, an IDE can help to obtain a clean indentation and structure, but
it is often not sufficient. Be careful to never upset a cleanly formatted
source file by automatically reformatting it.
### Naming Conventions
- Names (class names, field names, etc) should be descriptive.
- We generally don't abbreviate names, not even index variables:
```
for (int index = 0; index < count; index++)
```
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: README.md
================================================
<p align="center">
<br />
<br />
<a href="https://obfuscator.re/dprotect">
<img src=".github/img/banner.webp" alt="dProtect" width="100%">
</a>
</p>
<p align="center">
<a href="LICENSE">
<img src="https://img.shields.io/github/license/open-obfuscator/dProtect">
</a>
</p>
dProtect is an extension of Proguard with enhanced code obfuscation features. While Proguard is known for obfuscating
symbols (package names, class names, ...) and optimizing Java/Kotlin code, dProtect brings code obfuscation
for Java and Kotlin on the top of Proguard:
```bash
# Arithmetic Obfuscation
-obfuscate-arithmetic,low class dprotect.examples.**
-obfuscate-arithmetic,high,skipfloat class dprotect.internal.**
# Strings Obfuscation
-obfuscate-strings class dprotect.examples.**
-obfuscate-strings class dprotect.internal.CheckPassword {
public static java.lang.String getPassword();
public static java.lang.String getLogin();
private static java.lang.String KEY;
}
# Control-flow obfuscation
-obfuscate-control-flow class dprotect.internal.api.**
# Constants Obfuscation
-obfuscate-constants class dprotect.internal.api.Enum {
*;
}
```
dProtect follows the same integration mechanism as Proguard such as it can be instantiated in an Android
Gradle-based project as follows:
<h6>build.gradle</h6>
```gradle
buildscript {
repositories {
mavenCentral()
maven {
url = uri("https://maven.pkg.github.com/open-obfuscator/dProtect")
credentials {
username = "your-username"
password = "the-token"
}
}
}
dependencies {
classpath 're.obfuscator:dprotect-gradle:1.0.0'
}
}
```
**You need to generate a Github token to use `maven.pkg.github.com`**. Alternatively,
you can use the `dprotect-gradle-1.0.0.jar` archive of the release's artifacts.
<h6>app/build.gradle</h6>
```gradle
apply plugin: 're.obfuscator.dprotect'
// ...
dProtect {
configurations {
release {
configuration 'dprotect-rules.pro'
}
}
}
```
<img src=".github/img/dprotect-pipeline.webp" alt="dProtect Pipeline" width="100%">
You can also find out more information here: https://obfuscator.re/dprotect
### Contact
You can reach out by email at this address: `ping@obfuscator.re`
#### Maintainers
- [Romain Thomas](https://www.romainthomas.fr): [@rh0main](https://twitter.com/rh0main) - `me@romainthomas.fr`
#### Credits
- [Guardsquare](https://www.guardsquare.com/): Proguard's Owner
- [Eric Lafortune](https://www.lafortune.eu/): Proguard's Author
- [James Hamilton](https://jameshamilton.eu/): Proguard's Core dev/maintainer
### License
dProtect is released under the same License as Proguard: [GNU General Public License v2.0](https://github.com/Guardsquare/proguard/blob/master/LICENSE)
================================================
FILE: annotations/annotations.pro
================================================
#
# This ProGuard configuration file specifies how annotations can be used
# to configure the processing of other code.
# Usage:
# java -jar proguard.jar @annotations.pro -libraryjars annotations.jar ...
#
# Note that the other input/output options still have to be specified.
# If you specify them in a separate file, you can simply include this file:
# -include annotations.pro
#
# You can add any other options that are required. For instance, if you are
# processing a library, you can still include the options from library.pro.
# The annotations are defined in the accompanying jar. For now, we'll start
# with these. You can always define your own annotations, if necessary.
-libraryjars annotations.jar
# The following annotations can be specified with classes and with class
# members.
# @Keep specifies not to shrink, optimize, or obfuscate the annotated class
# or class member as an entry point.
-keep @proguard.annotation.Keep class *
-keepclassmembers class * {
@proguard.annotation.Keep *;
}
# @KeepName specifies not to optimize or obfuscate the annotated class or
# class member as an entry point.
-keepnames @proguard.annotation.KeepName class *
-keepclassmembernames class * {
@proguard.annotation.KeepName *;
}
# The following annotations can only be specified with classes.
# @KeepImplementations and @KeepPublicImplementations specify to keep all,
# resp. all public, implementations or extensions of the annotated class as
# entry points. Note the extension of the java-like syntax, adding annotations
# before the (wild-carded) interface name.
-keep class * implements @proguard.annotation.KeepImplementations *
-keep public class * implements @proguard.annotation.KeepPublicImplementations *
# @KeepApplication specifies to keep the annotated class as an application,
# together with its main method.
-keepclasseswithmembers @proguard.annotation.KeepApplication public class * {
public static void main(java.lang.String[]);
}
# @KeepClassMembers, @KeepPublicClassMembers, and
# @KeepPublicProtectedClassMembers specify to keep all, all public, resp.
# all public or protected, class members of the annotated class from being
# shrunk, optimized, or obfuscated as entry points.
-keepclassmembers @proguard.annotation.KeepClassMembers class * {
*;
}
-keepclassmembers @proguard.annotation.KeepPublicClassMembers class * {
public *;
}
-keepclassmembers @proguard.annotation.KeepPublicProtectedClassMembers class * {
public protected *;
}
# @KeepClassMemberNames, @KeepPublicClassMemberNames, and
# @KeepPublicProtectedClassMemberNames specify to keep all, all public, resp.
# all public or protected, class members of the annotated class from being
# optimized or obfuscated as entry points.
-keepclassmembernames @proguard.annotation.KeepClassMemberNames class * {
*;
}
-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames class * {
public *;
}
-keepclassmembernames @proguard.annotation.KeepPublicProtectedClassMemberNames class * {
public protected *;
}
# @KeepGettersSetters and @KeepPublicGettersSetters specify to keep all, resp.
# all public, getters and setters of the annotated class from being shrunk,
# optimized, or obfuscated as entry points.
-keepclassmembers @proguard.annotation.KeepGettersSetters class * {
void set*(***);
void set*(int, ***);
boolean is*();
boolean is*(int);
*** get*();
*** get*(int);
}
-keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * {
public void set*(***);
public void set*(int, ***);
public boolean is*();
public boolean is*(int);
public *** get*();
public *** get*(int);
}
================================================
FILE: annotations/build.gradle
================================================
plugins {
id 'java'
id 'maven-publish'
}
sourceSets.main {
java {
srcDirs = ['src']
}
resources {
srcDirs = ['src']
include '**/*.properties'
include '**/*.gif'
include '**/*.png'
include '**/*.pro'
}
}
afterEvaluate {
publishing {
publications.getByName(project.name) {
pom {
description = 'Java annotations to configure ProGuard, the free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
}
}
}
}
================================================
FILE: annotations/src/proguard/annotation/Keep.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies not to optimize or obfuscate the annotated class or
* class member as an entry point.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface Keep {}
================================================
FILE: annotations/src/proguard/annotation/KeepApplication.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep the annotated class as an application,
* together with its a main method.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepApplication {}
================================================
FILE: annotations/src/proguard/annotation/KeepClassMemberNames.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all class members of the annotated class
* from being optimized or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepClassMemberNames {}
================================================
FILE: annotations/src/proguard/annotation/KeepClassMembers.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all class members of the annotated class
* from being shrunk, optimized, or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepClassMembers {}
================================================
FILE: annotations/src/proguard/annotation/KeepGettersSetters.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all getters and setters of the annotated
* class from being shrunk, optimized, or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepGettersSetters {}
================================================
FILE: annotations/src/proguard/annotation/KeepImplementations.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all implementations or extensions of the
* annotated class as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepImplementations {}
================================================
FILE: annotations/src/proguard/annotation/KeepName.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies not to optimize or obfuscate the annotated class or
* class member as an entry point.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepName {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicClassMemberNames.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public class members of the annotated
* class from being optimized or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicClassMemberNames {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicClassMembers.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public class members of the annotated
* class from being shrunk, optimized, or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicClassMembers {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicGettersSetters.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public getters and setters of the
* annotated class from being shrunk, optimized, or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicGettersSetters {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicImplementations.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public implementations or extensions
* of the annotated class as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicImplementations {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public or protected class members of
* the annotated class from being optimized or obfuscated as entry points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicProtectedClassMemberNames {}
================================================
FILE: annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*/
package proguard.annotation;
import java.lang.annotation.*;
/**
* This annotation specifies to keep all public or protected class members of
* the annotated class from being shrunk, optimized, or obfuscated as entry
* points.
*
* @author Eric Lafortune
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface KeepPublicProtectedClassMembers {}
================================================
FILE: ant/build.gradle
================================================
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
plugins {
id 'com.github.johnrengelman.shadow'
id 'java'
id 'maven-publish'
}
repositories {
mavenCentral()
}
sourceSets.main {
java {
srcDirs = ['src']
include '**/*.java'
}
resources {
srcDirs = ['src']
include '**/*.properties'
include '**/*.gif'
include '**/*.png'
include '**/*.pro'
}
}
dependencies {
implementation project(':base')
implementation 'org.apache.ant:ant:1.9.7'
}
task fatJar(type: ShadowJar) {
destinationDirectory.set(file("$rootDir/lib"))
archiveFileName.set('proguard-ant.jar')
from sourceSets.main.output
configurations = [project.configurations.runtimeClasspath]
manifest {
attributes(
'Manifest-Version': '1.0',
'Multi-Release': true,
'Implementation-Version': archiveVersion.get())
}
}
assemble.dependsOn fatJar
afterEvaluate {
publishing {
publications.getByName(project.name) {
pom {
description = 'Ant plugin for ProGuard, the free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
}
}
}
}
================================================
FILE: ant/src/proguard/ant/ClassPathElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import proguard.*;
import proguard.util.ListUtil;
import java.io.File;
/**
* This FileSet represents a class path entry (or a set of class path entries)
* in Ant.
*
* @author Eric Lafortune
*/
public class ClassPathElement extends Path
{
private String filter;
private String apkFilter;
private String jarFilter;
private String aarFilter;
private String warFilter;
private String earFilter;
private String zipFilter;
/**
* @see Path#Path(Project)
*/
public ClassPathElement(Project project)
{
super(project);
}
/**
* Adds the contents of this class path element to the given class path.
* @param classPath the class path to be extended.
* @param output specifies whether this is an output entry or not.
*/
public void appendClassPathEntriesTo(ClassPath classPath, boolean output)
{
File baseDir = getProject().getBaseDir();
String[] fileNames;
if (isReference())
{
// Get the referenced path or file set.
Object referencedObject = getCheckedRef(DataType.class,
DataType.class.getName());
if (referencedObject instanceof Path)
{
Path path = (Path)referencedObject;
// Get the names of the files in the referenced path.
fileNames = path.list();
}
else if (referencedObject instanceof AbstractFileSet)
{
AbstractFileSet fileSet = (AbstractFileSet)referencedObject;
// Get the names of the existing input files in the referenced file set.
DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
baseDir = scanner.getBasedir();
fileNames = scanner.getIncludedFiles();
}
else
{
throw new BuildException("The refid attribute doesn't point to a <path> element or a <fileset> element");
}
}
else
{
// Get the names of the files in this path.
fileNames = list();
}
if (output)
{
if (fileNames.length != 1)
{
throw new BuildException("The <outjar> element must specify exactly one file or directory ["+fileNames.length+"]");
}
}
//else
//{
// if (fileNames.length < 1)
// {
// throw new BuildException("The <injar> element must specify at least one file or directory");
// }
//}
for (int index = 0; index < fileNames.length; index++)
{
// Create a new class path entry, with the proper file name and
// any filters.
String fileName = fileNames[index];
File file = new File(fileName);
ClassPathEntry entry =
new ClassPathEntry(file.isAbsolute() ? file : new File(baseDir, fileName),
output);
entry.setFilter(ListUtil.commaSeparatedList(filter));
entry.setApkFilter(ListUtil.commaSeparatedList(apkFilter));
entry.setJarFilter(ListUtil.commaSeparatedList(jarFilter));
entry.setAarFilter(ListUtil.commaSeparatedList(aarFilter));
entry.setWarFilter(ListUtil.commaSeparatedList(warFilter));
entry.setEarFilter(ListUtil.commaSeparatedList(earFilter));
entry.setZipFilter(ListUtil.commaSeparatedList(zipFilter));
// Add it to the class path.
classPath.add(entry);
}
}
// Ant task attributes.
/**
* @deprecated Use {@link #setLocation(File)} instead.
*/
public void setFile(File file)
{
setLocation(file);
}
/**
* @deprecated Use {@link #setLocation(File)} instead.
*/
public void setDir(File file)
{
setLocation(file);
}
/**
* @deprecated Use {@link #setLocation(File)} instead.
*/
public void setName(File file)
{
setLocation(file);
}
public void setFilter(String filter)
{
this.filter = filter;
}
public void setApkfilter(String apkFilter)
{
this.apkFilter = apkFilter;
}
public void setJarfilter(String jarFilter)
{
this.jarFilter = jarFilter;
}
public void setAarfilter(String aarFilter)
{
this.aarFilter = aarFilter;
}
public void setWarfilter(String warFilter)
{
this.warFilter = warFilter;
}
public void setEarfilter(String earFilter)
{
this.earFilter = earFilter;
}
public void setZipfilter(String zipFilter)
{
this.zipFilter = zipFilter;
}
}
================================================
FILE: ant/src/proguard/ant/ClassSpecificationElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import proguard.*;
import proguard.classfile.*;
import proguard.classfile.util.ClassUtil;
import java.util.*;
/**
* This DataType represents a class specification in Ant.
*
* @author Eric Lafortune
*/
public class ClassSpecificationElement extends DataType
{
private static final String ANY_CLASS_KEYWORD = "*";
private String access;
private String annotation;
private String type;
private String name;
private String extendsAnnotation;
private String extends_;
private List fieldSpecifications = new ArrayList();
private List methodSpecifications = new ArrayList();
/**
* Adds the contents of this class specification element to the given list.
* @param classSpecifications the class specifications to be extended.
*/
public void appendTo(List classSpecifications)
{
// Get the referenced file set, or else this one.
ClassSpecificationElement classSpecificationElement = isReference() ?
(ClassSpecificationElement)getCheckedRef(this.getClass(),
this.getClass().getName()) :
this;
ClassSpecification classSpecification =
createClassSpecification(classSpecificationElement);
// Add it to the list.
classSpecifications.add(classSpecification);
}
/**
* Creates a new class specification corresponding to the contents of this
* class specification element.
*/
protected ClassSpecification createClassSpecification(ClassSpecificationElement classSpecificationElement)
{
String access = classSpecificationElement.access;
String annotation = classSpecificationElement.annotation;
String type = classSpecificationElement.type;
String name = classSpecificationElement.name;
String extendsAnnotation = classSpecificationElement.extendsAnnotation;
String extends_ = classSpecificationElement.extends_;
// For backward compatibility, allow a single "*" wildcard to match
// any class.
if (name != null &&
name.equals(ANY_CLASS_KEYWORD))
{
name = null;
}
ClassSpecification classSpecification =
new ClassSpecification(null,
requiredAccessFlags(true, access, type),
requiredAccessFlags(false, access, type),
annotation != null ? ClassUtil.internalType(annotation) : null,
name != null ? ClassUtil.internalClassName(name) : null,
extendsAnnotation != null ? ClassUtil.internalType(extendsAnnotation) : null,
extends_ != null ? ClassUtil.internalClassName(extends_) : null);
for (int index = 0; index < fieldSpecifications.size(); index++)
{
classSpecification.addField((MemberSpecification)fieldSpecifications.get(index));
}
for (int index = 0; index < methodSpecifications.size(); index++)
{
classSpecification.addMethod((MemberSpecification)methodSpecifications.get(index));
}
return classSpecification;
}
// Ant task attributes.
public void setAccess(String access)
{
this.access = access;
}
public void setAnnotation(String annotation)
{
this.annotation = annotation;
}
public void setType(String type)
{
this.type = type;
}
public void setName(String name)
{
this.name = name;
}
public void setExtendsannotation(String extendsAnnotation)
{
this.extendsAnnotation = extendsAnnotation;
}
public void setExtends(String extends_)
{
this.extends_ = extends_;
}
public void setImplements(String implements_)
{
this.extends_ = implements_;
}
// Ant task nested elements.
public void addConfiguredField(MemberSpecificationElement memberSpecificationElement)
{
if (fieldSpecifications == null)
{
fieldSpecifications = new ArrayList();
}
memberSpecificationElement.appendTo(fieldSpecifications,
false,
false);
}
public void addConfiguredMethod(MemberSpecificationElement memberSpecificationElement)
{
if (methodSpecifications == null)
{
methodSpecifications = new ArrayList();
}
memberSpecificationElement.appendTo(methodSpecifications,
true,
false);
}
public void addConfiguredConstructor(MemberSpecificationElement memberSpecificationElement)
{
if (methodSpecifications == null)
{
methodSpecifications = new ArrayList();
}
memberSpecificationElement.appendTo(methodSpecifications,
true,
true);
}
// Small utility methods.
private int requiredAccessFlags(boolean set,
String access,
String type)
throws BuildException
{
int accessFlags = 0;
if (access != null)
{
StringTokenizer tokenizer = new StringTokenizer(access, " ,");
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
if (token.startsWith("!") ^ set)
{
String strippedToken = token.startsWith("!") ?
token.substring(1) :
token;
int accessFlag =
strippedToken.equals(JavaAccessConstants.PUBLIC) ? AccessConstants.PUBLIC :
strippedToken.equals(JavaAccessConstants.FINAL) ? AccessConstants.FINAL :
strippedToken.equals(JavaAccessConstants.ABSTRACT) ? AccessConstants.ABSTRACT :
strippedToken.equals(JavaAccessConstants.SYNTHETIC) ? AccessConstants.SYNTHETIC :
strippedToken.equals(JavaAccessConstants.ANNOTATION) ? AccessConstants.ANNOTATION :
0;
if (accessFlag == 0)
{
throw new BuildException("Incorrect class access modifier ["+strippedToken+"]");
}
accessFlags |= accessFlag;
}
}
}
if (type != null && (type.startsWith("!") ^ set))
{
int accessFlag =
type.equals("class") ? 0 :
type.equals( JavaAccessConstants.INTERFACE) ||
type.equals("!" + JavaAccessConstants.INTERFACE) ? AccessConstants.INTERFACE :
type.equals( JavaAccessConstants.ENUM) ||
type.equals("!" + JavaAccessConstants.ENUM) ? AccessConstants.ENUM :
-1;
if (accessFlag == -1)
{
throw new BuildException("Incorrect class type ["+type+"]");
}
accessFlags |= accessFlag;
}
return accessFlags;
}
}
================================================
FILE: ant/src/proguard/ant/ConfigurationElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import proguard.*;
import java.io.*;
import java.util.Properties;
/**
* This DataType represents a reference to an XML-style ProGuard configuration
* in Ant, or a file set of ProGuard-style configuration files.
*
* @author Eric Lafortune
*/
public class ConfigurationElement extends FileSet
{
/**
* Adds the contents of this configuration element to the given
* configuration.
* @param configuration the configuration to be extended.
*/
public void appendTo(Configuration configuration)
{
File baseDir;
String[] fileNames;
if (isReference())
{
// Get the referenced path or file set.
Object referencedObject = getCheckedRef(Object.class,
Object.class.getName());
if (referencedObject instanceof ConfigurationTask)
{
// The reference doesn't point to a file set, but to a
// configuration task.
ConfigurationTask configurationTask =
(ConfigurationTask)referencedObject;
// Append the contents of the referenced configuration to the
// current configuration.
configurationTask.appendTo(configuration);
return;
}
else if (referencedObject instanceof AbstractFileSet)
{
AbstractFileSet fileSet = (AbstractFileSet)referencedObject;
// Get the names of the existing input files in the referenced file set.
DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
baseDir = scanner.getBasedir();
fileNames = scanner.getIncludedFiles();
}
else
{
throw new BuildException("The refid attribute doesn't point to a <proguardconfiguration> element or a <fileset> element");
}
}
else
{
// Get the names of the existing input files in the referenced file set.
DirectoryScanner scanner = getDirectoryScanner(getProject());
baseDir = scanner.getBasedir();
fileNames = scanner.getIncludedFiles();
}
// Get the combined system properties and Ant properties, for
// replacing ProGuard-style properties ('<...>').
Properties properties = new Properties();
properties.putAll(getProject().getProperties());
try
{
// Append the contents of the configuration files to the current
// configuration.
for (int index = 0; index < fileNames.length; index++)
{
File configurationFile = new File(baseDir, fileNames[index]);
try (ConfigurationParser parser =
new ConfigurationParser(configurationFile, properties))
{
parser.parse(configuration);
}
catch (ParseException ex)
{
throw new BuildException(ex.getMessage());
}
}
}
catch (IOException ex)
{
throw new BuildException(ex.getMessage());
}
}
}
================================================
FILE: ant/src/proguard/ant/ConfigurationTask.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.*;
import proguard.*;
import java.io.IOException;
import java.util.*;
/**
* This Task allows to define a ProGuard configuration from Ant.
*
* @author Eric Lafortune
*/
public class ConfigurationTask extends Task
{
protected final Configuration configuration = new Configuration();
/**
* Adds the contents of this configuration task to the given configuration.
* @param configuration the configuration to be extended.
*/
public void appendTo(Configuration configuration)
{
// Append all of these configuration entries to the given configuration.
configuration.programJars = extendClassPath(configuration.programJars,
this.configuration.programJars);
configuration.libraryJars = extendClassPath(configuration.libraryJars,
this.configuration.libraryJars);
configuration.keep = extendClassSpecifications(configuration.keep,
this.configuration.keep);
configuration.keepDirectories = extendList(configuration.keepDirectories,
this.configuration.keepDirectories);
configuration.whyAreYouKeeping = extendClassSpecifications(configuration.whyAreYouKeeping,
this.configuration.whyAreYouKeeping);
configuration.optimizations = extendClassSpecifications(configuration.optimizations,
this.configuration.optimizations);
configuration.assumeNoSideEffects = extendClassSpecifications(configuration.assumeNoSideEffects,
this.configuration.assumeNoSideEffects);
configuration.assumeNoExternalSideEffects = extendClassSpecifications(configuration.assumeNoExternalSideEffects,
this.configuration.assumeNoExternalSideEffects);
configuration.assumeNoEscapingParameters = extendClassSpecifications(configuration.assumeNoEscapingParameters,
this.configuration.assumeNoEscapingParameters);
configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues,
this.configuration.assumeNoExternalReturnValues);
configuration.assumeValues = extendClassSpecifications(configuration.assumeValues,
this.configuration.assumeValues);
configuration.keepPackageNames = extendList(configuration.keepPackageNames,
this.configuration.keepPackageNames);
configuration.keepAttributes = extendList(configuration.keepAttributes,
this.configuration.keepAttributes);
configuration.adaptClassStrings = extendList(configuration.adaptClassStrings,
this.configuration.adaptClassStrings);
configuration.adaptResourceFileNames = extendList(configuration.adaptResourceFileNames,
this.configuration.adaptResourceFileNames);
configuration.adaptResourceFileContents = extendList(configuration.adaptResourceFileContents,
this.configuration.adaptResourceFileContents);
configuration.note = extendList(configuration.note,
this.configuration.note);
configuration.warn = extendList(configuration.warn,
this.configuration.warn);
}
// Ant task nested elements.
public void addConfiguredInjar(ClassPathElement classPathElement)
{
configuration.programJars = extendClassPath(configuration.programJars,
classPathElement,
false);
}
public void addConfiguredOutjar(ClassPathElement classPathElement)
{
configuration.programJars = extendClassPath(configuration.programJars,
classPathElement,
true);
}
public void addConfiguredLibraryjar(ClassPathElement classPathElement)
{
configuration.libraryJars = extendClassPath(configuration.libraryJars,
classPathElement,
false);
}
public void addConfiguredKeepdirectory(FilterElement filterElement)
{
configuration.keepDirectories = extendFilter(configuration.keepDirectories,
filterElement);
}
public void addConfiguredKeepdirectories(FilterElement filterElement)
{
configuration.keepDirectories = extendFilter(configuration.keepDirectories,
filterElement);
}
public void addConfiguredKeep(KeepSpecificationElement keepSpecificationElement)
{
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
true,
true,
false);
}
public void addConfiguredKeepclassmembers(KeepSpecificationElement keepSpecificationElement)
{
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
false,
true,
false);
}
public void addConfiguredKeepclasseswithmembers(KeepSpecificationElement keepSpecificationElement)
{
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
true,
true,
true);
}
public void addConfiguredKeepnames(KeepSpecificationElement keepSpecificationElement)
{
// Set the shrinking flag, based on the name (backward compatibility).
keepSpecificationElement.setAllowshrinking(true);
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
true,
true,
false);
}
public void addConfiguredKeepclassmembernames(KeepSpecificationElement keepSpecificationElement)
{
// Set the shrinking flag, based on the name (backward compatibility).
keepSpecificationElement.setAllowshrinking(true);
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
false,
true,
false);
}
public void addConfiguredKeepclasseswithmembernames(KeepSpecificationElement keepSpecificationElement)
{
// Set the shrinking flag, based on the name (backward compatibility).
keepSpecificationElement.setAllowshrinking(true);
configuration.keep = extendKeepSpecifications(configuration.keep,
keepSpecificationElement,
true,
true,
true);
}
public void addConfiguredWhyareyoukeeping(ClassSpecificationElement classSpecificationElement)
{
configuration.whyAreYouKeeping = extendClassSpecifications(configuration.whyAreYouKeeping,
classSpecificationElement);
}
public void addConfiguredAssumenosideeffects(ClassSpecificationElement classSpecificationElement)
{
configuration.assumeNoSideEffects = extendClassSpecifications(configuration.assumeNoSideEffects,
classSpecificationElement);
}
public void addConfiguredAssumenoexternalsideeffects(ClassSpecificationElement classSpecificationElement)
{
configuration.assumeNoExternalSideEffects = extendClassSpecifications(configuration.assumeNoExternalSideEffects,
classSpecificationElement);
}
public void addConfiguredAssumenoescapingparameters(ClassSpecificationElement classSpecificationElement)
{
configuration.assumeNoEscapingParameters = extendClassSpecifications(configuration.assumeNoEscapingParameters,
classSpecificationElement);
}
public void addConfiguredAssumenoexternalreturnvalues(ClassSpecificationElement classSpecificationElement)
{
configuration.assumeNoExternalReturnValues = extendClassSpecifications(configuration.assumeNoExternalReturnValues,
classSpecificationElement);
}
public void addConfiguredAssumevalues(ClassSpecificationElement classSpecificationElement)
{
configuration.assumeValues = extendClassSpecifications(configuration.assumeValues,
classSpecificationElement);
}
public void addConfiguredOptimizations(FilterElement filterElement)
{
addConfiguredOptimization(filterElement);
}
public void addConfiguredOptimization(FilterElement filterElement)
{
configuration.optimizations = extendFilter(configuration.optimizations,
filterElement);
}
public void addConfiguredKeeppackagename(FilterElement filterElement)
{
configuration.keepPackageNames = extendFilter(configuration.keepPackageNames,
filterElement,
true);
}
public void addConfiguredKeeppackagenames(FilterElement filterElement)
{
configuration.keepPackageNames = extendFilter(configuration.keepPackageNames,
filterElement,
true);
}
public void addConfiguredKeepattributes(FilterElement filterElement)
{
addConfiguredKeepattribute(filterElement);
}
public void addConfiguredKeepattribute(FilterElement filterElement)
{
configuration.keepAttributes = extendFilter(configuration.keepAttributes,
filterElement);
}
public void addConfiguredAdaptclassstrings(FilterElement filterElement)
{
configuration.adaptClassStrings = extendFilter(configuration.adaptClassStrings,
filterElement, true);
}
public void addConfiguredAdaptresourcefilenames(FilterElement filterElement)
{
configuration.adaptResourceFileNames = extendFilter(configuration.adaptResourceFileNames,
filterElement);
}
public void addConfiguredAdaptresourcefilecontents(FilterElement filterElement)
{
configuration.adaptResourceFileContents = extendFilter(configuration.adaptResourceFileContents,
filterElement);
}
public void addConfiguredDontnote(FilterElement filterElement)
{
configuration.note = extendFilter(configuration.note, filterElement, true);
}
public void addConfiguredDontwarn(FilterElement filterElement)
{
configuration.warn = extendFilter(configuration.warn, filterElement, true);
}
public void addConfiguredConfiguration(ConfigurationElement configurationElement)
{
configurationElement.appendTo(configuration);
}
// Implementations for Task.
public void addText(String text) throws BuildException
{
try
{
Project project = getProject();
// Replace Ant-style properties ('${...}').
String arg = project.replaceProperties(text);
// Get the combined system properties and Ant properties, for
// replacing ProGuard-style properties ('<...>').
Properties properties = new Properties();
properties.putAll(project.getProperties());
try (ConfigurationParser parser = new ConfigurationParser(arg,
"embedded configuration",
project.getBaseDir(),
properties))
{
parser.parse(configuration);
}
catch (ParseException ex)
{
throw new BuildException(ex.getMessage());
}
}
catch (IOException ex)
{
throw new BuildException(ex.getMessage());
}
}
// Small utility methods.
private ClassPath extendClassPath(ClassPath classPath,
ClassPathElement classPathElement,
boolean output)
{
if (classPath == null)
{
classPath = new ClassPath();
}
classPathElement.appendClassPathEntriesTo(classPath,
output);
return classPath;
}
private ClassPath extendClassPath(ClassPath classPath,
ClassPath additionalClassPath)
{
if (additionalClassPath != null)
{
if (classPath == null)
{
classPath = new ClassPath();
}
classPath.addAll(additionalClassPath);
}
return classPath;
}
private List extendKeepSpecifications(List keepSpecifications,
KeepSpecificationElement keepSpecificationElement,
boolean markClasses,
boolean markClassMembers,
boolean markClassesConditionally)
{
if (keepSpecifications == null)
{
keepSpecifications = new ArrayList();
}
keepSpecificationElement.appendTo(keepSpecifications,
markClasses,
markClassMembers,
markClassesConditionally);
return keepSpecifications;
}
private List extendClassSpecifications(List classSpecifications,
ClassSpecificationElement classSpecificationElement)
{
if (classSpecifications == null)
{
classSpecifications = new ArrayList();
}
classSpecificationElement.appendTo(classSpecifications);
return classSpecifications;
}
private List extendClassSpecifications(List classSpecifications,
List additionalClassSpecifications)
{
if (additionalClassSpecifications != null)
{
if (classSpecifications == null)
{
classSpecifications = new ArrayList();
}
classSpecifications.addAll(additionalClassSpecifications);
}
return classSpecifications;
}
private List extendFilter(List filter,
FilterElement filterElement)
{
return extendFilter(filter, filterElement, false);
}
private List extendFilter(List filter,
FilterElement filterElement,
boolean internal)
{
if (filter == null)
{
filter = new ArrayList();
}
filterElement.appendTo(filter, internal);
return filter;
}
private List extendList(List list,
List additionalList)
{
if (additionalList != null)
{
if (list == null)
{
list = new ArrayList();
}
list.addAll(additionalList);
}
return list;
}
}
================================================
FILE: ant/src/proguard/ant/FilterElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.types.DataType;
import proguard.classfile.util.ClassUtil;
import proguard.util.ListUtil;
import java.util.List;
/**
* This DataType represents a name filter in Ant.
*
* @author Eric Lafortune
*/
public class FilterElement extends DataType
{
private String filter;
/**
* Adds the contents of this element to the given name filter.
* @param filter the list of attributes to be extended.
* @param internal specifies whether the filter string should be converted
* to internal types.
*/
public void appendTo(List filter, boolean internal)
{
// Get the referenced element, or else this one.
FilterElement filterElement = isReference() ?
(FilterElement)getCheckedRef(this.getClass(),
this.getClass().getName()) :
this;
String filterString = filterElement.filter;
if (filterString == null)
{
// Clear the filter to keep all names.
filter.clear();
}
else
{
if (internal)
{
filterString = ClassUtil.internalClassName(filterString);
}
// Append the filter.
filter.addAll(ListUtil.commaSeparatedList(filterString));
}
}
// Ant task attributes.
public void setName(String name)
{
this.filter = name;
}
public void setFilter(String filter)
{
this.filter = filter;
}
}
================================================
FILE: ant/src/proguard/ant/KeepSpecificationElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import proguard.KeepClassSpecification;
import java.util.List;
/**
* This DataType represents a class specification in Ant.
*
* @author Eric Lafortune
*/
public class KeepSpecificationElement extends ClassSpecificationElement
{
private boolean markDescriptorClasses;
private boolean markCodeAttributes;
private boolean allowShrinking;
private boolean allowOptimization;
private boolean allowObfuscation;
/**
* Adds the contents of this class specification element to the given list.
* @param keepSpecifications the class specifications to be extended.
* @param markClasses specifies whether to mark the classes.
* @param markConditionally specifies whether to mark the classes
* and class members conditionally.
*/
public void appendTo(List keepSpecifications,
boolean markClasses,
boolean markClassMembers,
boolean markConditionally)
{
// Get the referenced file set, or else this one.
KeepSpecificationElement keepSpecificationElement = isReference() ?
(KeepSpecificationElement)getCheckedRef(this.getClass(),
this.getClass().getName()) :
this;
KeepClassSpecification keepClassSpecification =
new KeepClassSpecification(markClasses,
markClassMembers,
markConditionally,
markDescriptorClasses,
markCodeAttributes,
allowShrinking,
allowOptimization,
allowObfuscation,
null,
createClassSpecification(keepSpecificationElement));
// Add it to the list.
keepSpecifications.add(keepClassSpecification);
}
// Ant task attributes.
public void setIncludedescriptorclasses(boolean markDescriptorClasses)
{
this.markDescriptorClasses = markDescriptorClasses;
}
public void setIncludecode(boolean markCodeAttributes)
{
this.markCodeAttributes = markCodeAttributes;
}
public void setAllowshrinking(boolean allowShrinking)
{
this.allowShrinking = allowShrinking;
}
public void setAllowoptimization(boolean allowOptimization)
{
this.allowOptimization = allowOptimization;
}
public void setAllowobfuscation(boolean allowObfuscation)
{
this.allowObfuscation = allowObfuscation;
}
}
================================================
FILE: ant/src/proguard/ant/MemberSpecificationElement.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import proguard.*;
import proguard.classfile.*;
import proguard.classfile.util.ClassUtil;
import proguard.util.ListUtil;
import java.util.*;
/**
* This DataType represents a class member specification in Ant.
*
* @author Eric Lafortune
*/
public class MemberSpecificationElement extends DataType
{
private String access;
private String annotation;
private String type;
private String name;
private String parameters;
private String values;
/**
* Adds the contents of this class member specification element to the given
* list.
* @param memberSpecifications the class member specifications to be
* extended.
* @param isMethod specifies whether this specification
* refers to a method.
* @param isConstructor specifies whether this specification
* refers to a constructor.
*/
public void appendTo(List memberSpecifications,
boolean isMethod,
boolean isConstructor)
{
// Get the referenced file set, or else this one.
MemberSpecificationElement memberSpecificationElement = isReference() ?
(MemberSpecificationElement)getCheckedRef(this.getClass(),
this.getClass().getName()) :
this;
// Create a new class member specification.
String access = memberSpecificationElement.access;
String type = memberSpecificationElement.type;
String annotation = memberSpecificationElement.annotation;
String name = memberSpecificationElement.name;
String parameters = memberSpecificationElement.parameters;
String values = memberSpecificationElement.values;
// Perform some basic conversions and checks on the attributes.
if (annotation != null)
{
annotation = ClassUtil.internalType(annotation);
}
if (isMethod)
{
if (isConstructor)
{
if (type != null)
{
throw new BuildException("Type attribute not allowed in constructor specification ["+type+"]");
}
if (parameters != null)
{
type = JavaTypeConstants.VOID;
}
if (values != null)
{
throw new BuildException("Values attribute not allowed in constructor specification ["+values+"]");
}
name = ClassConstants.METHOD_NAME_INIT;
}
else if ((type != null) ^ (parameters != null))
{
throw new BuildException("Type and parameters attributes must always be present in combination in method specification");
}
}
else
{
if (parameters != null)
{
throw new BuildException("Parameters attribute not allowed in field specification ["+parameters+"]");
}
}
if (values != null)
{
if (type == null)
{
throw new BuildException("Values attribute must be specified in combination with type attribute in class member specification ["+values+"]");
}
}
List parameterList = ListUtil.commaSeparatedList(parameters);
String descriptor =
parameters != null ? ClassUtil.internalMethodDescriptor(type, parameterList) :
type != null ? ClassUtil.internalType(type) :
null;
MemberSpecification memberSpecification = values != null ?
new MemberValueSpecification(requiredAccessFlags(true, access),
requiredAccessFlags(false, access),
annotation,
name,
descriptor,
parseValues(type,
ClassUtil.internalType(type),
values)) :
new MemberSpecification(requiredAccessFlags(true, access),
requiredAccessFlags(false, access),
annotation,
name,
descriptor);
// Add it to the list.
memberSpecifications.add(memberSpecification);
}
// Ant task attributes.
public void setAccess(String access)
{
this.access = access;
}
public void setAnnotation(String annotation)
{
this.annotation = annotation;
}
public void setType(String type)
{
this.type = type;
}
public void setName(String name)
{
this.name = name;
}
public void setParameters(String parameters)
{
this.parameters = parameters;
}
/**
* @deprecated Use {@link #setParameters(String)} instead.
*/
public void setParam(String parameters)
{
this.parameters = parameters;
}
public void setValues(String values)
{
this.values = values;
}
// Small utility methods.
private int requiredAccessFlags(boolean set,
String access)
throws BuildException
{
int accessFlags = 0;
if (access != null)
{
StringTokenizer tokenizer = new StringTokenizer(access, " ,");
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
if (token.startsWith("!") ^ set)
{
String strippedToken = token.startsWith("!") ?
token.substring(1) :
token;
int accessFlag =
strippedToken.equals(JavaAccessConstants.PUBLIC) ? AccessConstants.PUBLIC :
strippedToken.equals(JavaAccessConstants.PRIVATE) ? AccessConstants.PRIVATE :
strippedToken.equals(JavaAccessConstants.PROTECTED) ? AccessConstants.PROTECTED :
strippedToken.equals(JavaAccessConstants.STATIC) ? AccessConstants.STATIC :
strippedToken.equals(JavaAccessConstants.FINAL) ? AccessConstants.FINAL :
strippedToken.equals(JavaAccessConstants.SYNCHRONIZED) ? AccessConstants.SYNCHRONIZED :
strippedToken.equals(JavaAccessConstants.VOLATILE) ? AccessConstants.VOLATILE :
strippedToken.equals(JavaAccessConstants.TRANSIENT) ? AccessConstants.TRANSIENT :
strippedToken.equals(JavaAccessConstants.BRIDGE) ? AccessConstants.BRIDGE :
strippedToken.equals(JavaAccessConstants.VARARGS) ? AccessConstants.VARARGS :
strippedToken.equals(JavaAccessConstants.NATIVE) ? AccessConstants.NATIVE :
strippedToken.equals(JavaAccessConstants.ABSTRACT) ? AccessConstants.ABSTRACT :
strippedToken.equals(JavaAccessConstants.STRICT) ? AccessConstants.STRICT :
strippedToken.equals(JavaAccessConstants.SYNTHETIC) ? AccessConstants.SYNTHETIC :
0;
if (accessFlag == 0)
{
throw new BuildException("Incorrect class member access modifier ["+strippedToken+"]");
}
accessFlags |= accessFlag;
}
}
}
return accessFlags;
}
/**
* Parses the given string as a value or value range of the given primitive
* type. For example, values "123" or "100..199" of type "int" ("I").
*/
private Number[] parseValues(String externalType,
String internalType,
String string)
throws BuildException
{
int rangeIndex = string.lastIndexOf("..");
return rangeIndex >= 0 ?
new Number[]
{
parseValue(externalType, internalType, string.substring(0, rangeIndex)),
parseValue(externalType, internalType, string.substring(rangeIndex + 2))
} :
new Number[]
{
parseValue(externalType, internalType, string)
};
}
/**
* Parses the given string as a value of the given primitive type.
* For example, value "123" of type "int" ("I").
* For example, value "true" of type "boolean" ("Z"), returned as 1.
*/
private Number parseValue(String externalType,
String internalType,
String string)
throws BuildException
{
try
{
switch (internalType.charAt(0))
{
case TypeConstants.BOOLEAN:
{
return parseBoolean(string);
}
case TypeConstants.BYTE:
case TypeConstants.CHAR:
case TypeConstants.SHORT:
case TypeConstants.INT:
{
return Integer.decode(string);
}
//case TypeConstants.LONG:
//{
// return Long.decode(string);
//}
//case TypeConstants.FLOAT:
//{
// return Float.valueOf(string);
//}
//case TypeConstants.DOUBLE:
//{
// return Double.valueOf(string);
//}
default:
{
throw new BuildException("Can't handle '"+externalType+"' constant ["+string+"]");
}
}
}
catch (NumberFormatException e)
{
throw new BuildException("Can't parse "+externalType+" constant ["+string+"]");
}
}
/**
* Parses the given boolean string as an integer (0 or 1).
*/
private Integer parseBoolean(String string)
throws BuildException
{
if ("false".equals(string))
{
return Integer.valueOf(0);
}
else if ("true".equals(string))
{
return Integer.valueOf(1);
}
else
{
throw new BuildException("Unknown boolean constant ["+string+"]");
}
}
}
================================================
FILE: ant/src/proguard/ant/ProGuardTask.java
================================================
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.ant;
import org.apache.tools.ant.BuildException;
import proguard.*;
import proguard.classfile.util.ClassUtil;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* This Task allows to configure and run ProGuard from Ant.
*
* @author Eric Lafortune
*/
public class ProGuardTask extends ConfigurationTask
{
// Ant task attributes.
public void setConfiguration(File configurationFile) throws BuildException
{
try
{
// Get the combined system properties and Ant properties, for
// replacing ProGuard-style properties ('<...>').
Properties properties = new Properties();
properties.putAll(getProject().getProperties());
URL configUrl =
ConfigurationElement.class.getResource(configurationFile.toString());
try (ConfigurationParser parser = configUrl != null ?
new ConfigurationParser(configUrl, properties) :
new ConfigurationParser(configurationFile, properties))
{
parser.parse(configuration);
}
catch (ParseException e)
{
throw new BuildException(e.getMessage(), e);
}
}
catch (IOException e)
{
throw new BuildException(e.getMessage(), e);
}
}
/**
* @deprecated Use the nested outjar element instead.
*/
public void setOutjar(String parameters)
{
throw new BuildException("Use the <outjar> nested element instead of the 'outjar' attribute");
}
public void setSkipnonpubliclibraryclasses(boolean skipNonPublicLibraryClasses)
{
configuration.skipNonPublicLibraryClasses = skipNonPublicLibraryClasses;
}
public void setSkipnonpubliclibraryclassmembers(boolean skipNonPublicLibraryClassMembers)
{
configuration.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembers;
}
public void setTarget(String target)
{
configuration.targetClassVersion = ClassUtil.internalClassVersion(target);
if (configuration.targetClassVersion == 0)
{
throw new BuildException("Unsupported target '"+target+"'");
}
}
public void setForceprocessing(boolean forceProcessing)
{
configuration.lastModified = forceProcessing ? Long.MAX_VALUE : 0;
}
public void setPrintseeds(File printSeeds)
{
configuration.printSeeds = optionalFile(printSeeds);
}
public void setShrink(boolean shrink)
{
configuration.shrink = shrink;
}
public void setPrintusage(File printUsage)
{
configuration.printUsage = optionalFile(printUsage);
}
public void setOptimize(boolean optimize)
{
configuration.optimize = optimize;
}
public void setOptimizationpasses(int optimizationPasses)
{
configuration.optimizationPasses = optimizationPasses;
}
public void setAllowaccessmodification(boolean allowAccessModification)
{
configuration.allowAccessModification = allowAccessModification;
}
public void setMergeinterfacesaggressively(boolean mergeinterfacesaggressively)
{
configuration.mergeInterfacesAggressively = mergeinterfacesaggressively;
}
public void setObfuscate(boolean obfuscate)
{
configuration.obfuscate = obfuscate;
}
public void setPrintmapping(File printMapping)
{
configuration.printMapping = optionalFile(printMapping);
}
public void setApplymapping(File applyMapping)
{
configuration.applyMapping = resolvedFile(applyMapping);
}
public void setObfuscationdictionary(File obfuscationDictionary)
{
configuration.obfuscationDictionary = resolvedURL(obfuscationDictionary);
}
public void setClassobfuscationdictionary(File classObfuscationDictionary)
{
configuration.classObfuscationDictionary = resolvedURL(classObfuscationDictionary);
}
public void setPackageobfuscationdictionary(File packageObfuscationDictionary)
{
configuration.packageObfuscationDictionary = resolvedURL(packageObfuscationDictionary);
}
public void setOverloadaggressively(boolean overloadAggressively)
{
configuration.overloadAggressively = overloadAggressively;
}
public void setUseuniqueclassmembernames(boolean useUniqueClassMemberNames)
{
configuration.useUniqueClassMemberNames = useUniqueClassMemberNames;
}
public void setUsemixedcaseclassnames(boolean useMixedCaseClassNames)
{
configuration.useMixedCaseClassNames = useMixedCaseClassNames;
}
public void setFlattenpackagehierarchy(String flattenPackageHierarchy)
{
configuration.flattenPackageHierarchy = ClassUtil.internalClassName(flattenPackageHierarchy);
}
public void setRepackageclasses(String repackageClasses)
{
configuration.repackageClasses = ClassUtil.internalClassName(repackageClasses);
}
/**
* @deprecated Use the repackageclasses attribute instead.
*/
public void setDefaultpackage(String defaultPackage)
{
configuration.repackageClasses = ClassUtil.internalClassName(defaultPackage);
}
public void setKeepparameternames(boolean keepParameterNames)
{
configuration.keepParameterNames = keepParameterNames;
}
public void setRenamesourcefileattribute(String newSourceFileAttribute)
{
configuration.newSourceFileAttribute = newSourceFileAttribute;
}
public void setPreverify(boolean preverify)
{
configuration.preverify = preverify;
}
public void setMicroedition(boolean microEdition)
{
configuration.microEdition = microEdition;
}
public void setAndroid(boolean android)
{
configuration.android = android;
}
public void setVerbose(boolean verbose)
{
configuration.verbose = verbose;
}
public void setNote(boolean note)
{
if (note)
{
// Switch on notes if they were completely disabled.
if (configuration.note != null &&
configuration.note.isEmpty())
{
configuration.note = null;
}
}
else
{
// Switch off notes.
configuration.note = new ArrayList();
}
}
public void setWarn(boolean warn)
{
if (warn)
{
// Switch on warnings if they were completely disabled.
if (configuration.warn != null &&
configuration.warn.isEmpty())
{
configuration.warn = null;
}
}
else
{
// Switch off warnings.
configuration.warn = new ArrayList();
}
}
public void setIgnorewarnings(boolean ignoreWarnings)
{
configuration.ignoreWarnings = ignoreWarnings;
}
public void setPrintconfiguration(File printConfiguration)
{
configuration.printConfiguration = optionalFile(printConfiguration);
}
public void setDump(File dump)
{
configuration.dump = optionalFile(dump);
}
public void setAddconfigurationdebugging(boolean addConfigurationDebugging)
{
configuration.addConfigurationDebugging = addConfigurationDebugging;
}
public void setKeepkotlinmetadata(boolean keepKotlinMetadata)
{
configuration.keepKotlinMetadata = keepKotlinMetadata;
}
// Implementations for Task.
public void execute() throws BuildException
{
try
{
ProGuard proGuard = new ProGuard(configuration);
proGuard.execute();
}
catch (Exception e)
{
throw new BuildException(e.getMessage(), e);
}
}
// Small utility methods.
/**
* Returns a file that is properly resolved with respect to the project
* directory, or <code>null</code> or empty if its name is actually a
* boolean flag.
*/
private File optionalFile(File file)
{
String fileName = file.getName();
return
fileName.equalsIgnoreCase("false") ||
fileName.equalsIgnoreCase("no") ||
fileName.equalsIgnoreCase("off") ? null :
fileName.equalsIgnoreCase("true") ||
fileName.equalsIgnoreCase("yes") ||
fileName.equalsIgnoreCase("on") ? Configuration.STD_OUT :
resolvedFile(file);
}
/**
* Returns a URL that is properly resolved with respect to the project
* directory.
*/
private URL resolvedURL(File file)
{
try
{
return resolvedFile(file).toURI().toURL();
}
catch (MalformedURLException e)
{
return null;
}
}
/**
* Returns a file that is properly resolved with respect to the project
* directory.
*/
private File resolvedFile(File file)
{
return file.isAbsolute() ? file :
new File(getProject().getBaseDir(),
file.getName());
}
}
================================================
FILE: ant/src/proguard/ant/package.html
================================================
<body>
This package contains the Ant task for ProGuard.
</body>
================================================
FILE: ant/src/proguard/ant/task.properties
================================================
proguard = proguard.ant.ProGuardTask
proguardconfiguration = proguard.ant.ConfigurationTask
================================================
FILE: base/build.gradle
================================================
plugins {
id 'java-library'
id 'java-test-fixtures'
id 'maven-publish'
id "org.jetbrains.kotlin.jvm" version "$kotlinVersion"
id 'com.adarshr.test-logger' version '3.0.0'
id 'de.jansauer.printcoverage' version '2.0.0'
id 'jacoco'
id "org.jlleitschuh.gradle.ktlint" version '10.2.1'
}
repositories {
mavenCentral()
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = "${target}"
}
}
dependencies {
api "re.obfuscator:dprotect-core:${dprotectCoreVersion}"
implementation "com.google.code.gson:gson:${gsonVersion}"
implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
implementation 'org.json:json:20220924'
testImplementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
testImplementation 'dev.zacsweers.kctfork:core:0.2.1'
testImplementation 'io.kotest:kotest-runner-junit5-jvm:5.5.4' // for kotest framework
testImplementation 'io.kotest:kotest-assertions-core-jvm:5.5.4' // for kotest core jvm assertions
testImplementation 'io.kotest:kotest-property-jvm:5.5.4' // for kotest property test
testImplementation 'io.mockk:mockk:1.13.2' // for mocking
testImplementation(testFixtures("com.guardsquare:proguard-core:9.0.8")) {
exclude group: 'com.guardsquare', module: 'proguard-core'
}
}
jar {
manifest {
attributes(
'Multi-Release': true,
'Implementation-Version': archiveVersion.get())
}
}
// Early access automatic downloads are not yet supported:
// https://github.com/gradle/gradle/issues/14814
// But it will work if e.g. Java N-ea is pre-installed
def javaVersionsForTest = 9..19
test {
useJUnitPlatform()
}
task testAllJavaVersions() { testAllTask ->
dependsOn(test) // the usual test runs on Java 8
javaVersionsForTest.each {version ->
task("testJava$version", type: Test) {
useJUnitPlatform()
ignoreFailures = true
// The version of bytebuddy used by mockk only supports Java 20 experimentally so far
if (version == 20) systemProperty 'net.bytebuddy.experimental', true
testAllTask.dependsOn(it)
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(version)
}
}
}
}
jacocoTestReport {
// Define which classes need to be monitored
def sources = files(project.sourceSets.main.allSource.srcDirs)
sourceDirectories.setFrom(sources)
additionalSourceDirs.setFrom(sources)
sourceDirectories.setFrom(sources)
def classes = files(project.sourceSets.main.output.classesDirs)
classDirectories.setFrom(classes)
executionData.setFrom project.fileTree(dir: '.', include: '**/build/jacoco/*.exec')
reports {
xml.enabled true
csv.enabled false
html.destination file("${buildDir}/reports/coverage")
}
}
afterEvaluate {
publishing {
publications.getByName(project.name) {
pom {
description = 'ProGuard is a free shrinker, optimizer, obfuscator, and preverifier for Java bytecode'
}
}
}
}
================================================
FILE: base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;
public class ArithmeticObfuscationClassSpecification extends ObfuscationClassSpecification
{
public final boolean skipFloat;
public ArithmeticObfuscationClassSpecification(ClassSpecification classSpecification,
Level level,
boolean skipFloat)
{
super(classSpecification, level);
this.skipFloat = false;
}
@Override
public boolean equals(Object object)
{
if (object == null ||
this.getClass() != object.getClass())
{
return false;
}
ArithmeticObfuscationClassSpecification other = (ArithmeticObfuscationClassSpecification)object;
return
this.skipFloat == other.skipFloat &&
super.equals(other);
}
@Override
public int hashCode()
{
return
(skipFloat ? 0 : 1) ^
super.hashCode();
}
@Override
public Object clone()
{
return super.clone();
}
}
================================================
FILE: base/src/main/java/dprotect/CFObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;
public class CFObfuscationClassSpecification extends ObfuscationClassSpecification
{
public CFObfuscationClassSpecification(ClassSpecification classSpecification,
Level level)
{
super(classSpecification, level);
}
@Override
public boolean equals(Object object)
{
if (object == null ||
this.getClass() != object.getClass())
{
return false;
}
CFObfuscationClassSpecification other = (CFObfuscationClassSpecification)object;
return super.equals(other);
}
@Override
public int hashCode()
{
return super.hashCode();
}
@Override
public Object clone()
{
return super.clone();
}
}
================================================
FILE: base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java
================================================
package dprotect;
import proguard.ClassSpecificationVisitorFactory;
import proguard.classfile.visitor.*;
import java.util.List;
import java.util.function.Function;
public class ClassObfuSpecVisitorFactory extends ClassSpecificationVisitorFactory
{
public ClassPoolVisitor createClassPoolVisitor(List classSpecifications,
Function<ObfuscationClassSpecification, ClassVisitor> classCreator,
Function<ObfuscationClassSpecification, MemberVisitor> memberCreator)
{
MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor();
if (classSpecifications != null)
{
for (int index = 0; index < classSpecifications.size(); index++)
{
ObfuscationClassSpecification classSpecification =
(ObfuscationClassSpecification)classSpecifications.get(index);
ClassVisitor classVisitor = null;
MemberVisitor memberVisitor = null;
if (classCreator != null)
{
classVisitor = classCreator.apply(classSpecification);
}
if (memberCreator != null)
{
memberVisitor = memberCreator.apply(classSpecification);
}
multiClassPoolVisitor.addClassPoolVisitor(
super.createClassPoolVisitor(classSpecification,
classVisitor,
memberVisitor,
memberVisitor,
null,
null));
}
}
return multiClassPoolVisitor;
}
}
================================================
FILE: base/src/main/java/dprotect/Configuration.java
================================================
package dprotect;
import proguard.ClassSpecification;
import java.util.*;
/**
* The extended dProtect configuration based on Proguard
* @author Romain Thomas
*/
public class Configuration extends proguard.Configuration
{
///////////////////////////////////////////////////////////////////////////
// Obfuscation options.
///////////////////////////////////////////////////////////////////////////
/**
* These options are used for deobfuscation purpose and
* should not be used right now.
*/
public ClassSpecification deobfStrDecodeName;
public String deobfStrXorKey;
/**
* List of obfuscation passes enbled
*/
public List<String> obfuscations;
/**
* List of classes which must be constant-obfuscated
*/
public List<ConstantObfuscationClassSpecification> obfuscateConstants;
/**
* List of classes which must be control-flow-obfuscated
*/
public List<CFObfuscationClassSpecification> obfuscateControlFlow;
/**
* List of classes for which arithmetic operations must
* be obfuscated
*/
public List<ArithmeticObfuscationClassSpecification> obfuscateArithmetic;
/**
* List of classes for which strings must be obfuscated
*/
public List<ClassSpecification> obfuscateStrings;
/**
* List of string that must also be obfuscated
*/
public List<String> obfuscateStringsList;
/**
* Seed used for the random generator of obfuscation passes
*/
public Integer seed = null;
}
================================================
FILE: base/src/main/java/dprotect/ConfigurationConstants.java
================================================
package dprotect;
public class ConfigurationConstants extends proguard.ConfigurationConstants
{
public static final String OBFUSCATIONS = "-obfuscations";
public static final String OBFUSCATION_SEED = "-obfuscation-seed";
public static final String OBFUSCATE_STRING = "-obfuscate-strings";
public static final String OBFUSCATE_ARITHMETIC = "-obfuscate-arithmetic";
public static final String OBFUSCATE_CONSTANTS = "-obfuscate-constants";
public static final String OBFUSCATE_CONTROL_FLOW = "-obfuscate-control-flow";
public static final String OBFUCATION_LEVEL_LOW = "low";
public static final String OBFUCATION_LEVEL_MEDIUM = "medium";
public static final String OBFUCATION_LEVEL_HIGH = "high";
public static final String ARITHMETIC_OPT_SKIP_FLOAT = "skipfloat";
public static final String DEOBFUSCATE_XOR_STRINGS_DECODE_NAME = "-deobfuscate-xor-strings-decode-name";
public static final String DEOBFUSCATE_XOR_STRINGS_KEY = "-deobfuscate-xor-strings-key";
}
================================================
FILE: base/src/main/java/dprotect/ConfigurationParser.java
================================================
package dprotect;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.ClassSpecification;
import proguard.ParseException;
import proguard.WordReader;
import proguard.classfile.JavaAccessConstants;
import proguard.classfile.util.ClassUtil;
import java.io.*;
import java.net.*;
import java.util.*;
public class ConfigurationParser extends proguard.ConfigurationParser
{
private static final Logger logger = LogManager.getLogger(ConfigurationParser.class);
public ConfigurationParser(String[] args,
Properties properties) throws IOException
{
super(args, properties);
}
public ConfigurationParser(String[] args,
File baseDir,
Properties properties) throws IOException
{
super(args, baseDir, properties);
}
public ConfigurationParser(String lines,
String description,
File baseDir,
Properties properties) throws IOException
{
super(lines, description, baseDir, properties);
}
public ConfigurationParser(File file) throws IOException
{
super(file);
}
public ConfigurationParser(File file,
Properties properties) throws IOException
{
super(file, properties);
}
public ConfigurationParser(URL url,
Properties properties) throws IOException
{
super(url, properties);
}
public ConfigurationParser(WordReader reader,
Properties properties) throws IOException
{
super(reader, properties);
}
public void parse(Configuration configuration)
throws ParseException, IOException
{
while (nextWord != null)
{
lastComments = reader.lastComments();
// First include directives.
if (ConfigurationConstants.AT_DIRECTIVE .startsWith(nextWord) ||
ConfigurationConstants.INCLUDE_DIRECTIVE .startsWith(nextWord)) configuration.lastModified = super.parseIncludeArgument(configuration.lastModified);
else if (ConfigurationConstants.BASE_DIRECTORY_DIRECTIVE .startsWith(nextWord)) super.parseBaseDirectoryArgument();
// Then configuration options with or without arguments.
else if (ConfigurationConstants.INJARS_OPTION .startsWith(nextWord)) configuration.programJars = super.parseClassPathArgument(configuration.programJars, false, true);
else if (ConfigurationConstants.OUTJARS_OPTION .startsWith(nextWord)) configuration.programJars = super.parseClassPathArgument(configuration.programJars, true, false);
else if (ConfigurationConstants.LIBRARYJARS_OPTION .startsWith(nextWord)) configuration.libraryJars = super.parseClassPathArgument(configuration.libraryJars, false, false);
else if (ConfigurationConstants.RESOURCEJARS_OPTION .startsWith(nextWord)) throw new ParseException("The '-resourcejars' option is no longer supported. Please use the '-injars' option for all input");
else if (ConfigurationConstants.SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses = super.parseNoArgument(true);
else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION .startsWith(nextWord)) configuration.skipNonPublicLibraryClasses = super.parseNoArgument(false);
else if (ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION.startsWith(nextWord)) configuration.skipNonPublicLibraryClassMembers = super.parseNoArgument(false);
else if (ConfigurationConstants.TARGET_OPTION .startsWith(nextWord)) configuration.targetClassVersion = super.parseClassVersion();
else if (ConfigurationConstants.DONT_COMPRESS_OPTION .startsWith(nextWord)) configuration.dontCompress = super.parseCommaSeparatedList("file name", true, true, false, true, false, true, false, false, false, configuration.dontCompress);
else if (ConfigurationConstants.ZIP_ALIGN_OPTION .startsWith(nextWord)) configuration.zipAlign = super.parseIntegerArgument();
else if (ConfigurationConstants.FORCE_PROCESSING_OPTION .startsWith(nextWord)) configuration.lastModified = super.parseNoArgument(Long.MAX_VALUE);
else if (ConfigurationConstants.IF_OPTION .startsWith(nextWord)) configuration.keep = super.parseIfCondition(configuration.keep);
else if (ConfigurationConstants.KEEP_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, true, true, false, false, false, null);
else if (ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, false, true, false, false, false, null);
else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, false, true, false, true, false, null);
else if (ConfigurationConstants.KEEP_NAMES_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, true, true, false, false, true, null);
else if (ConfigurationConstants.KEEP_CLASS_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, false, true, false, false, true, null);
else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, false, true, false, true, true, null);
else if (ConfigurationConstants.KEEP_CODE_OPTION .startsWith(nextWord)) configuration.keep = super.parseKeepClassSpecificationArguments(configuration.keep, false, false, true, false, false, null);
else if (ConfigurationConstants.PRINT_SEEDS_OPTION .startsWith(nextWord)) configuration.printSeeds = super.parseOptionalFile();
// After '-keep'.
else if (ConfigurationConstants.KEEP_DIRECTORIES_OPTION .startsWith(nextWord)) configuration.keepDirectories = super.parseCommaSeparatedList("directory name", true, true, false, true, false, true, true, false, false, configuration.keepDirectories);
else if (ConfigurationConstants.DONT_SHRINK_OPTION .startsWith(nextWord)) configuration.shrink = super.parseNoArgument(false);
else if (ConfigurationConstants.PRINT_USAGE_OPTION .startsWith(nextWord)) configuration.printUsage = super.parseOptionalFile();
else if (ConfigurationConstants.WHY_ARE_YOU_KEEPING_OPTION .startsWith(nextWord)) configuration.whyAreYouKeeping = super.parseClassSpecificationArguments(configuration.whyAreYouKeeping);
else if (ConfigurationConstants.DONT_OPTIMIZE_OPTION .startsWith(nextWord)) configuration.optimize = super.parseNoArgument(false);
else if (ConfigurationConstants.OPTIMIZATION_PASSES .startsWith(nextWord)) configuration.optimizationPasses = super.parseIntegerArgument();
else if (ConfigurationConstants.OPTIMIZATIONS .startsWith(nextWord)) configuration.optimizations = super.parseCommaSeparatedList("optimization name", true, false, false, false, false, true, false, false, false, configuration.optimizations);
else if (ConfigurationConstants.ASSUME_NO_SIDE_EFFECTS_OPTION .startsWith(nextWord)) configuration.assumeNoSideEffects = super.parseAssumeClassSpecificationArguments(configuration.assumeNoSideEffects);
else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_SIDE_EFFECTS_OPTION .startsWith(nextWord)) configuration.assumeNoExternalSideEffects = super.parseAssumeClassSpecificationArguments(configuration.assumeNoExternalSideEffects);
else if (ConfigurationConstants.ASSUME_NO_ESCAPING_PARAMETERS_OPTION .startsWith(nextWord)) configuration.assumeNoEscapingParameters = super.parseAssumeClassSpecificationArguments(configuration.assumeNoEscapingParameters);
else if (ConfigurationConstants.ASSUME_NO_EXTERNAL_RETURN_VALUES_OPTION .startsWith(nextWord)) configuration.assumeNoExternalReturnValues = super.parseAssumeClassSpecificationArguments(configuration.assumeNoExternalReturnValues);
else if (ConfigurationConstants.ASSUME_VALUES_OPTION .startsWith(nextWord)) configuration.assumeValues = super.parseAssumeClassSpecificationArguments(configuration.assumeValues);
else if (ConfigurationConstants.ALLOW_ACCESS_MODIFICATION_OPTION .startsWith(nextWord)) configuration.allowAccessModification = super.parseNoArgument(true);
else if (ConfigurationConstants.MERGE_INTERFACES_AGGRESSIVELY_OPTION .startsWith(nextWord)) configuration.mergeInterfacesAggressively = super.parseNoArgument(true);
else if (ConfigurationConstants.DONT_OBFUSCATE_OPTION .startsWith(nextWord)) configuration.obfuscate = super.parseNoArgument(false);
else if (ConfigurationConstants.PRINT_MAPPING_OPTION .startsWith(nextWord)) configuration.printMapping = super.parseOptionalFile();
else if (ConfigurationConstants.APPLY_MAPPING_OPTION .startsWith(nextWord)) configuration.applyMapping = super.parseFile();
else if (ConfigurationConstants.OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.obfuscationDictionary = super.parseURL();
else if (ConfigurationConstants.CLASS_OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.classObfuscationDictionary = super.parseURL();
else if (ConfigurationConstants.PACKAGE_OBFUSCATION_DICTIONARY_OPTION .startsWith(nextWord)) configuration.packageObfuscationDictionary = super.parseURL();
else if (ConfigurationConstants.OVERLOAD_AGGRESSIVELY_OPTION .startsWith(nextWord)) configuration.overloadAggressively = super.parseNoArgument(true);
else if (ConfigurationConstants.USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.useUniqueClassMemberNames = super.parseNoArgument(true);
else if (ConfigurationConstants.DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION .startsWith(nextWord)) configuration.useMixedCaseClassNames = super.parseNoArgument(false);
else if (ConfigurationConstants.KEEP_PACKAGE_NAMES_OPTION .startsWith(nextWord)) configuration.keepPackageNames = super.parseCommaSeparatedList("package name", true, true, false, false, true, false, false, true, false, configuration.keepPackageNames);
else if (ConfigurationConstants.FLATTEN_PACKAGE_HIERARCHY_OPTION .startsWith(nextWord)) configuration.flattenPackageHierarchy = ClassUtil.internalClassName(super.parseOptionalArgument());
else if (ConfigurationConstants.REPACKAGE_CLASSES_OPTION .startsWith(nextWord) ||
ConfigurationConstants.DEFAULT_PACKAGE_OPTION .startsWith(nextWord)) configuration.repackageClasses = ClassUtil.internalClassName(super.parseOptionalArgument());
else if (ConfigurationConstants.KEEP_ATTRIBUTES_OPTION .startsWith(nextWord)) configuration.keepAttributes = super.parseCommaSeparatedList("attribute name", true, true, false, false, true, false, false, false, false, configuration.keepAttributes);
else if (ConfigurationConstants.KEEP_PARAMETER_NAMES_OPTION .startsWith(nextWord)) configuration.keepParameterNames = super.parseNoArgument(true);
else if (ConfigurationConstants.RENAME_SOURCE_FILE_ATTRIBUTE_OPTION .startsWith(nextWord)) configuration.newSourceFileAttribute = super.parseOptionalArgument();
else if (ConfigurationConstants.ADAPT_CLASS_STRINGS_OPTION .startsWith(nextWord)) configuration.adaptClassStrings = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.adaptClassStrings);
else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_NAMES_OPTION .startsWith(nextWord)) configuration.adaptResourceFileNames = super.parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileNames);
else if (ConfigurationConstants.ADAPT_RESOURCE_FILE_CONTENTS_OPTION .startsWith(nextWord)) configuration.adaptResourceFileContents = super.parseCommaSeparatedList("resource file name", true, true, false, true, false, true, false, false, false, configuration.adaptResourceFileContents);
else if (ConfigurationConstants.DONT_PROCESS_KOTLIN_METADATA .startsWith(nextWord)) configuration.dontProcessKotlinMetadata = parseNoArgument(true);
else if (ConfigurationConstants.KEEP_KOTLIN_METADATA .startsWith(nextWord)) configuration.keepKotlinMetadata = parseKeepKotlinMetadata();
else if (ConfigurationConstants.DONT_PREVERIFY_OPTION .startsWith(nextWord)) configuration.preverify = super.parseNoArgument(false);
else if (ConfigurationConstants.MICRO_EDITION_OPTION .startsWith(nextWord)) configuration.microEdition = super.parseNoArgument(true);
else if (ConfigurationConstants.ANDROID_OPTION .startsWith(nextWord)) configuration.android = super.parseNoArgument(true);
else if (ConfigurationConstants.KEY_STORE_OPTION .startsWith(nextWord)) configuration.keyStores = super.parseFiles(configuration.keyStores);
else if (ConfigurationConstants.KEY_STORE_PASSWORD_OPTION .startsWith(nextWord)) configuration.keyStorePasswords = super.parseCommaSeparatedList("keystore password", true, false, false, false, false, false, true, false, false, configuration.keyStorePasswords);
else if (ConfigurationConstants.KEY_ALIAS_OPTION .startsWith(nextWord)) configuration.keyAliases = super.parseCommaSeparatedList("key", true, false, false, false, false, false, true, false, false, configuration.keyAliases);
else if (ConfigurationConstants.KEY_PASSWORD_OPTION .startsWith(nextWord)) configuration.keyPasswords = super.parseCommaSeparatedList("key password", true, false, false, false, false, false, true, false, false, configuration.keyPasswords);
else if (ConfigurationConstants.VERBOSE_OPTION .startsWith(nextWord)) configuration.verbose = super.parseNoArgument(true);
else if (ConfigurationConstants.DONT_NOTE_OPTION .startsWith(nextWord)) configuration.note = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.note);
else if (ConfigurationConstants.DONT_WARN_OPTION .startsWith(nextWord)) configuration.warn = super.parseCommaSeparatedList("class name", true, true, false, false, true, false, false, true, false, configuration.warn);
else if (ConfigurationConstants.IGNORE_WARNINGS_OPTION .startsWith(nextWord)) configuration.ignoreWarnings = super.parseNoArgument(true);
else if (ConfigurationConstants.PRINT_CONFIGURATION_OPTION .startsWith(nextWord)) configuration.printConfiguration = super.parseOptionalFile();
else if (ConfigurationConstants.DUMP_OPTION .startsWith(nextWord)) configuration.dump = super.parseOptionalFile();
else if (ConfigurationConstants.ADD_CONFIGURATION_DEBUGGING_OPTION .startsWith(nextWord)) configuration.addConfigurationDebugging = super.parseNoArgument(true);
else if (ConfigurationConstants.OPTIMIZE_AGGRESSIVELY .startsWith(nextWord)) configuration.optimizeConservatively = parseNoArgument(false);
else
{
parseObfuscationConfig(configuration);
}
}
}
public void parseObfuscationConfig(Configuration configuration)
throws ParseException, IOException
{
if (ConfigurationConstants.DEOBFUSCATE_XOR_STRINGS_DECODE_NAME .startsWith(nextWord)) configuration.deobfStrDecodeName = super.parseClassSpecificationArguments(true, true, true);
else if (ConfigurationConstants.DEOBFUSCATE_XOR_STRINGS_KEY .startsWith(nextWord)) configuration.deobfStrXorKey = super.parseOptionalArgument();
else if (ConfigurationConstants.OBFUSCATIONS .startsWith(nextWord)) configuration.obfuscations = super.parseCommaSeparatedList("obfuscations name", true, false, false, false, false, true, false, false, false, configuration.obfuscations);
else if (ConfigurationConstants.OBFUSCATION_SEED .startsWith(nextWord)) configuration.seed = super.parseIntegerArgument();
else if (ConfigurationConstants.OBFUSCATE_STRING .startsWith(nextWord)) parseStringOpt(configuration);
else if (ConfigurationConstants.OBFUSCATE_ARITHMETIC .startsWith(nextWord)) parseArithmeticOpt(configuration);
else if (ConfigurationConstants.OBFUSCATE_CONSTANTS .startsWith(nextWord)) parseConstantsOpt(configuration);
else if (ConfigurationConstants.OBFUSCATE_CONTROL_FLOW .startsWith(nextWord)) parseControlFlowOpt(configuration);
else
{
throw new ParseException("Unknown option " + reader.locationDescription());
}
}
private void parseStringOpt(Configuration configuration)
throws ParseException, IOException
{
configuration.obfuscateStringsList = new ArrayList<String>();
super.readNextWord("", false, false, false);
if (ConfigurationConstants.CLASS_KEYWORD.startsWith(nextWord) ||
JavaAccessConstants.INTERFACE.startsWith(nextWord) ||
JavaAccessConstants.ENUM.startsWith(nextWord))
{
if (configuration.obfuscateStrings == null) {
configuration.obfuscateStrings = new ArrayList();
}
configuration.obfuscateStrings.add(super.parseClassSpecificationArguments(false, true, true));
}
else
{
configuration.obfuscateStringsList =
super.parseCommaSeparatedList("strings to obfuscate",
/* readFirstWord */ false,
/* allowEmptyList */ false,
/* defaultIfEmpty */ null,
/* expectClosingParenthesis */ false,
/* isFileName */ false,
/* checkJavaIdentifiers */ false,
/* allowGenerics */ true,
/* replaceSystemProperties */ false,
/* replaceExternalClassNames */ false,
/* replaceExternalTypes */ false,
configuration.obfuscateStringsList);
}
}
/*
* Parse the -obfuscate-arithmetic option and its specifier.
* The code of this pass is highly inspired from
* proguard.ConfigurationParser.parseKeepClassSpecificationArguments
*/
private void parseArithmeticOpt(Configuration configuration)
throws ParseException, IOException
{
boolean skipFloat = false;
ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;
while (true)
{
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
"', '" + JavaAccessConstants.INTERFACE +
"', or '" + JavaAccessConstants.ENUM + "'",
false, false, true);
if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord))
{
// Not a comma. Stop parsing the keep modifiers.
break;
}
readNextWord("keyword '" + ConfigurationConstants.OBFUCATION_LEVEL_LOW +
"', '" + ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM +
"', '" + ConfigurationConstants.OBFUCATION_LEVEL_HIGH +
"', or '" + ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT + "'");
if (ConfigurationConstants.OBFUCATION_LEVEL_LOW.startsWith(nextWord))
{
level = ObfuscationClassSpecification.Level.LOW;
}
else if (ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM.startsWith(nextWord))
{
level = ObfuscationClassSpecification.Level.MEDIUM;
}
else if (ConfigurationConstants.OBFUCATION_LEVEL_HIGH.startsWith(nextWord))
{
level = ObfuscationClassSpecification.Level.HIGH;
}
else if (ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT.startsWith(nextWord))
{
skipFloat = true;
}
else
{
throw new ParseException("Expecting keyword '" + ConfigurationConstants.OBFUCATION_LEVEL_LOW +
"', '" + ConfigurationConstants.OBFUCATION_LEVEL_MEDIUM +
"', '" + ConfigurationConstants.OBFUCATION_LEVEL_HIGH +
"', or '" + ConfigurationConstants.ARITHMETIC_OPT_SKIP_FLOAT +
"' before " + reader.locationDescription());
}
}
ClassSpecification classSpecification =
parseClassSpecificationArguments(false, true, false);
if (configuration.obfuscateArithmetic == null) {
configuration.obfuscateArithmetic = new ArrayList<ArithmeticObfuscationClassSpecification>();
}
configuration.obfuscateArithmetic.add(
new ArithmeticObfuscationClassSpecification(classSpecification,
level, skipFloat));
}
/*
* Parse the -obfuscate-constants option. This option does not currently support extra modifiers
* but the there is a free room for that.
*
* The code of this pass is highly inspired from
* proguard.ConfigurationParser.parseKeepClassSpecificationArguments
*/
private void parseConstantsOpt(Configuration configuration)
throws ParseException, IOException
{
ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
"', '" + JavaAccessConstants.INTERFACE +
"', or '" + JavaAccessConstants.ENUM + "'",
false, false, true);
ClassSpecification classSpecification =
parseClassSpecificationArguments(false, true, false);
if (configuration.obfuscateConstants == null) {
configuration.obfuscateConstants = new ArrayList<ConstantObfuscationClassSpecification>();
}
configuration.obfuscateConstants.add(
new ConstantObfuscationClassSpecification(classSpecification, level));
}
/*
* Parse the -obfuscate-control-flow option. This option does not currently support extra modifiers
* but the there is a free room for that.
*
* The code of this pass is highly inspired from
* proguard.ConfigurationParser.parseKeepClassSpecificationArguments
*/
private void parseControlFlowOpt(Configuration configuration)
throws ParseException, IOException
{
ObfuscationClassSpecification.Level level = ObfuscationClassSpecification.Level.NONE;
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
"', '" + JavaAccessConstants.INTERFACE +
"', or '" + JavaAccessConstants.ENUM + "'",
false, false, true);
ClassSpecification classSpecification =
parseClassSpecificationArguments(false, true, false);
if (configuration.obfuscateControlFlow == null) {
configuration.obfuscateControlFlow = new ArrayList<CFObfuscationClassSpecification>();
}
configuration.obfuscateControlFlow.add(
new CFObfuscationClassSpecification(classSpecification, level));
}
}
================================================
FILE: base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;
public class ConstantObfuscationClassSpecification extends ObfuscationClassSpecification
{
public ConstantObfuscationClassSpecification(ClassSpecification classSpecification,
Level level)
{
super(classSpecification, level);
}
@Override
public boolean equals(Object object)
{
if (object == null ||
this.getClass() != object.getClass())
{
return false;
}
ConstantObfuscationClassSpecification other = (ConstantObfuscationClassSpecification)object;
return super.equals(other);
}
@Override
public int hashCode()
{
return super.hashCode();
}
@Override
public Object clone()
{
return super.clone();
}
}
================================================
FILE: base/src/main/java/dprotect/DProtect.java
================================================
package dprotect;
import dprotect.obfuscation.CodeObfuscator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.AfterInitConfigurationVerifier;
import proguard.AppView;
import proguard.ConfigurationVerifier;
import proguard.ConfigurationWriter;
import proguard.Dumper;
import proguard.GPL;
import proguard.Initializer;
import proguard.InputReader;
import proguard.KotlinMetadataAdapter;
import proguard.OutputWriter;
import proguard.SeedPrinter;
import proguard.Targeter;
import proguard.UpToDateChecker;
import proguard.backport.Backporter;
import proguard.classfile.editor.*;
import proguard.classfile.pass.PrimitiveArrayConstantIntroducer;
import proguard.classfile.util.*;
import proguard.configuration.ConfigurationLoggingAdder;
import proguard.configuration.InitialStateInfo;
import proguard.evaluation.IncompleteClassHierarchyException;
import proguard.logging.Logging;
import proguard.mark.Marker;
import proguard.obfuscate.NameObfuscationReferenceFixer;
import proguard.obfuscate.ObfuscationPreparation;
import proguard.obfuscate.Obfuscator;
import proguard.obfuscate.ResourceFileNameAdapter;
import proguard.optimize.LineNumberTrimmer;
import proguard.optimize.Optimizer;
import proguard.optimize.gson.GsonOptimizer;
import proguard.optimize.peephole.LineNumberLinearizer;
import proguard.pass.PassRunner;
import proguard.preverify.*;
import proguard.shrink.Shrinker;
import proguard.strip.KotlinAnnotationStripper;
import proguard.util.*;
import proguard.util.kotlin.KotlinUnsupportedVersionChecker;
import proguard.util.kotlin.asserter.KotlinMetadataVerifier;
import java.io.*;
/**
* This class wraps the dProtect obfuscation pipeline.
* This is almost an exact copy of Proguard.java except that it also
* invokes the obfuscation pipeline:
*
* + CodeObfuscator codeObfuscator = new CodeObfuscator(configuration);
* + passRunner.run(codeObfuscator, appView);
*/
public class DProtect
{
private static final Logger logger = LogManager.getLogger(DProtect.class);
public static final String VERSION = "dProtect, version " + getVersion();
/**
* A data object containing pass inputs in a centralized location. Passes can access and update the information
* at any point in the pipeline.
*/
private final AppView appView;
private final PassRunner passRunner;
private final Configuration configuration;
/**
* Creates a new ProGuard object to process jars as specified by the given
* configuration.
*/
public DProtect(Configuration configuration)
{
this.appView = new AppView();
this.passRunner = new PassRunner();
this.configuration = configuration;
}
/**
* Performs all subsequent ProGuard operations.
*/
public void execute() throws Exception
{
Logging.configureVerbosity(configuration.verbose);
logger.always().log(VERSION);
try
{
checkGpl();
// Set the -keepkotlinmetadata option if necessary.
if (!configuration.dontProcessKotlinMetadata)
{
configuration.keepKotlinMetadata = requiresKotlinMetadata();
}
if (configuration.printConfiguration != null)
{
printConfiguration();
}
checkConfiguration();
if (configuration.programJars.hasOutput())
{
checkUpToDate();
}
if (configuration.targetClassVersion != 0)
{
configuration.backport = true;
}
readInput();
if (configuration.shrink ||
configuration.optimize ||
configuration.obfuscate ||
configuration.preverify)
{
clearPreverification();
}
if (configuration.printSeeds != null ||
configuration.backport ||
configuration.shrink ||
configuration.optimize ||
configuration.obfuscate ||
configuration.preverify ||
configuration.addConfigurationDebugging ||
configuration.keepKotlinMetadata)
{
initialize();
mark();
}
checkConfigurationAfterInitialization();
if (configuration.addConfigurationDebugging)
{
// Remember the initial state of the program classpool and resource filepool
// before shrinking / obfuscation / optimization.
appView.initialStateInfo = new InitialStateInfo(appView.programClassPool);
}
if (configuration.keepKotlinMetadata)
{
stripKotlinMetadataAnnotations();
}
if (configuration.optimize ||
configuration.obfuscate)
{
introducePrimitiveArrayConstants();
}
if (configuration.backport)
{
backport();
}
if (configuration.addConfigurationDebugging)
{
addConfigurationLogging();
}
if (configuration.printSeeds != null)
{
printSeeds();
}
if (configuration.preverify ||
configuration.android)
{
inlineSubroutines();
}
if (configuration.shrink)
{
shrink(false);
}
// Create a matcher for filtering optimizations.
StringMatcher filter = configuration.optimizations != null ?
new ListParser(new NameParser()).parse(configuration.optimizations) :
new ConstantMatcher(true);
if (configuration.optimize &&
filter.matches(Optimizer.LIBRARY_GSON))
{
optimizeGson();
}
if (configuration.optimize)
{
optimize();
linearizeLineNumbers();
}
if (configuration.obfuscate)
{
markObfuscation();
obfuscate();
}
if (configuration.keepKotlinMetadata)
{
adaptKotlinMetadata();
}
if (configuration.optimize ||
configuration.obfuscate)
{
expandPrimitiveArrayConstants();
}
if (configuration.targetClassVersion != 0)
{
target();
}
if (configuration.preverify)
{
preverify();
}
// Trim line numbers after preverification as this might
// also remove some instructions.
if (configuration.optimize ||
configuration.preverify)
{
trimLineNumbers();
}
if (configuration.shrink ||
configuration.optimize ||
configuration.obfuscate ||
configuration.preverify)
{
sortClassElements();
}
if (configuration.programJars.hasOutput())
{
writeOutput();
}
if (configuration.dump != null)
{
dump();
}
}
catch (UpToDateChecker.UpToDateException ignore) {}
catch (IncompleteClassHierarchyException e)
{
throw new RuntimeException(
System.lineSeparator() + System.lineSeparator() +
"It appears you are missing some classes resulting in an incomplete class hierarchy, " + System.lineSeparator() +
"please refer to the troubleshooting page in the manual: " + System.lineSeparator() +
"https://www.guardsquare.com/en/products/proguard/manual/troubleshooting#superclass" + System.lineSeparator()
);
}
}
/**
* Checks the GPL.
*/
private void checkGpl()
{
GPL.check();
}
private boolean requiresKotlinMetadata()
{
return configuration.keepKotlinMetadata ||
(configuration.keep != null &&
configuration.keep.stream().anyMatch(
keepClassSpecification -> ! keepClassSpecification.allowObfuscation &&
! keepClassSpecification.allowShrinking &&
"kotlin/Metadata".equals(keepClassSpecification.className)
));
}
/**
* Prints out the configuration that ProGuard is using.
*/
private void printConfiguration() throws IOException
{
PrintWriter pw = PrintWriterUtil.createPrintWriterOut(configuration.printConfiguration);
try (ConfigurationWriter configurationWriter = new ConfigurationWriter(pw))
{
configurationWriter.write(configuration);
}
}
/**
* Checks the configuration for conflicts and inconsistencies.
*/
private void checkConfiguration() throws IOException
{
new ConfigurationVerifier(configuration).check();
}
/**
* Checks whether the output is up-to-date.
*/
private void checkUpToDate()
{
new UpToDateChecker(configuration).check();
}
/**
* Reads the input class files.
*/
private void readInput() throws Exception
{
// Fill the program class pool and the library class pool.
passRunner.run(new InputReader(configuration), appView);
}
/**
* Clears any JSE preverification information from the program classes.
*/
private void clearPreverification() throws Exception
{
passRunner.run(new PreverificationClearer(), appView);
}
/**
* Initializes the cross-references between all classes, performs some
* basic checks, and shrinks the library class pool.
*/
private void initialize() throws Exception
{
if (configuration.keepKotlinMetadata)
{
passRunner.run(new KotlinUnsupportedVersionChecker(), appView);
}
passRunner.run(new Initializer(configuration), appView);
if (configuration.keepKotlinMetadata &&
configuration.enableKotlinAsserter)
{
passRunner.run(new KotlinMetadataVerifier(configuration), appView);
}
}
/**
* Marks the classes, class members and attributes to be kept or encrypted,
* by setting the appropriate access flags.
*/
private void mark() throws Exception
{
passRunner.run(new Marker(configuration), appView);
}
/**
* Strips the Kotlin metadata annotation where possible.
*/
private void stripKotlinMetadataAnnotations() throws Exception
{
passRunner.run(new KotlinAnnotationStripper(configuration), appView);
}
/**
* Checks the configuration after it has been initialized.
*/
private void checkConfigurationAfterInitialization() throws Exception
{
passRunner.run(new AfterInitConfigurationVerifier(configuration), appView);
}
/**
* Replaces primitive array initialization code by primitive array constants.
*/
private void introducePrimitiveArrayConstants() throws Exception
{
passRunner.run(new PrimitiveArrayConstantIntroducer(), appView);
}
/**
* Backports java language features to the specified target version.
*/
private void backport() throws Exception
{
passRunner.run(new Backporter(configuration), appView);
}
/**
* Adds configuration logging code, providing suggestions on improving
* the ProGuard configuration.
*/
private void addConfigurationLogging() throws Exception
{
passRunner.run(new ConfigurationLoggingAdder(), appView);
}
/**
* Prints out classes and class members that are used as seeds in the
* shrinking and obfuscation steps.
*/
private void printSeeds() throws Exception
{
passRunner.run(new SeedPrinter(configuration), appView);
}
/**
* Performs the subroutine inlining step.
*/
private void inlineSubroutines() throws Exception
{
// Perform the actual inlining.
passRunner.run(new SubroutineInliner(configuration), appView);
}
/**
* Performs the shrinking step.
*/
private void shrink(boolean afterOptimizer) throws Exception
{
// Perform the actual shrinking.
passRunner.run(new Shrinker(configuration, afterOptimizer), appView);
if (configuration.keepKotlinMetadata &&
configuration.enableKotlinAsserter)
{
passRunner.run(new KotlinMetadataVerifier(configuration), appView);
}
}
/**
* Optimizes usages of the Gson library.
*/
private void optimizeGson() throws Exception
{
// Perform the Gson optimization.
passRunner.run(new GsonOptimizer(configuration), appView);
}
/**
* Performs the optimization step.
*/
private void optimize() throws Exception
{
Optimizer optimizer = new Optimizer(configuration);
for (int optimizationPass = 0; optimizationPass < configuration.optimizationPasses; optimizationPass++)
{
// Perform the actual optimization.
passRunner.run(optimizer, appView);
// Shrink again, if we may.
if (configuration.shrink)
{
shrink(true);
}
}
}
/**
* Disambiguates the line numbers of all program classes, after
* optimizations like method inlining and class merging.
*/
private void linearizeLineNumbers() throws Exception
{
passRunner.run(new LineNumberLinearizer(), appView);
}
/**
* Marks the classes, class members and attributes which are set to
* be obfuscated (from the user configuration)
*/
private void markObfuscation() throws Exception
{
passRunner.run(new dprotect.obfuscation.Marker(configuration), appView);
}
/**
* Performs the obfuscation step.
*/
private void obfuscate() throws Exception
{
CodeObfuscator codeObfuscator = new CodeObfuscator(configuration);
passRunner.run(codeObfuscator, appView);
// Shrink again, if we may.
if (configuration.shrink)
{
shrink(true);
}
passRunner.run(new ObfuscationPreparation(configuration), appView);
// Perform the actual obfuscation.
passRunner.run(new Obfuscator(configuration), appView);
// Adapt resource file names that correspond to class names, if necessary.
if (configuration.adaptResourceFileNames != null)
{
passRunner.run(new ResourceFileNameAdapter(configuration), appView);
}
// Fix the Kotlin modules so the filename matches and the class names match.
passRunner.run(new NameObfuscationReferenceFixer(configuration), appView);
if (configuration.keepKotlinMetadata &&
configuration.enableKotlinAsserter)
{
passRunner.run(new KotlinMetadataVerifier(configuration), appView);
}
}
/**
* Adapts Kotlin Metadata annotations.
*/
private void adaptKotlinMetadata() throws Exception
{
passRunner.run(new KotlinMetadataAdapter(), appView);
}
/**
* Expands primitive array constants back to traditional primitive array
* initialization code.
*/
private void expandPrimitiveArrayConstants()
{
appView.programClassPool.classesAccept(new PrimitiveArrayConstantReplacer());
}
/**
* Sets that target versions of the program classes.
*/
private void target() throws Exception
{
passRunner.run(new Targeter(configuration), appView);
}
/**
* Performs the preverification step.
*/
private void preverify() throws Exception
{
// Perform the actual preverification.
passRunner.run(new Preverifier(configuration), appView);
}
/**
* Trims the line number table attributes of all program classes.
*/
private void trimLineNumbers() throws Exception
{
passRunner.run(new LineNumberTrimmer(), appView);
}
/**
* Sorts the elements of all program classes.
*/
private void sortClassElements()
{
appView.programClassPool.classesAccept(
new ClassElementSorter(
/* sortInterfaces = */ true,
/* sortConstants = */ true,
// Sorting members can cause problems with code such as clazz.getMethods()[1]
/* sortMembers = */ false,
// PGD-192: Sorting attributes can cause problems for some compilers
/* sortAttributes = */ false
)
);
}
/**
* Writes the output class files.
*/
private void writeOutput() throws Exception
{
// Write out the program class pool.
passRunner.run(new OutputWriter(configuration), appView);
}
/**
* Prints out the contents of the program classes.
*/
private void dump() throws Exception
{
passRunner.run(new Dumper(configuration), appView);
}
/**
* Returns the implementation version from the manifest.
*/
public static String getVersion()
{
Package pack = DProtect.class.getPackage();
if (pack != null)
{
String version = pack.getImplementationVersion();
if (version != null)
{
return version;
}
}
return "undefined";
}
/**
* The main method for dProtect.
*/
public static void main(String[] args)
{
if (args.length == 0)
{
logger.warn(VERSION);
logger.warn("Usage: java dprotect.DProtect [options ...]");
System.exit(1);
}
// Create the default options.
Configuration configuration = new Configuration();
try
{
// Parse the options specified in the command line arguments.
try (ConfigurationParser parser = new ConfigurationParser(args, System.getProperties()))
{
parser.parse(configuration);
}
// Execute ProGuard with these options.
new DProtect(configuration).execute();
}
catch (Exception ex)
{
logger.error("Unexpected error", ex);
System.exit(1);
}
System.exit(0);
}
}
================================================
FILE: base/src/main/java/dprotect/ObfuscationClassSpecification.java
================================================
package dprotect;
import proguard.ClassSpecification;
public class ObfuscationClassSpecification extends ClassSpecification
{
public static enum Level {
NONE, LOW, MEDIUM, HIGH
};
public final Level obfuscationLvl;
public ObfuscationClassSpecification(ClassSpecification classSpecification,
Level level)
{
super(classSpecification);
this.obfuscationLvl = level;
}
public ObfuscationClassSpecification(ClassSpecification classSpecification)
{
this(classSpecification, Level.NONE);
}
@Override
public boolean equals(Object object)
{
if (object == null ||
this.getClass() != object.getClass())
{
return false;
}
ObfuscationClassSpecification other = (ObfuscationClassSpecification)object;
return
this.obfuscationLvl == other.obfuscationLvl &&
super.equals(other);
}
@Override
public int hashCode()
{
return obfuscationLvl.hashCode() ^ super.hashCode();
}
@Override
public Object clone()
{
return super.clone();
}
}
================================================
FILE: base/src/main/java/dprotect/deobfuscation/Deobfuscator.java
================================================
package dprotect.deobfuscation;
import dprotect.Configuration;
import dprotect.obfuscation.arithmetic.*;
import dprotect.obfuscation.constants.*;
import dprotect.obfuscation.controlflow.*;
import dprotect.obfuscation.info.ObfuscationInfo;
import dprotect.obfuscation.strings.*;
import java.io.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.AppView;
import proguard.classfile.*;
import proguard.classfile.attribute.visitor.AllAttributeVisitor;
import proguard.classfile.instruction.visitor.AllInstructionVisitor;
import proguard.classfile.util.PrimitiveArrayConstantReplacer;
import proguard.classfile.util.ClassReferenceInitializer;
import proguard.classfile.visitor.*;
import proguard.classfile.constant.visitor.AllConstantVisitor;
import proguard.io.ExtraDataEntryNameMap;
import proguard.obfuscate.util.InstructionSequenceObfuscator;
import proguard.pass.Pass;
import proguard.util.*;
public class Deobfuscator implements Pass
{
private static final Logger logger = LogManager.getLogger(Deobfuscator.class);
private static final String DEOBFUSCATION_STRING = "deobfuscation/string";
private final Configuration configuration;
private boolean codeObfuscationString;
private boolean codeObfuscationArithmeticMba;
private boolean codeObfuscationConstants;
private boolean codeObfuscationControlFlow;
public Deobfuscator(Configuration configuration)
{
this.configuration = configuration;
}
/**
* Performs obfuscation of the given program class pool.
*/
@Override
public void execute(AppView appView) throws IOException
{
// Create a matcher for filtering optimizations.
StringMatcher filter = configuration.optimizations != null ?
new ListParser(new NameParser()).parse(configuration.obfuscations) :
new ConstantMatcher(true);
//codeObfuscationString = filter.matches(OBFUSCATION_STRING);
//codeObfuscationArithmeticMba = filter.matches(OBFUSCATION_ARITHMETIC_MBA);
//codeObfuscationConstants = filter.matches(OBFUSCATION_CONSTANTS);
//codeObfuscationControlFlow = filter.matches(OBFUSCATION_CONTROL_FLOW);
//logger.info("Applying code obfuscation ...");
//if (configuration.seed == null)
//{
// configuration.seed = (int)System.currentTimeMillis();
//}
//logger.info("Using obfuscation seed: {}", configuration.seed);
//obfuscate(configuration,
// appView.programClassPool,
// appView.libraryClassPool,
// appView.extraDataEntryNameMap);
}
private void deobfuscate(Configuration configuration,
ClassPool programClassPool,
ClassPool libraryClassPool,
ExtraDataEntryNameMap extraDataEntryNameMap)
throws IOException
{
}
}
================================================
FILE: base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java
================================================
package dprotect.deobfuscation.strings;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.ClassSpecification;
import proguard.MemberSpecification;
import proguard.classfile.*;
import proguard.classfile.attribute.*;
import proguard.classfile.attribute.visitor.*;
import proguard.classfile.constant.*;
import proguard.classfile.constant.visitor.ConstantVisitor;
import proguard.classfile.editor.*;
import proguard.classfile.instruction.*;
import proguard.classfile.instruction.visitor.*;
import java.util.Base64;
public class XoredStrings
implements AttributeVisitor,
InstructionVisitor,
ConstantVisitor
{
private final byte[] KEY;
private final ClassSpecification decodeSpecifier;
private final CodeAttributeEditor codeAttributeEditor = new CodeAttributeEditor();
private ConstantPoolEditor constantPoolEditor = null;
private String stackedString = null;
private LdcInfo ldcString = null;
private static final Logger logger = LogManager.getLogger(XoredStrings.class);
private class LdcInfo
{
public int offset;
public byte opcode;
LdcInfo(int offset, byte opcode)
{
this.offset = offset;
this.opcode = opcode;
}
}
public XoredStrings(String talsecKey, ClassSpecification decodeInfo)
{
decodeSpecifier = decodeInfo;
KEY = Base64.getDecoder().decode(talsecKey);
}
private boolean isDecodeMethod(String clazz, String method)
{
if (!decodeSpecifier.className.equals(clazz))
{
return false;
}
if (decodeSpecifier.methodSpecifications.isEmpty())
{
return false;
}
Object spec = decodeSpecifier.methodSpecifications.get(0);
if (!(spec instanceof MemberSpecification))
{
return false;
}
MemberSpecification memberSpec = (MemberSpecification)spec;
return memberSpec.name.equals(method);
}
public static byte[] hex2bytes(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16) );
}
return data;
}
private String decode(byte[] bytes) {
byte[] decoded = new byte[bytes.length];
for (int i = 0; i < decoded.length; ++i) {
decoded[i] = (byte)((bytes[i]) ^ KEY[i % KEY.length]);
}
return new String(decoded);
}
private String decode(String enc)
{
return decode(hex2bytes(enc));
}
// Implementations for AttributeVisitor.
@Override
public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
@Override
public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
{
this.constantPoolEditor = new ConstantPoolEditor((ProgramClass)clazz);
codeAttributeEditor.reset(codeAttribute.u4codeLength);
codeAttribute.instructionsAccept(clazz, method, this);
codeAttribute.accept(clazz, method, codeAttributeEditor);
}
// Implementations for InstructionVisitor.
@Override
public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {}
@Override
public void visitConstantInstruction(Clazz clazz,
Method method,
CodeAttribute codeAttribute,
int offset,
ConstantInstruction constantInstruction)
{
byte opcode = constantInstruction.opcode;
if (opcode == Instruction.OP_LDC || opcode == Instruction.OP_LDC_W)
{
this.ldcString = new LdcInfo(offset, opcode);
clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this);
}
if (opcode == Instruction.OP_INVOKESTATIC) {
ProgramClass programClass = (ProgramClass) clazz;
Constant ref = programClass.getConstant(constantInstruction.constantIndex);
if (!(ref instanceof MethodrefConstant)) {
return;
}
MethodrefConstant methodRef = (MethodrefConstant)ref;
String className = methodRef.getClassName(clazz);
String methodName = methodRef.getName(clazz);
if (isDecodeMethod(className, methodName)) {
if (this.stackedString != null) {
//logger.info("{} -> {}", stackedString, decode(stackedString));
this.codeAttributeEditor.deleteInstruction(offset);
int idx = this.constantPoolEditor.addStringConstant(decode(this.stackedString));
ConstantInstruction replacedLdc = new ConstantInstruction(this.ldcString.opcode, idx);
this.codeAttributeEditor.replaceInstruction(this.ldcString.offset, replacedLdc);
this.stackedString = null;
}
}
}
}
// Implementations for ConstantVisitor.
@Override
public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
{
clazz.constantPoolEntryAccept(stringConstant.u2stringIndex, this);
}
@Override
public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant)
{
this.stackedString = utf8Constant.getString();
}
@Override
public void visitAnyConstant(Clazz clazz, Constant constant) {}
}
================================================
FILE: base/src/main/java/dprotect/obfuscation/CodeObfuscator.java
================================================
package dprotect.obfuscation;
import dprotect.Configuration;
import dprotect.obfuscation.arithmetic.*;
import dprotect.obfuscation.constants.*;
import dprotect.obfuscation.controlflow.*;
import dprotect.obfuscation.info.ObfuscationInfo;
import dprotect.obfuscation.strings.*;
import java.io.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import proguard.AppView;
import proguard.classfile.*;
import proguard.classfile.attribute.visitor.AllAttributeVisitor;
import proguard.classfile.instruction.visitor.AllInstructionVisitor;
import proguard.classfile.util.PrimitiveArrayConstantReplacer;
import proguard.classfile.util.ClassReferenceInitializer;
import proguard.classfile.visitor.*;
import proguard.classfile.constant.visitor.AllConstantVisitor;
import proguard.io.ExtraDataEntryNameMap;
import proguard.obfuscate.util.InstructionSequenceObfuscator;
import proguard.pass.Pass;
import proguard.util.*;
public class CodeObfuscator implements Pass
{
private static final Logger logger = LogManager.getLogger(CodeObfuscator.class);
private static final String OBFUSCATION_STRING = "obfuscation/string";
private static final String OBFUSCATION_ARITHMETIC_MBA = "obfuscation/arithmetic/mba";
private static final String OBFUSCATION_CONSTANTS = "obfuscation/constants";
private static final String OBFUSCATION_CONTROL_FLOW = "obfuscation/controlflow";
private final Configuration configuration;
private boolean codeObfuscationString;
private boolean codeObfuscationArithmeticMba;
private boolean codeObfuscationConstants;
private boolean codeObfuscationControlFlow;
public CodeObfuscator(Configuration configuration)
{
this.configuration = configuration;
}
/**
* Performs obfuscation of the given program class pool.
*/
@Override
public void execute(AppView appView) throws IOException
{
// Create a matcher for filtering optimizations.
StringMatcher filter = configuration.optimizations != null ?
new ListParser(new NameParser()).parse(configuration.obfuscations) :
new ConstantMatcher(true);
codeObfuscationString = filter.matches(OBFUSCATION_STRING);
codeObfuscationArithmeticMba = filter.matches(OBFUSCATION_ARITHMETIC_MBA);
codeObfuscationConstants = filter.matches(OBFUSCATION_CONSTANTS);
codeObfuscationControlFlow = filter.matches(OBFUSCATION_CONTROL_FLOW);
logger.info("Applying code obfuscation ...");
if (configuration.seed == null)
{
configuration.seed = (int)System.currentTimeMillis();
}
logger.info("Using obfuscation seed: {}", configuration.seed);
obfuscate(configuration,
appView.programClassPool,
appView.libraryClassPool,
appView.extraDataEntryNameMap);
}
private void obfuscate(Configuration configuration,
ClassPool programClassPool,
ClassPool libraryClassPool,
ExtraDataEntryNameMap extraDataEntryNameMap)
throws IOException
{
/* Make sure that PrimitiveArrayConstant are correctly expanded before running
* the pass.
*
* This PrimitiveArrayConstantReplacer is also run in the main DProtect.java/Proguard.java
* but it comes after the optimization/obfuscation pipeline. I don't know if it is a bug
* but for this pass, it needs to be run **before**
*/
{
programClassPool.classesAccept(new PrimitiveArrayConstantReplacer());
}
if (codeObfuscationString)
{
runStringObfuscation(configuration,
programClassPool, libraryClassPool,
extraDataEntryNameMap);
}
if (codeObfuscationControlFlow)
{
runControlFlowObfuscation(configuration,
programClassPool, libraryClassPool,
extraDataEntryNameMap);
}
if (codeObfuscationArithmeticMba)
{
runArithmeticObfuscation(configuration,
programClassPool, libraryClassPool,
extraDataEntryNameMap);
}
if (codeObfuscationConstants)
{
runConstantsObfuscation(configuration,
programClassPool, libraryClassPool,
extraDataEntryNameMap);
}
programClassPool.accept(new AllClassVisitor(
new AllFieldVisitor(
new ClassReferenceInitializer(programClassPool, libraryClassPool))));
programClassPool.accept(new AllClassVisitor(
new AllConstantVisitor(
new ClassReferenceInitializer(programClassPool, libraryClassPool))));
}
private void runStringObfuscation(Configuration configuration,
ClassPool programClassPool,
ClassPool libraryClassPool,
ExtraDataEntryNameMap extraDataEntryNameMap)
{
logger.info("dProtect: Applying strings encoding ...");
programClassPool.accept(
new AllClassVisitor(
new ClassVisitor() {
/*
* The purpose of this visitor is to early filter
* on the classes that are flagged with the obfuscate-strings options
*/
public ClassVisitor obfuscator;
@Override
public void visitAnyClass(Clazz clazz)
{
if (ObfuscationInfo.getObfuscationInfo(clazz).encodeStrings)
{
/*
* StringFieldMarker is used to flag the strings
* that are associated with field write accesses
*/
clazz.accept(
new AllMethodVisitor(
new AllAttributeVisitor(
new AllInstructionVisitor(
new StringFieldMarker()))));
/*
* Run the obfuscation pass
*/
obfuscator.visitAnyClass(clazz);
}
}
ClassVisitor apply(ClassVisitor obfuscator) { this.obfuscator = obfuscator; return this; }
}.apply(new StringObfuscator(configuration.obfuscateStringsList, configuration.seed))));
}
private void runArithmeticObfuscation(Configuration configuration,
ClassPool programClassPool,
ClassPool libraryClassPool,
ExtraDataEntryNameMap extraDataEntryNameMap)
{
MBANormalizer normalizer = new MBANormalizer (programClassPool, libraryClassPool);
MBAObfuscationAdd mbaAdd = new MBAObfuscationAdd(programClassPool, libraryClassPool);
MBAObfuscationXor mbaXor = new MBAObfuscationXor(programClassPool, libraryClassPool);
MBAObfuscationAnd mbaAnd = new MBAObfuscationAnd(programClassPool, libraryClassPool);
MBAObfuscationOr mbaOr = new MBAObfuscationOr (programClassPool, libraryClassPool);
MBAObfuscationSub mbaSub = new MBAObfuscationSub(programClassPool, libraryClassPool);
logger.info("dProtect: Applying Mixed Boolean-Arithmetic expressions ...");
programClassPool.accept(
new AllClassVisitor(
new ClassVisitor() {
/*
* Early filter
* on the classes that are flagged with obfuscate-arithmetic
*/
public MemberVisitor obfuscator;
@Override
public void visitAnyClass(Clazz clazz)
{
if (ObfuscationInfo.getObfuscationInfo(clazz).arithmetic != null)
{
clazz.methodsAccept(new ArithmeticObfuscationFilter(obfuscator));
}
}
gitextract_i4svht9p/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── scripts/ │ │ └── s3-deploy.py │ └── workflows/ │ ├── continuous_integration.yml │ └── main.yml ├── .gitignore ├── .hgignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── annotations/ │ ├── annotations.pro │ ├── build.gradle │ └── src/ │ └── proguard/ │ └── annotation/ │ ├── Keep.java │ ├── KeepApplication.java │ ├── KeepClassMemberNames.java │ ├── KeepClassMembers.java │ ├── KeepGettersSetters.java │ ├── KeepImplementations.java │ ├── KeepName.java │ ├── KeepPublicClassMemberNames.java │ ├── KeepPublicClassMembers.java │ ├── KeepPublicGettersSetters.java │ ├── KeepPublicImplementations.java │ ├── KeepPublicProtectedClassMemberNames.java │ └── KeepPublicProtectedClassMembers.java ├── ant/ │ ├── build.gradle │ └── src/ │ └── proguard/ │ └── ant/ │ ├── ClassPathElement.java │ ├── ClassSpecificationElement.java │ ├── ConfigurationElement.java │ ├── ConfigurationTask.java │ ├── FilterElement.java │ ├── KeepSpecificationElement.java │ ├── MemberSpecificationElement.java │ ├── ProGuardTask.java │ ├── package.html │ └── task.properties ├── base/ │ ├── build.gradle │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── dprotect/ │ │ │ │ ├── ArithmeticObfuscationClassSpecification.java │ │ │ │ ├── CFObfuscationClassSpecification.java │ │ │ │ ├── ClassObfuSpecVisitorFactory.java │ │ │ │ ├── Configuration.java │ │ │ │ ├── ConfigurationConstants.java │ │ │ │ ├── ConfigurationParser.java │ │ │ │ ├── ConstantObfuscationClassSpecification.java │ │ │ │ ├── DProtect.java │ │ │ │ ├── ObfuscationClassSpecification.java │ │ │ │ ├── deobfuscation/ │ │ │ │ │ ├── Deobfuscator.java │ │ │ │ │ └── strings/ │ │ │ │ │ └── XoredStrings.java │ │ │ │ ├── obfuscation/ │ │ │ │ │ ├── CodeObfuscator.java │ │ │ │ │ ├── Marker.java │ │ │ │ │ ├── arithmetic/ │ │ │ │ │ │ ├── ArithmeticObfuscationFilter.java │ │ │ │ │ │ ├── ArithmeticObfuscationInfo.java │ │ │ │ │ │ ├── ArithmeticObfuscationMarker.java │ │ │ │ │ │ ├── MBANormalizer.java │ │ │ │ │ │ ├── MBAObfuscationAdd.java │ │ │ │ │ │ ├── MBAObfuscationAnd.java │ │ │ │ │ │ ├── MBAObfuscationOr.java │ │ │ │ │ │ ├── MBAObfuscationSub.java │ │ │ │ │ │ └── MBAObfuscationXor.java │ │ │ │ │ ├── constants/ │ │ │ │ │ │ ├── ConstantFieldMarker.java │ │ │ │ │ │ ├── ConstantObfuscationInfo.java │ │ │ │ │ │ ├── ConstantObfuscationMarker.java │ │ │ │ │ │ └── ConstantsObfuscator.java │ │ │ │ │ ├── controlflow/ │ │ │ │ │ │ ├── ControlFlowObfuscation.java │ │ │ │ │ │ ├── ControlFlowObfuscationInfo.java │ │ │ │ │ │ └── ControlFlowObfuscationMarker.java │ │ │ │ │ ├── info/ │ │ │ │ │ │ ├── ObfuscationInfo.java │ │ │ │ │ │ └── ObfuscationInfoSetter.java │ │ │ │ │ └── strings/ │ │ │ │ │ ├── StringFieldMarker.java │ │ │ │ │ ├── StringObfuscationMarker.java │ │ │ │ │ └── StringObfuscator.java │ │ │ │ └── runtime/ │ │ │ │ ├── strings/ │ │ │ │ │ └── StringEncoding.java │ │ │ │ └── util/ │ │ │ │ ├── Helpers.java │ │ │ │ └── Loader.java │ │ │ └── proguard/ │ │ │ ├── AfterInitConfigurationVerifier.java │ │ │ ├── AppView.java │ │ │ ├── ArgumentWordReader.java │ │ │ ├── AssumeNoSideEffectsChecker.java │ │ │ ├── ClassMemberChecker.java │ │ │ ├── ClassPath.java │ │ │ ├── ClassPathEntry.java │ │ │ ├── ClassSpecification.java │ │ │ ├── ClassSpecificationVisitorFactory.java │ │ │ ├── Configuration.java │ │ │ ├── ConfigurationConstants.java │ │ │ ├── ConfigurationParser.java │ │ │ ├── ConfigurationVerifier.java │ │ │ ├── ConfigurationWriter.java │ │ │ ├── DataEntryReaderFactory.java │ │ │ ├── DataEntryWriterFactory.java │ │ │ ├── DescriptorKeepChecker.java │ │ │ ├── Dumper.java │ │ │ ├── DuplicateClassPrinter.java │ │ │ ├── DuplicateResourceFilePrinter.java │ │ │ ├── FileWordReader.java │ │ │ ├── FullyQualifiedClassNameChecker.java │ │ │ ├── GPL.java │ │ │ ├── GetAnnotationChecker.java │ │ │ ├── GetEnclosingClassChecker.java │ │ │ ├── GetEnclosingMethodChecker.java │ │ │ ├── GetSignatureChecker.java │ │ │ ├── Initializer.java │ │ │ ├── InputReader.java │ │ │ ├── KeepClassMemberChecker.java │ │ │ ├── KeepClassSpecification.java │ │ │ ├── KeepClassSpecificationVisitorFactory.java │ │ │ ├── KotlinMetadataAdapter.java │ │ │ ├── LibraryKeepChecker.java │ │ │ ├── LineWordReader.java │ │ │ ├── MemberSpecification.java │ │ │ ├── MemberValueSpecification.java │ │ │ ├── OutputWriter.java │ │ │ ├── ParseException.java │ │ │ ├── ProGuard.java │ │ │ ├── SeedPrinter.java │ │ │ ├── SubclassedClassFilter.java │ │ │ ├── Targeter.java │ │ │ ├── UpToDateChecker.java │ │ │ ├── WordReader.java │ │ │ ├── backport/ │ │ │ │ ├── AbstractAPIConverter.java │ │ │ │ ├── Backporter.java │ │ │ │ ├── DefaultInterfaceMethodConverter.java │ │ │ │ ├── JSR310Converter.java │ │ │ │ ├── LambdaExpression.java │ │ │ │ ├── LambdaExpressionCollector.java │ │ │ │ ├── LambdaExpressionConverter.java │ │ │ │ ├── StaticInterfaceMethodConverter.java │ │ │ │ ├── StreamSupportConverter.java │ │ │ │ └── StringConcatenationConverter.java │ │ │ ├── classfile/ │ │ │ │ ├── ClassMemberPair.java │ │ │ │ ├── pass/ │ │ │ │ │ └── PrimitiveArrayConstantIntroducer.java │ │ │ │ └── visitor/ │ │ │ │ └── InjectedClassFilter.java │ │ │ ├── configuration/ │ │ │ │ ├── ConfigurationLogger.java │ │ │ │ ├── ConfigurationLoggingAdder.java │ │ │ │ ├── ConfigurationLoggingInstructionSequenceConstants.java │ │ │ │ ├── ConfigurationLoggingInstructionSequenceReplacer.java │ │ │ │ ├── ConfigurationLoggingInstructionSequencesReplacer.java │ │ │ │ └── InitialStateInfo.java │ │ │ ├── evaluation/ │ │ │ │ └── AssumeClassSpecificationVisitorFactory.java │ │ │ ├── fixer/ │ │ │ │ └── kotlin/ │ │ │ │ ├── KotlinAnnotationCounter.java │ │ │ │ └── KotlinAnnotationFlagFixer.java │ │ │ ├── io/ │ │ │ │ ├── ClassMapDataEntryReplacer.java │ │ │ │ ├── ExtraDataEntryNameMap.java │ │ │ │ ├── ExtraDataEntryReader.java │ │ │ │ ├── KotlinModuleRewriter.java │ │ │ │ └── UniqueDataEntryWriter.java │ │ │ ├── logging/ │ │ │ │ └── Logging.java │ │ │ ├── mark/ │ │ │ │ └── Marker.java │ │ │ ├── obfuscate/ │ │ │ │ ├── AttributeShrinker.java │ │ │ │ ├── AttributeUsageMarker.java │ │ │ │ ├── ClassNameAdapterFunction.java │ │ │ │ ├── ClassObfuscator.java │ │ │ │ ├── ClassRenamer.java │ │ │ │ ├── DictionaryNameFactory.java │ │ │ │ ├── MapCleaner.java │ │ │ │ ├── MappingKeeper.java │ │ │ │ ├── MappingPrinter.java │ │ │ │ ├── MappingProcessor.java │ │ │ │ ├── MappingReader.java │ │ │ │ ├── MemberNameCleaner.java │ │ │ │ ├── MemberNameCollector.java │ │ │ │ ├── MemberNameConflictFixer.java │ │ │ │ ├── MemberObfuscator.java │ │ │ │ ├── MemberSpecialNameFilter.java │ │ │ │ ├── MultiMappingProcessor.java │ │ │ │ ├── NameFactory.java │ │ │ │ ├── NameFactoryResetter.java │ │ │ │ ├── NameMarker.java │ │ │ │ ├── NameObfuscationReferenceFixer.java │ │ │ │ ├── NewMemberNameFilter.java │ │ │ │ ├── NumericNameFactory.java │ │ │ │ ├── ObfuscationPreparation.java │ │ │ │ ├── Obfuscator.java │ │ │ │ ├── OriginalClassNameFilter.java │ │ │ │ ├── ParameterNameMarker.java │ │ │ │ ├── PrefixingNameFactory.java │ │ │ │ ├── RenamedFlagSetter.java │ │ │ │ ├── ResourceFileNameAdapter.java │ │ │ │ ├── ResourceFileNameObfuscator.java │ │ │ │ ├── ResourceJavaReferenceFixer.java │ │ │ │ ├── SimpleNameFactory.java │ │ │ │ ├── SourceFileRenamer.java │ │ │ │ ├── SpecialNameFactory.java │ │ │ │ ├── UniqueMemberNameFactory.java │ │ │ │ ├── kotlin/ │ │ │ │ │ ├── KotlinAliasNameObfuscator.java │ │ │ │ │ ├── KotlinAliasReferenceFixer.java │ │ │ │ │ ├── KotlinCallableReferenceFixer.java │ │ │ │ │ ├── KotlinCompanionEqualizer.java │ │ │ │ │ ├── KotlinDefaultImplsMethodNameEqualizer.java │ │ │ │ │ ├── KotlinDefaultMethodNameEqualizer.java │ │ │ │ │ ├── KotlinIntrinsicsReplacementSequences.java │ │ │ │ │ ├── KotlinModuleFixer.java │ │ │ │ │ ├── KotlinModuleNameObfuscator.java │ │ │ │ │ ├── KotlinMultiFileFacadeFixer.java │ │ │ │ │ ├── KotlinObjectFixer.java │ │ │ │ │ ├── KotlinPropertyNameObfuscator.java │ │ │ │ │ ├── KotlinPropertyRenamer.java │ │ │ │ │ ├── KotlinSourceDebugExtensionAttributeObfuscator.java │ │ │ │ │ ├── KotlinSyntheticClassFixer.java │ │ │ │ │ ├── KotlinSyntheticToStringObfuscator.java │ │ │ │ │ ├── KotlinUnsupportedExceptionReplacementSequences.java │ │ │ │ │ ├── KotlinValueParameterNameShrinker.java │ │ │ │ │ └── KotlinValueParameterUsageMarker.java │ │ │ │ ├── obfuscate/ │ │ │ │ │ └── package.html │ │ │ │ └── util/ │ │ │ │ ├── InstructionSequenceObfuscator.java │ │ │ │ └── ReplacementSequences.java │ │ │ ├── optimize/ │ │ │ │ ├── BootstrapMethodArgumentShrinker.java │ │ │ │ ├── CalledMemberVisitor.java │ │ │ │ ├── ChangedCodePrinter.java │ │ │ │ ├── ConstantMemberFilter.java │ │ │ │ ├── ConstantParameterFilter.java │ │ │ │ ├── DuplicateInitializerFixer.java │ │ │ │ ├── DuplicateInitializerInvocationFixer.java │ │ │ │ ├── InfluenceFixpointVisitor.java │ │ │ │ ├── KeepMarker.java │ │ │ │ ├── KeptClassFilter.java │ │ │ │ ├── KeptMemberFilter.java │ │ │ │ ├── LineNumberTrimmer.java │ │ │ │ ├── MemberDescriptorSpecializer.java │ │ │ │ ├── MemberReferenceGeneralizer.java │ │ │ │ ├── MethodDescriptorShrinker.java │ │ │ │ ├── MethodStaticizer.java │ │ │ │ ├── OptimizationInfoClassFilter.java │ │ │ │ ├── OptimizationInfoMemberFilter.java │ │ │ │ ├── Optimizer.java │ │ │ │ ├── ParameterShrinker.java │ │ │ │ ├── ReverseDependencyCalculator.java │ │ │ │ ├── ReverseDependencyStore.java │ │ │ │ ├── SideEffectVisitorMarkerFactory.java │ │ │ │ ├── TailRecursionSimplifier.java │ │ │ │ ├── TimedClassPoolVisitor.java │ │ │ │ ├── WriteOnlyFieldFilter.java │ │ │ │ ├── evaluation/ │ │ │ │ │ ├── EvaluationShrinker.java │ │ │ │ │ ├── EvaluationSimplifier.java │ │ │ │ │ ├── InstructionUsageMarker.java │ │ │ │ │ ├── LoadingInvocationUnit.java │ │ │ │ │ ├── ParameterTracingInvocationUnit.java │ │ │ │ │ ├── SimpleEnumArrayPropagator.java │ │ │ │ │ ├── SimpleEnumClassChecker.java │ │ │ │ │ ├── SimpleEnumClassSimplifier.java │ │ │ │ │ ├── SimpleEnumDescriptorSimplifier.java │ │ │ │ │ ├── SimpleEnumUseChecker.java │ │ │ │ │ ├── SimpleEnumUseSimplifier.java │ │ │ │ │ ├── StoringInvocationUnit.java │ │ │ │ │ └── VariableOptimizer.java │ │ │ │ ├── gson/ │ │ │ │ │ ├── DuplicateJsonFieldNameChecker.java │ │ │ │ │ ├── FieldSignatureCollector.java │ │ │ │ │ ├── GsonAnnotationCleaner.java │ │ │ │ │ ├── GsonBuilderInvocationFinder.java │ │ │ │ │ ├── GsonClassConstants.java │ │ │ │ │ ├── GsonConstructorPatcher.java │ │ │ │ │ ├── GsonContext.java │ │ │ │ │ ├── GsonDeserializationInvocationFinder.java │ │ │ │ │ ├── GsonDeserializationOptimizer.java │ │ │ │ │ ├── GsonDomainClassFinder.java │ │ │ │ │ ├── GsonInstrumentationAdder.java │ │ │ │ │ ├── GsonOptimizer.java │ │ │ │ │ ├── GsonRuntimeSettings.java │ │ │ │ │ ├── GsonSerializationInvocationFinder.java │ │ │ │ │ ├── GsonSerializationOptimizer.java │ │ │ │ │ ├── InlineDeserializer.java │ │ │ │ │ ├── InlineDeserializers.java │ │ │ │ │ ├── InlineSerializer.java │ │ │ │ │ ├── InlineSerializers.java │ │ │ │ │ ├── LocalOrAnonymousClassChecker.java │ │ │ │ │ ├── MarkedAnnotationDeleter.java │ │ │ │ │ ├── OptimizedClassConstants.java │ │ │ │ │ ├── OptimizedJsonFieldCollector.java │ │ │ │ │ ├── OptimizedJsonFieldVisitor.java │ │ │ │ │ ├── OptimizedJsonInfo.java │ │ │ │ │ ├── OptimizedJsonReaderImplInitializer.java │ │ │ │ │ ├── OptimizedJsonWriterImplInitializer.java │ │ │ │ │ ├── OptimizedTypeAdapterAdder.java │ │ │ │ │ ├── OptimizedTypeAdapterFactoryInitializer.java │ │ │ │ │ ├── OptimizedTypeAdapterInitializer.java │ │ │ │ │ ├── TypeArgumentFinder.java │ │ │ │ │ ├── TypeParameterClassChecker.java │ │ │ │ │ ├── TypeTokenClassBuilder.java │ │ │ │ │ ├── _GsonUtil.java │ │ │ │ │ ├── _OptimizedJsonReader.java │ │ │ │ │ ├── _OptimizedJsonReaderImpl.java │ │ │ │ │ ├── _OptimizedJsonWriter.java │ │ │ │ │ ├── _OptimizedJsonWriterImpl.java │ │ │ │ │ ├── _OptimizedTypeAdapter.java │ │ │ │ │ ├── _OptimizedTypeAdapterFactory.java │ │ │ │ │ ├── _OptimizedTypeAdapterImpl.java │ │ │ │ │ └── package.html │ │ │ │ ├── info/ │ │ │ │ │ ├── AccessMethodMarker.java │ │ │ │ │ ├── BackwardBranchMarker.java │ │ │ │ │ ├── CatchExceptionMarker.java │ │ │ │ │ ├── CaughtClassFilter.java │ │ │ │ │ ├── CaughtClassMarker.java │ │ │ │ │ ├── ClassOptimizationInfo.java │ │ │ │ │ ├── CodeAttributeOptimizationInfo.java │ │ │ │ │ ├── ContainsConstructorsMarker.java │ │ │ │ │ ├── DotClassFilter.java │ │ │ │ │ ├── DotClassMarker.java │ │ │ │ │ ├── DynamicInvocationMarker.java │ │ │ │ │ ├── EscapingClassFilter.java │ │ │ │ │ ├── EscapingClassMarker.java │ │ │ │ │ ├── ExceptionInstructionChecker.java │ │ │ │ │ ├── FieldOptimizationInfo.java │ │ │ │ │ ├── FinalFieldAssignmentMarker.java │ │ │ │ │ ├── InstanceofClassFilter.java │ │ │ │ │ ├── InstanceofClassMarker.java │ │ │ │ │ ├── InstantiationClassFilter.java │ │ │ │ │ ├── InstantiationClassMarker.java │ │ │ │ │ ├── MethodInvocationMarker.java │ │ │ │ │ ├── MethodOptimizationInfo.java │ │ │ │ │ ├── MutableBoolean.java │ │ │ │ │ ├── NoEscapingParametersMethodMarker.java │ │ │ │ │ ├── NoExternalReturnValuesMethodMarker.java │ │ │ │ │ ├── NoExternalSideEffectMethodMarker.java │ │ │ │ │ ├── NoSideEffectClassMarker.java │ │ │ │ │ ├── NoSideEffectMethodMarker.java │ │ │ │ │ ├── NonEmptyStackReturnMarker.java │ │ │ │ │ ├── NonPrivateMemberMarker.java │ │ │ │ │ ├── OptimizationCodeAttributeFilter.java │ │ │ │ │ ├── PackageVisibleMemberContainingClassMarker.java │ │ │ │ │ ├── PackageVisibleMemberInvokingClassMarker.java │ │ │ │ │ ├── ParameterEscapeMarker.java │ │ │ │ │ ├── ParameterEscapedMarker.java │ │ │ │ │ ├── ParameterUsageMarker.java │ │ │ │ │ ├── ProgramClassOptimizationInfo.java │ │ │ │ │ ├── ProgramClassOptimizationInfoSetter.java │ │ │ │ │ ├── ProgramFieldOptimizationInfo.java │ │ │ │ │ ├── ProgramMemberOptimizationInfoSetter.java │ │ │ │ │ ├── ProgramMethodOptimizationInfo.java │ │ │ │ │ ├── ReadWriteFieldMarker.java │ │ │ │ │ ├── ReferenceEscapeChecker.java │ │ │ │ │ ├── RepeatedClassPoolVisitor.java │ │ │ │ │ ├── SideEffectClassChecker.java │ │ │ │ │ ├── SideEffectClassFilter.java │ │ │ │ │ ├── SideEffectClassMarker.java │ │ │ │ │ ├── SideEffectInstructionChecker.java │ │ │ │ │ ├── SideEffectMethodFilter.java │ │ │ │ │ ├── SideEffectMethodMarker.java │ │ │ │ │ ├── SimpleEnumFilter.java │ │ │ │ │ ├── SimpleEnumMarker.java │ │ │ │ │ ├── SuperInvocationMarker.java │ │ │ │ │ ├── SynchronizedBlockMethodMarker.java │ │ │ │ │ ├── UnusedParameterMethodFilter.java │ │ │ │ │ ├── UnusedParameterOptimizationInfoUpdater.java │ │ │ │ │ ├── UsedParameterFilter.java │ │ │ │ │ ├── VariableUsageMarker.java │ │ │ │ │ └── WrapperClassMarker.java │ │ │ │ ├── kotlin/ │ │ │ │ │ └── KotlinContextReceiverUsageMarker.java │ │ │ │ └── peephole/ │ │ │ │ ├── ClassFinalizer.java │ │ │ │ ├── ClassMerger.java │ │ │ │ ├── GotoCommonCodeReplacer.java │ │ │ │ ├── GotoGotoReplacer.java │ │ │ │ ├── GotoReturnReplacer.java │ │ │ │ ├── HorizontalClassMerger.java │ │ │ │ ├── InstructionSequenceConstants.java │ │ │ │ ├── LineNumberLinearizer.java │ │ │ │ ├── MemberPrivatizer.java │ │ │ │ ├── MethodFinalizer.java │ │ │ │ ├── MethodInliner.java │ │ │ │ ├── NoConstructorReferenceReplacer.java │ │ │ │ ├── NopRemover.java │ │ │ │ ├── ReachableCodeMarker.java │ │ │ │ ├── RetargetedClassFilter.java │ │ │ │ ├── RetargetedInnerClassAttributeRemover.java │ │ │ │ ├── ShortMethodInliner.java │ │ │ │ ├── SingleInvocationMethodInliner.java │ │ │ │ ├── TargetClassChanger.java │ │ │ │ ├── UnreachableCodeRemover.java │ │ │ │ ├── UnreachableExceptionRemover.java │ │ │ │ ├── VariableShrinker.java │ │ │ │ ├── VerticalClassMerger.java │ │ │ │ ├── WrapperClassMerger.java │ │ │ │ └── WrapperClassUseSimplifier.java │ │ │ ├── pass/ │ │ │ │ ├── Pass.java │ │ │ │ └── PassRunner.java │ │ │ ├── preverify/ │ │ │ │ ├── PreverificationClearer.java │ │ │ │ ├── Preverifier.java │ │ │ │ └── SubroutineInliner.java │ │ │ ├── shrink/ │ │ │ │ ├── AnnotationUsageMarker.java │ │ │ │ ├── ClassShrinker.java │ │ │ │ ├── ClassUsageMarker.java │ │ │ │ ├── InnerUsageMarker.java │ │ │ │ ├── InterfaceUsageMarker.java │ │ │ │ ├── KotlinModuleShrinker.java │ │ │ │ ├── KotlinModuleUsageMarker.java │ │ │ │ ├── KotlinShrinker.java │ │ │ │ ├── LocalVariableTypeUsageMarker.java │ │ │ │ ├── NestUsageMarker.java │ │ │ │ ├── RecordComponentUsageMarker.java │ │ │ │ ├── ShortestClassUsageMarker.java │ │ │ │ ├── ShortestUsageMark.java │ │ │ │ ├── ShortestUsageMarker.java │ │ │ │ ├── ShortestUsagePrinter.java │ │ │ │ ├── Shrinker.java │ │ │ │ ├── SimpleUsageMarker.java │ │ │ │ ├── UsageMarker.java │ │ │ │ ├── UsagePrinter.java │ │ │ │ ├── UsedClassFilter.java │ │ │ │ ├── UsedMemberFilter.java │ │ │ │ └── shrink/ │ │ │ │ └── package.html │ │ │ ├── strip/ │ │ │ │ └── KotlinAnnotationStripper.java │ │ │ └── util/ │ │ │ ├── Benchmark.java │ │ │ ├── HashUtil.java │ │ │ ├── PrintWriterUtil.java │ │ │ ├── TimeUtil.java │ │ │ ├── TransformedStringMatcher.java │ │ │ └── kotlin/ │ │ │ ├── KotlinUnsupportedVersionChecker.java │ │ │ └── asserter/ │ │ │ ├── KotlinMetadataVerifier.java │ │ │ └── Reporter.java │ │ └── resources/ │ │ └── log4j2.xml │ └── test/ │ └── kotlin/ │ ├── proguard/ │ │ ├── AfterInitConfigurationVerifierTest.kt │ │ ├── ClassMergerTest.kt │ │ ├── ClassSpecificationVisitorFactoryTest.kt │ │ ├── ConfigurationParserTest.kt │ │ ├── Java19RecordPatternTest.kt │ │ ├── Java20RecordPatternTest.kt │ │ ├── LoggingTest.kt │ │ ├── MarkerTest.kt │ │ ├── obfuscate/ │ │ │ ├── SimpleNameFactoryTest.kt │ │ │ └── kotlin/ │ │ │ ├── KotlinCallableReferenceFixerTest.kt │ │ │ ├── KotlinIntrinsicsReplacementSequencesTest.kt │ │ │ └── KotlinValueParameterNameShrinkerTest.kt │ │ ├── optimize/ │ │ │ ├── KotlinContextReceiverParameterShrinkingTest.kt │ │ │ ├── MemberDescriptorSpecializerTest.kt │ │ │ ├── SimpleEnumClassCheckerTest.kt │ │ │ ├── gson/ │ │ │ │ ├── MarkedAnnotationDeleterTest.kt │ │ │ │ └── TypeArgumentFinderTest.kt │ │ │ ├── info/ │ │ │ │ └── InstantiationClassMarkerTest.kt │ │ │ └── peephole/ │ │ │ └── MethodInlinerTest.kt │ │ ├── shrink/ │ │ │ └── ClassUsageMarkerTest.kt │ │ └── util/ │ │ └── ProguardAssemblerTest.kt │ └── testutils/ │ ├── ConfigurationUtil.kt │ ├── JavaUtil.kt │ ├── LogUtils.kt │ ├── ProcessingFlagUtil.kt │ └── TestConfig.kt ├── bin/ │ ├── dprotect.sh │ ├── proguard.bat │ ├── proguard.sh │ ├── proguardgui.bat │ ├── proguardgui.sh │ ├── retrace.bat │ └── retrace.sh ├── build.gradle ├── docs/ │ ├── md/ │ │ ├── css/ │ │ │ ├── admonition.css │ │ │ └── extra.css │ │ ├── downloads.md │ │ ├── index.md │ │ ├── manual/ │ │ │ ├── FAQ.md │ │ │ ├── building.md │ │ │ ├── configuration/ │ │ │ │ ├── attributes.md │ │ │ │ ├── examples.md │ │ │ │ ├── optimizations.md │ │ │ │ └── usage.md │ │ │ ├── feedback.md │ │ │ ├── home.md │ │ │ ├── languages/ │ │ │ │ ├── java.md │ │ │ │ └── kotlin.md │ │ │ ├── license/ │ │ │ │ ├── gpl.md │ │ │ │ ├── gplexception.md │ │ │ │ └── license.md │ │ │ ├── quickstart.md │ │ │ ├── refcard.md │ │ │ ├── releasenotes.md │ │ │ ├── setup/ │ │ │ │ ├── ant.md │ │ │ │ ├── gradle.md │ │ │ │ ├── gradleplugin.md │ │ │ │ └── standalone.md │ │ │ ├── tools/ │ │ │ │ ├── appsweep.md │ │ │ │ ├── playground.md │ │ │ │ └── retrace.md │ │ │ └── troubleshooting/ │ │ │ ├── limitations.md │ │ │ └── troubleshooting.md │ │ └── results.md │ ├── mkdocs.yml │ └── notices/ │ └── Gson ├── dprotect/ │ └── build.gradle ├── examples/ │ ├── android-agp3-agp4/ │ │ ├── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── debug.keystore │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── proguard-project.txt │ │ ├── res/ │ │ │ └── values/ │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── settings.gradle │ │ └── src/ │ │ └── com/ │ │ └── example/ │ │ └── HelloWorldActivity.java │ ├── android-plugin/ │ │ ├── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── debug.keystore │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── proguard-project.txt │ │ ├── res/ │ │ │ └── values/ │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── settings.gradle │ │ └── src/ │ │ └── com/ │ │ └── example/ │ │ └── HelloWorldActivity.java │ ├── annotations/ │ │ ├── examples/ │ │ │ ├── Applet.java │ │ │ ├── Application.java │ │ │ ├── Bean.java │ │ │ └── NativeCallBack.java │ │ └── examples.pro │ ├── ant/ │ │ ├── applets.xml │ │ ├── applications1.xml │ │ ├── applications2.xml │ │ ├── applications3.xml │ │ ├── library.xml │ │ ├── midlets.xml │ │ ├── proguard.xml │ │ └── servlets.xml │ ├── application/ │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── proguard.pro │ │ ├── settings.gradle │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── example/ │ │ └── App.java │ ├── application-kotlin/ │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── proguard.pro │ │ ├── settings.gradle │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── App.kt │ ├── dictionaries/ │ │ ├── compact.txt │ │ ├── keywords.txt │ │ ├── shakespeare.txt │ │ └── windows.txt │ ├── gradle/ │ │ ├── android.gradle │ │ ├── applets.gradle │ │ ├── applications.gradle │ │ ├── library.gradle │ │ ├── midlets.gradle │ │ ├── proguard.gradle │ │ ├── proguardgui.gradle │ │ ├── retrace.gradle │ │ ├── scala.gradle │ │ ├── servlets.gradle │ │ └── settings.gradle │ ├── gradle-kotlin-dsl/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle.kts │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── gradlekotlindsl/ │ │ │ └── App.java │ │ └── test/ │ │ └── java/ │ │ └── gradlekotlindsl/ │ │ └── AppTest.java │ ├── spring-boot/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── demo/ │ │ │ ├── DemoApplication.java │ │ │ ├── TestComponent.java │ │ │ └── sub/ │ │ │ └── TestComponent2.java │ │ └── resources/ │ │ └── application.properties │ └── standalone/ │ ├── android.pro │ ├── applets.pro │ ├── applications.pro │ ├── library.pro │ ├── midlets.pro │ ├── proguard.pro │ ├── proguardgui.pro │ ├── retrace.pro │ ├── scala.pro │ └── servlets.pro ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle-plugin/ │ ├── .gitignore │ ├── build.gradle │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── proguard/ │ │ │ └── gradle/ │ │ │ └── ProGuardTask.java │ │ ├── kotlin/ │ │ │ └── proguard/ │ │ │ └── gradle/ │ │ │ └── plugin/ │ │ │ ├── ProGuardPlugin.kt │ │ │ └── android/ │ │ │ ├── AndroidPlugin.kt │ │ │ ├── ProGuardTransform.kt │ │ │ ├── dsl/ │ │ │ │ ├── ProGuardAndroidExtension.kt │ │ │ │ ├── ProGuardConfiguration.kt │ │ │ │ └── VariantConfiguration.kt │ │ │ ├── tasks/ │ │ │ │ ├── CollectConsumerRulesTask.kt │ │ │ │ └── PrepareProguardConfigDirectoryTask.kt │ │ │ └── transforms/ │ │ │ ├── AndroidConsumerRulesTransform.kt │ │ │ └── ArchiveConsumerRulesTransform.kt │ │ └── resources/ │ │ └── lib/ │ │ ├── proguard-android-common.txt │ │ ├── proguard-android-debug.txt │ │ ├── proguard-android-optimize.txt │ │ └── proguard-android.txt │ └── test/ │ └── kotlin/ │ ├── proguard/ │ │ └── gradle/ │ │ ├── AgpVersionParserTest.kt │ │ ├── ConsumerRulesCollectionTest.kt │ │ ├── ConsumerRulesFilterTest.kt │ │ ├── GradlePluginIntegrationTest.kt │ │ ├── ProGuardPluginLegacyAGPIntegrationTest.kt │ │ ├── ProGuardPluginTest.kt │ │ ├── ProguardCacheRelocateabilityIntegrationTest.kt │ │ └── plugin/ │ │ └── android/ │ │ └── dsl/ │ │ ├── AaptRulesTest.kt │ │ ├── ConfigurationOrderTest.kt │ │ ├── ConfigurationTest.kt │ │ ├── DefaultConfigurationTest.kt │ │ └── FlavorsConfigurationTest.kt │ └── testutils/ │ ├── AndroidProjectBuilder.kt │ ├── GradleRunnerUtil.kt │ └── TestPluginClasspath.kt ├── gradle.properties ├── gradlew ├── gradlew.bat ├── gui/ │ ├── build.gradle │ └── src/ │ └── proguard/ │ └── gui/ │ ├── ClassPathPanel.java │ ├── ClassSpecificationDialog.java │ ├── ClassSpecificationsPanel.java │ ├── ExtensionFileFilter.java │ ├── FilterBuilder.java │ ├── FilterDialog.java │ ├── GUIResources.java │ ├── GUIResources.properties │ ├── JavaUtil.java │ ├── KeepSpecificationsPanel.java │ ├── ListPanel.java │ ├── MemberSpecificationDialog.java │ ├── MemberSpecificationsPanel.java │ ├── MessageDialogRunnable.java │ ├── OptimizationsDialog.java │ ├── ProGuardGUI.java │ ├── ProGuardRunnable.java │ ├── ReTraceRunnable.java │ ├── SwingUtil.java │ ├── TabbedPane.java │ ├── TextAreaOutputStream.java │ ├── TextAreaWriter.java │ ├── boilerplate.pro │ ├── default.pro │ ├── package.html │ └── splash/ │ ├── BufferedSprite.java │ ├── CircleSprite.java │ ├── ClipSprite.java │ ├── ColorSprite.java │ ├── CompositeSprite.java │ ├── ConstantColor.java │ ├── ConstantDouble.java │ ├── ConstantFont.java │ ├── ConstantInt.java │ ├── ConstantString.java │ ├── ConstantTiming.java │ ├── FontSprite.java │ ├── ImageSprite.java │ ├── LinearColor.java │ ├── LinearDouble.java │ ├── LinearInt.java │ ├── LinearTiming.java │ ├── OverrideGraphics2D.java │ ├── RectangleSprite.java │ ├── SawToothTiming.java │ ├── ShadowedSprite.java │ ├── SineTiming.java │ ├── SmoothTiming.java │ ├── SplashPanel.java │ ├── Sprite.java │ ├── TextSprite.java │ ├── TimeSwitchSprite.java │ ├── Timing.java │ ├── TypeWriterString.java │ ├── VariableColor.java │ ├── VariableDouble.java │ ├── VariableFont.java │ ├── VariableInt.java │ ├── VariableSizeFont.java │ ├── VariableString.java │ └── package.html ├── proguard-app/ │ └── build.gradle ├── retrace/ │ ├── build.gradle │ └── src/ │ └── proguard/ │ └── retrace/ │ ├── FrameInfo.java │ ├── FramePattern.java │ ├── FrameRemapper.java │ ├── ReTrace.java │ └── package.html ├── scripts/ │ ├── docker/ │ │ ├── gh_action.sh │ │ └── publish_gradle_plugin.sh │ └── fetch_dprotect_core.py └── settings.gradle
Showing preview only (420K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4392 symbols across 451 files)
FILE: .github/scripts/s3-deploy.py
class CI (line 12) | class CI(Enum):
function pretty_ci_name (line 16) | def pretty_ci_name(ci):
function is_pr (line 19) | def is_pr(ci):
function get_branch (line 26) | def get_branch(ci):
function get_ci_workdir (line 31) | def get_ci_workdir(ci):
function get_tag (line 37) | def get_tag(ci):
function push (line 133) | def push(file: str, dir_name: str):
function filename (line 146) | def filename(object):
function generate_index (line 149) | def generate_index(dir_name: str):
FILE: ant/src/proguard/ant/ClassPathElement.java
class ClassPathElement (line 36) | public class ClassPathElement extends Path
method ClassPathElement (line 50) | public ClassPathElement(Project project)
method appendClassPathEntriesTo (line 61) | public void appendClassPathEntriesTo(ClassPath classPath, boolean output)
method setFile (line 143) | public void setFile(File file)
method setDir (line 152) | public void setDir(File file)
method setName (line 161) | public void setName(File file)
method setFilter (line 167) | public void setFilter(String filter)
method setApkfilter (line 173) | public void setApkfilter(String apkFilter)
method setJarfilter (line 179) | public void setJarfilter(String jarFilter)
method setAarfilter (line 185) | public void setAarfilter(String aarFilter)
method setWarfilter (line 191) | public void setWarfilter(String warFilter)
method setEarfilter (line 197) | public void setEarfilter(String earFilter)
method setZipfilter (line 203) | public void setZipfilter(String zipFilter)
FILE: ant/src/proguard/ant/ClassSpecificationElement.java
class ClassSpecificationElement (line 36) | public class ClassSpecificationElement extends DataType
method appendTo (line 54) | public void appendTo(List classSpecifications)
method createClassSpecification (line 74) | protected ClassSpecification createClassSpecification(ClassSpecificati...
method setAccess (line 116) | public void setAccess(String access)
method setAnnotation (line 122) | public void setAnnotation(String annotation)
method setType (line 128) | public void setType(String type)
method setName (line 134) | public void setName(String name)
method setExtendsannotation (line 140) | public void setExtendsannotation(String extendsAnnotation)
method setExtends (line 146) | public void setExtends(String extends_)
method setImplements (line 152) | public void setImplements(String implements_)
method addConfiguredField (line 160) | public void addConfiguredField(MemberSpecificationElement memberSpecif...
method addConfiguredMethod (line 173) | public void addConfiguredMethod(MemberSpecificationElement memberSpeci...
method addConfiguredConstructor (line 186) | public void addConfiguredConstructor(MemberSpecificationElement member...
method requiredAccessFlags (line 201) | private int requiredAccessFlags(boolean set,
FILE: ant/src/proguard/ant/ConfigurationElement.java
class ConfigurationElement (line 36) | public class ConfigurationElement extends FileSet
method appendTo (line 43) | public void appendTo(Configuration configuration)
FILE: ant/src/proguard/ant/ConfigurationTask.java
class ConfigurationTask (line 34) | public class ConfigurationTask extends Task
method appendTo (line 43) | public void appendTo(Configuration configuration)
method addConfiguredInjar (line 104) | public void addConfiguredInjar(ClassPathElement classPathElement)
method addConfiguredOutjar (line 112) | public void addConfiguredOutjar(ClassPathElement classPathElement)
method addConfiguredLibraryjar (line 120) | public void addConfiguredLibraryjar(ClassPathElement classPathElement)
method addConfiguredKeepdirectory (line 128) | public void addConfiguredKeepdirectory(FilterElement filterElement)
method addConfiguredKeepdirectories (line 135) | public void addConfiguredKeepdirectories(FilterElement filterElement)
method addConfiguredKeep (line 142) | public void addConfiguredKeep(KeepSpecificationElement keepSpecificati...
method addConfiguredKeepclassmembers (line 152) | public void addConfiguredKeepclassmembers(KeepSpecificationElement kee...
method addConfiguredKeepclasseswithmembers (line 162) | public void addConfiguredKeepclasseswithmembers(KeepSpecificationEleme...
method addConfiguredKeepnames (line 172) | public void addConfiguredKeepnames(KeepSpecificationElement keepSpecif...
method addConfiguredKeepclassmembernames (line 185) | public void addConfiguredKeepclassmembernames(KeepSpecificationElement...
method addConfiguredKeepclasseswithmembernames (line 198) | public void addConfiguredKeepclasseswithmembernames(KeepSpecificationE...
method addConfiguredWhyareyoukeeping (line 211) | public void addConfiguredWhyareyoukeeping(ClassSpecificationElement cl...
method addConfiguredAssumenosideeffects (line 218) | public void addConfiguredAssumenosideeffects(ClassSpecificationElement...
method addConfiguredAssumenoexternalsideeffects (line 225) | public void addConfiguredAssumenoexternalsideeffects(ClassSpecificatio...
method addConfiguredAssumenoescapingparameters (line 232) | public void addConfiguredAssumenoescapingparameters(ClassSpecification...
method addConfiguredAssumenoexternalreturnvalues (line 239) | public void addConfiguredAssumenoexternalreturnvalues(ClassSpecificati...
method addConfiguredAssumevalues (line 246) | public void addConfiguredAssumevalues(ClassSpecificationElement classS...
method addConfiguredOptimizations (line 253) | public void addConfiguredOptimizations(FilterElement filterElement)
method addConfiguredOptimization (line 259) | public void addConfiguredOptimization(FilterElement filterElement)
method addConfiguredKeeppackagename (line 266) | public void addConfiguredKeeppackagename(FilterElement filterElement)
method addConfiguredKeeppackagenames (line 274) | public void addConfiguredKeeppackagenames(FilterElement filterElement)
method addConfiguredKeepattributes (line 282) | public void addConfiguredKeepattributes(FilterElement filterElement)
method addConfiguredKeepattribute (line 288) | public void addConfiguredKeepattribute(FilterElement filterElement)
method addConfiguredAdaptclassstrings (line 295) | public void addConfiguredAdaptclassstrings(FilterElement filterElement)
method addConfiguredAdaptresourcefilenames (line 302) | public void addConfiguredAdaptresourcefilenames(FilterElement filterEl...
method addConfiguredAdaptresourcefilecontents (line 309) | public void addConfiguredAdaptresourcefilecontents(FilterElement filte...
method addConfiguredDontnote (line 316) | public void addConfiguredDontnote(FilterElement filterElement)
method addConfiguredDontwarn (line 322) | public void addConfiguredDontwarn(FilterElement filterElement)
method addConfiguredConfiguration (line 328) | public void addConfiguredConfiguration(ConfigurationElement configurat...
method addText (line 336) | public void addText(String text) throws BuildException
method extendClassPath (line 371) | private ClassPath extendClassPath(ClassPath classPath,
method extendClassPath (line 387) | private ClassPath extendClassPath(ClassPath classPath,
method extendKeepSpecifications (line 404) | private List extendKeepSpecifications(List keepSpe...
method extendClassSpecifications (line 424) | private List extendClassSpecifications(List class...
method extendClassSpecifications (line 438) | private List extendClassSpecifications(List classSpecifications,
method extendFilter (line 455) | private List extendFilter(List filter,
method extendFilter (line 462) | private List extendFilter(List filter,
method extendList (line 477) | private List extendList(List list,
FILE: ant/src/proguard/ant/FilterElement.java
class FilterElement (line 34) | public class FilterElement extends DataType
method appendTo (line 45) | public void appendTo(List filter, boolean internal)
method setName (line 75) | public void setName(String name)
method setFilter (line 81) | public void setFilter(String filter)
FILE: ant/src/proguard/ant/KeepSpecificationElement.java
class KeepSpecificationElement (line 32) | public class KeepSpecificationElement extends ClassSpecificationElement
method appendTo (line 48) | public void appendTo(List keepSpecifications,
method setIncludedescriptorclasses (line 78) | public void setIncludedescriptorclasses(boolean markDescriptorClasses)
method setIncludecode (line 84) | public void setIncludecode(boolean markCodeAttributes)
method setAllowshrinking (line 90) | public void setAllowshrinking(boolean allowShrinking)
method setAllowoptimization (line 96) | public void setAllowoptimization(boolean allowOptimization)
method setAllowobfuscation (line 102) | public void setAllowobfuscation(boolean allowObfuscation)
FILE: ant/src/proguard/ant/MemberSpecificationElement.java
class MemberSpecificationElement (line 37) | public class MemberSpecificationElement extends DataType
method appendTo (line 57) | public void appendTo(List memberSpecifications,
method setAccess (line 152) | public void setAccess(String access)
method setAnnotation (line 158) | public void setAnnotation(String annotation)
method setType (line 164) | public void setType(String type)
method setName (line 170) | public void setName(String name)
method setParameters (line 176) | public void setParameters(String parameters)
method setParam (line 185) | public void setParam(String parameters)
method setValues (line 191) | public void setValues(String values)
method requiredAccessFlags (line 199) | private int requiredAccessFlags(boolean set,
method parseValues (line 253) | private Number[] parseValues(String externalType,
method parseValue (line 277) | private Number parseValue(String externalType,
method parseBoolean (line 325) | private Integer parseBoolean(String string)
FILE: ant/src/proguard/ant/ProGuardTask.java
class ProGuardTask (line 36) | public class ProGuardTask extends ConfigurationTask
method setConfiguration (line 40) | public void setConfiguration(File configurationFile) throws BuildExcep...
method setOutjar (line 73) | public void setOutjar(String parameters)
method setSkipnonpubliclibraryclasses (line 79) | public void setSkipnonpubliclibraryclasses(boolean skipNonPublicLibrar...
method setSkipnonpubliclibraryclassmembers (line 85) | public void setSkipnonpubliclibraryclassmembers(boolean skipNonPublicL...
method setTarget (line 91) | public void setTarget(String target)
method setForceprocessing (line 101) | public void setForceprocessing(boolean forceProcessing)
method setPrintseeds (line 107) | public void setPrintseeds(File printSeeds)
method setShrink (line 113) | public void setShrink(boolean shrink)
method setPrintusage (line 119) | public void setPrintusage(File printUsage)
method setOptimize (line 125) | public void setOptimize(boolean optimize)
method setOptimizationpasses (line 131) | public void setOptimizationpasses(int optimizationPasses)
method setAllowaccessmodification (line 137) | public void setAllowaccessmodification(boolean allowAccessModification)
method setMergeinterfacesaggressively (line 143) | public void setMergeinterfacesaggressively(boolean mergeinterfacesaggr...
method setObfuscate (line 149) | public void setObfuscate(boolean obfuscate)
method setPrintmapping (line 155) | public void setPrintmapping(File printMapping)
method setApplymapping (line 161) | public void setApplymapping(File applyMapping)
method setObfuscationdictionary (line 167) | public void setObfuscationdictionary(File obfuscationDictionary)
method setClassobfuscationdictionary (line 173) | public void setClassobfuscationdictionary(File classObfuscationDiction...
method setPackageobfuscationdictionary (line 179) | public void setPackageobfuscationdictionary(File packageObfuscationDic...
method setOverloadaggressively (line 185) | public void setOverloadaggressively(boolean overloadAggressively)
method setUseuniqueclassmembernames (line 191) | public void setUseuniqueclassmembernames(boolean useUniqueClassMemberN...
method setUsemixedcaseclassnames (line 197) | public void setUsemixedcaseclassnames(boolean useMixedCaseClassNames)
method setFlattenpackagehierarchy (line 203) | public void setFlattenpackagehierarchy(String flattenPackageHierarchy)
method setRepackageclasses (line 209) | public void setRepackageclasses(String repackageClasses)
method setDefaultpackage (line 217) | public void setDefaultpackage(String defaultPackage)
method setKeepparameternames (line 223) | public void setKeepparameternames(boolean keepParameterNames)
method setRenamesourcefileattribute (line 229) | public void setRenamesourcefileattribute(String newSourceFileAttribute)
method setPreverify (line 235) | public void setPreverify(boolean preverify)
method setMicroedition (line 241) | public void setMicroedition(boolean microEdition)
method setAndroid (line 247) | public void setAndroid(boolean android)
method setVerbose (line 253) | public void setVerbose(boolean verbose)
method setNote (line 259) | public void setNote(boolean note)
method setWarn (line 278) | public void setWarn(boolean warn)
method setIgnorewarnings (line 297) | public void setIgnorewarnings(boolean ignoreWarnings)
method setPrintconfiguration (line 303) | public void setPrintconfiguration(File printConfiguration)
method setDump (line 309) | public void setDump(File dump)
method setAddconfigurationdebugging (line 315) | public void setAddconfigurationdebugging(boolean addConfigurationDebug...
method setKeepkotlinmetadata (line 320) | public void setKeepkotlinmetadata(boolean keepKotlinMetadata)
method execute (line 328) | public void execute() throws BuildException
method optionalFile (line 349) | private File optionalFile(File file)
method resolvedURL (line 368) | private URL resolvedURL(File file)
method resolvedFile (line 385) | private File resolvedFile(File file)
FILE: base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java
class ArithmeticObfuscationClassSpecification (line 4) | public class ArithmeticObfuscationClassSpecification extends Obfuscation...
method ArithmeticObfuscationClassSpecification (line 8) | public ArithmeticObfuscationClassSpecification(ClassSpecification clas...
method equals (line 16) | @Override
method hashCode (line 31) | @Override
method clone (line 40) | @Override
FILE: base/src/main/java/dprotect/CFObfuscationClassSpecification.java
class CFObfuscationClassSpecification (line 4) | public class CFObfuscationClassSpecification extends ObfuscationClassSpe...
method CFObfuscationClassSpecification (line 6) | public CFObfuscationClassSpecification(ClassSpecification classSpecifi...
method equals (line 12) | @Override
method hashCode (line 25) | @Override
method clone (line 32) | @Override
FILE: base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java
class ClassObfuSpecVisitorFactory (line 10) | public class ClassObfuSpecVisitorFactory extends ClassSpecificationVisit...
method createClassPoolVisitor (line 12) | public ClassPoolVisitor createClassPoolVisitor(List classSpecifications,
FILE: base/src/main/java/dprotect/Configuration.java
class Configuration (line 13) | public class Configuration extends proguard.Configuration
FILE: base/src/main/java/dprotect/ConfigurationConstants.java
class ConfigurationConstants (line 3) | public class ConfigurationConstants extends proguard.ConfigurationConstants
FILE: base/src/main/java/dprotect/ConfigurationParser.java
class ConfigurationParser (line 16) | public class ConfigurationParser extends proguard.ConfigurationParser
method ConfigurationParser (line 21) | public ConfigurationParser(String[] args,
method ConfigurationParser (line 29) | public ConfigurationParser(String[] args,
method ConfigurationParser (line 38) | public ConfigurationParser(String lines,
method ConfigurationParser (line 48) | public ConfigurationParser(File file) throws IOException
method ConfigurationParser (line 55) | public ConfigurationParser(File file,
method ConfigurationParser (line 63) | public ConfigurationParser(URL url,
method ConfigurationParser (line 71) | public ConfigurationParser(WordReader reader,
method parse (line 78) | public void parse(Configuration configuration)
method parseObfuscationConfig (line 177) | public void parseObfuscationConfig(Configuration configuration)
method parseStringOpt (line 195) | private void parseStringOpt(Configuration configuration)
method parseArithmeticOpt (line 232) | private void parseArithmeticOpt(Configuration configuration)
method parseConstantsOpt (line 300) | private void parseConstantsOpt(Configuration configuration)
method parseControlFlowOpt (line 329) | private void parseControlFlowOpt(Configuration configuration)
FILE: base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java
class ConstantObfuscationClassSpecification (line 4) | public class ConstantObfuscationClassSpecification extends ObfuscationCl...
method ConstantObfuscationClassSpecification (line 6) | public ConstantObfuscationClassSpecification(ClassSpecification classS...
method equals (line 12) | @Override
method hashCode (line 25) | @Override
method clone (line 32) | @Override
FILE: base/src/main/java/dprotect/DProtect.java
class DProtect (line 55) | public class DProtect
method DProtect (line 72) | public DProtect(Configuration configuration)
method execute (line 82) | public void execute() throws Exception
method checkGpl (line 270) | private void checkGpl()
method requiresKotlinMetadata (line 275) | private boolean requiresKotlinMetadata()
method printConfiguration (line 290) | private void printConfiguration() throws IOException
method checkConfiguration (line 304) | private void checkConfiguration() throws IOException
method checkUpToDate (line 313) | private void checkUpToDate()
method readInput (line 322) | private void readInput() throws Exception
method clearPreverification (line 332) | private void clearPreverification() throws Exception
method initialize (line 342) | private void initialize() throws Exception
method mark (line 362) | private void mark() throws Exception
method stripKotlinMetadataAnnotations (line 371) | private void stripKotlinMetadataAnnotations() throws Exception
method checkConfigurationAfterInitialization (line 379) | private void checkConfigurationAfterInitialization() throws Exception
method introducePrimitiveArrayConstants (line 387) | private void introducePrimitiveArrayConstants() throws Exception
method backport (line 396) | private void backport() throws Exception
method addConfigurationLogging (line 406) | private void addConfigurationLogging() throws Exception
method printSeeds (line 416) | private void printSeeds() throws Exception
method inlineSubroutines (line 425) | private void inlineSubroutines() throws Exception
method shrink (line 435) | private void shrink(boolean afterOptimizer) throws Exception
method optimizeGson (line 451) | private void optimizeGson() throws Exception
method optimize (line 461) | private void optimize() throws Exception
method linearizeLineNumbers (line 483) | private void linearizeLineNumbers() throws Exception
method markObfuscation (line 493) | private void markObfuscation() throws Exception
method obfuscate (line 502) | private void obfuscate() throws Exception
method adaptKotlinMetadata (line 540) | private void adaptKotlinMetadata() throws Exception
method expandPrimitiveArrayConstants (line 550) | private void expandPrimitiveArrayConstants()
method target (line 559) | private void target() throws Exception
method preverify (line 568) | private void preverify() throws Exception
method trimLineNumbers (line 578) | private void trimLineNumbers() throws Exception
method sortClassElements (line 587) | private void sortClassElements()
method writeOutput (line 605) | private void writeOutput() throws Exception
method dump (line 615) | private void dump() throws Exception
method getVersion (line 624) | public static String getVersion()
method main (line 643) | public static void main(String[] args)
FILE: base/src/main/java/dprotect/ObfuscationClassSpecification.java
class ObfuscationClassSpecification (line 5) | public class ObfuscationClassSpecification extends ClassSpecification
type Level (line 7) | public static enum Level {
method ObfuscationClassSpecification (line 13) | public ObfuscationClassSpecification(ClassSpecification classSpecifica...
method ObfuscationClassSpecification (line 20) | public ObfuscationClassSpecification(ClassSpecification classSpecifica...
method equals (line 25) | @Override
method hashCode (line 40) | @Override
method clone (line 46) | @Override
FILE: base/src/main/java/dprotect/deobfuscation/Deobfuscator.java
class Deobfuscator (line 28) | public class Deobfuscator implements Pass
method Deobfuscator (line 41) | public Deobfuscator(Configuration configuration)
method execute (line 49) | @Override
method deobfuscate (line 78) | private void deobfuscate(Configuration configuration,
FILE: base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java
class XoredStrings (line 20) | public class XoredStrings
class LdcInfo (line 35) | private class LdcInfo
method LdcInfo (line 39) | LdcInfo(int offset, byte opcode)
method XoredStrings (line 46) | public XoredStrings(String talsecKey, ClassSpecification decodeInfo)
method isDecodeMethod (line 52) | private boolean isDecodeMethod(String clazz, String method)
method hex2bytes (line 73) | public static byte[] hex2bytes(String s) {
method decode (line 83) | private String decode(byte[] bytes) {
method decode (line 91) | private String decode(String enc)
method visitAnyAttribute (line 98) | @Override
method visitCodeAttribute (line 101) | @Override
method visitAnyInstruction (line 111) | @Override
method visitConstantInstruction (line 114) | @Override
method visitStringConstant (line 153) | @Override
method visitUtf8Constant (line 159) | @Override
method visitAnyConstant (line 165) | @Override
FILE: base/src/main/java/dprotect/obfuscation/CodeObfuscator.java
class CodeObfuscator (line 28) | public class CodeObfuscator implements Pass
method CodeObfuscator (line 44) | public CodeObfuscator(Configuration configuration)
method execute (line 52) | @Override
method obfuscate (line 81) | private void obfuscate(Configuration configuration,
method runStringObfuscation (line 135) | private void runStringObfuscation(Configuration configuration,
method runArithmeticObfuscation (line 173) | private void runArithmeticObfuscation(Configuration configuration,
method runControlFlowObfuscation (line 213) | private void runControlFlowObfuscation(Configuration configura...
method runConstantsObfuscation (line 241) | private void runConstantsObfuscation(Configuration configuration,
FILE: base/src/main/java/dprotect/obfuscation/Marker.java
class Marker (line 20) | public class Marker implements Pass
method Marker (line 26) | public Marker(Configuration configuration)
method execute (line 31) | @Override
method createStringObfuscationMarker (line 55) | private ClassPoolVisitor createStringObfuscationMarker(Configuration c...
method createArithmeticObfuscationMarker (line 64) | private ClassPoolVisitor createArithmeticObfuscationMarker(Configurati...
method createConstantsObfuscationMarker (line 74) | private ClassPoolVisitor createConstantsObfuscationMarker(Configuratio...
method createCFObfuscationMarker (line 84) | private ClassPoolVisitor createCFObfuscationMarker(Configuration confi...
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationFilter.java
class ArithmeticObfuscationFilter (line 11) | public class ArithmeticObfuscationFilter
method ArithmeticObfuscationFilter (line 19) | public ArithmeticObfuscationFilter(MemberVisitor visitor)
method visitAnyMember (line 24) | @Override
method visitProgramMethod (line 28) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationInfo.java
class ArithmeticObfuscationInfo (line 4) | public class ArithmeticObfuscationInfo
method ArithmeticObfuscationInfo (line 9) | public ArithmeticObfuscationInfo(Level level)
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationMarker.java
class ArithmeticObfuscationMarker (line 13) | public class ArithmeticObfuscationMarker
method ArithmeticObfuscationMarker (line 21) | public ArithmeticObfuscationMarker(ObfuscationClassSpecification spec)
method visitAnyClass (line 28) | @Override
method visitProgramClass (line 31) | @Override
method visitAnyMember (line 43) | @Override
method visitProgramMethod (line 46) | @Override
method visitProgramField (line 57) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBANormalizer.java
class MBANormalizer (line 10) | public class MBANormalizer
method MBANormalizer (line 21) | public MBANormalizer(ClassPool programClassPool,
method getSequences (line 70) | @Override
method getConstants (line 75) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAdd.java
class MBAObfuscationAdd (line 11) | public class MBAObfuscationAdd
method MBAObfuscationAdd (line 22) | public MBAObfuscationAdd(ClassPool programClassPool,
method getSequences (line 315) | @Override
method getConstants (line 320) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAnd.java
class MBAObfuscationAnd (line 10) | public class MBAObfuscationAnd
method MBAObfuscationAnd (line 19) | public MBAObfuscationAnd(ClassPool programClassPool,
method getSequences (line 145) | @Override
method getConstants (line 150) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationOr.java
class MBAObfuscationOr (line 11) | public class MBAObfuscationOr
method MBAObfuscationOr (line 21) | public MBAObfuscationOr(ClassPool programClassPool,
method getSequences (line 189) | @Override
method getConstants (line 194) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationSub.java
class MBAObfuscationSub (line 11) | public class MBAObfuscationSub
method MBAObfuscationSub (line 20) | public MBAObfuscationSub(ClassPool programClassPool,
method getSequences (line 176) | @Override
method getConstants (line 181) | @Override
FILE: base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationXor.java
class MBAObfuscationXor (line 11) | public class MBAObfuscationXor
method MBAObfuscationXor (line 25) | public MBAObfuscationXor(ClassPool programClassPool,
method getSequences (line 199) | @Override
method getConstants (line 204) | @Override
FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantFieldMarker.java
class ConstantFieldMarker (line 17) | public class ConstantFieldMarker
method visitAnyInstruction (line 25) | @Override
method visitConstantInstruction (line 28) | @Override
method visitFieldrefConstant (line 40) | @Override
method visitStringConstant (line 45) | @Override
method visitAnyConstant (line 50) | @Override
FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationInfo.java
class ConstantObfuscationInfo (line 4) | public class ConstantObfuscationInfo
method ConstantObfuscationInfo (line 8) | public ConstantObfuscationInfo(Level level)
FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationMarker.java
class ConstantObfuscationMarker (line 15) | public class ConstantObfuscationMarker
method ConstantObfuscationMarker (line 22) | public ConstantObfuscationMarker(ObfuscationClassSpecification spec)
method visitAnyClass (line 29) | @Override
method visitProgramClass (line 32) | @Override
method visitAnyMember (line 46) | @Override
method visitProgramMethod (line 49) | @Override
method visitProgramField (line 59) | @Override
FILE: base/src/main/java/dprotect/obfuscation/constants/ConstantsObfuscator.java
class ConstantsObfuscator (line 21) | public class ConstantsObfuscator
method ConstantsObfuscator (line 37) | public ConstantsObfuscator(int seed)
method visitAnyClass (line 43) | @Override
method visitProgramClass (line 51) | @Override
method visitAnyAttribute (line 97) | @Override
method visitCodeAttribute (line 100) | @Override
method visitAnyInstruction (line 110) | @Override
method visitSimpleInstruction (line 113) | @Override
method visitConstantInstruction (line 206) | @Override
method visitIntegerConstant (line 266) | @Override
method visitLongConstant (line 272) | @Override
method visitAnyConstant (line 278) | @Override
method getOrInsert (line 284) | int getOrInsert(Long value)
FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscation.java
class ControlFlowObfuscation (line 21) | public class ControlFlowObfuscation
method ControlFlowObfuscation (line 39) | public ControlFlowObfuscation(int seed)
method visitAnyClass (line 46) | @Override
method visitProgramClass (line 54) | @Override
method visitAnyAttribute (line 70) | @Override
method visitCodeAttribute (line 73) | @Override
method visitAnyInstruction (line 101) | @Override
method visitBranchInstruction (line 104) | @Override
method getInvariantValue (line 164) | int getInvariantValue(int range)
method insertOpaquePredicate (line 171) | private InstructionSequenceBuilder insertOpaquePredicate(Clazz clazz, ...
method prepareClassFields (line 245) | private void prepareClassFields(ProgramClass programClass)
class FrameFinder (line 270) | private static class FrameFinder
method FrameFinder (line 279) | public FrameFinder(PartialEvaluator evaluator,
method visitAnyInstruction (line 288) | @Override
method showInst (line 341) | private void showInst(Clazz clazz, Method method, CodeAttribute codeAt...
method showEvaluatedInst (line 353) | private void showEvaluatedInst(Clazz clazz, Method method, CodeAttribu...
FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationInfo.java
class ControlFlowObfuscationInfo (line 4) | public class ControlFlowObfuscationInfo
method ControlFlowObfuscationInfo (line 8) | public ControlFlowObfuscationInfo(Level level)
FILE: base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationMarker.java
class ControlFlowObfuscationMarker (line 15) | public class ControlFlowObfuscationMarker
method ControlFlowObfuscationMarker (line 22) | public ControlFlowObfuscationMarker(ObfuscationClassSpecification spec)
method visitAnyClass (line 29) | @Override
method visitProgramClass (line 32) | @Override
method visitAnyMember (line 46) | @Override
method visitProgramMethod (line 49) | @Override
method visitProgramField (line 59) | @Override
FILE: base/src/main/java/dprotect/obfuscation/info/ObfuscationInfo.java
class ObfuscationInfo (line 12) | public class ObfuscationInfo
method setClassObfuscationInfo (line 19) | public static void setClassObfuscationInfo(Clazz clazz) {
method setMethodObfuscationInfo (line 23) | public static void setMethodObfuscationInfo(Method meth) {
method setFieldObfuscationInfo (line 27) | public static void setFieldObfuscationInfo(Field field) {
method setConstantObfuscationInfo (line 31) | public static void setConstantObfuscationInfo(Constant constant) {
method getObfuscationInfo (line 35) | public static ObfuscationInfo getObfuscationInfo(Clazz clazz) {
method getObfuscationInfo (line 39) | public static ObfuscationInfo getObfuscationInfo(Method meth) {
method getObfuscationInfo (line 43) | public static ObfuscationInfo getObfuscationInfo(Field field) {
method getObfuscationInfo (line 47) | public static ObfuscationInfo getObfuscationInfo(Constant constant) {
FILE: base/src/main/java/dprotect/obfuscation/info/ObfuscationInfoSetter.java
class ObfuscationInfoSetter (line 10) | public class ObfuscationInfoSetter
method ObfuscationInfoSetter (line 17) | public ObfuscationInfoSetter()
method ObfuscationInfoSetter (line 22) | public ObfuscationInfoSetter(boolean overwrite)
method visitAnyClass (line 29) | @Override
method visitProgramClass (line 32) | @Override
method visitAnyMember (line 45) | @Override
method visitProgramMethod (line 48) | @Override
method visitProgramField (line 57) | @Override
method visitAnyConstant (line 66) | @Override
FILE: base/src/main/java/dprotect/obfuscation/strings/StringFieldMarker.java
class StringFieldMarker (line 16) | public class StringFieldMarker
method visitAnyInstruction (line 26) | @Override
method visitConstantInstruction (line 29) | @Override
method visitFieldrefConstant (line 48) | @Override
method visitStringConstant (line 60) | @Override
method visitAnyConstant (line 66) | @Override
FILE: base/src/main/java/dprotect/obfuscation/strings/StringObfuscationMarker.java
class StringObfuscationMarker (line 12) | public class StringObfuscationMarker
method visitAnyClass (line 21) | @Override
method visitProgramClass (line 24) | @Override
method visitAnyMember (line 34) | @Override
method visitProgramMethod (line 37) | @Override
method visitProgramField (line 43) | @Override
FILE: base/src/main/java/dprotect/obfuscation/strings/StringObfuscator.java
class StringObfuscator (line 32) | public class StringObfuscator
method StringObfuscator (line 52) | public StringObfuscator(List<String> strings, int seed)
method visitAnyClass (line 65) | @Override
method visitAnyAttribute (line 85) | @Override
method visitCodeAttribute (line 88) | @Override
method visitAnyInstruction (line 101) | @Override
method visitConstantInstruction (line 104) | @Override
method visitStringConstant (line 131) | @Override
method visitUtf8Constant (line 139) | @Override
method visitAnyConstant (line 159) | @Override
method addDecodeMethod (line 162) | void addDecodeMethod(ProgramClass target, Clazz src) {
method markDecodeMethod (line 188) | void markDecodeMethod(Method method) {
class KeyChanger (line 195) | static private class KeyChanger
method KeyChanger (line 206) | public KeyChanger(char newKey)
method visitAnyAttribute (line 213) | @Override
method visitCodeAttribute (line 216) | @Override
method visitAnyInstruction (line 226) | @Override
method visitConstantInstruction (line 229) | @Override
method visitIntegerConstant (line 252) | @Override
FILE: base/src/main/java/dprotect/runtime/strings/StringEncoding.java
class StringEncoding (line 10) | public class StringEncoding {
class EncodingPair (line 11) | public static class EncodingPair {
method EncodingPair (line 14) | public EncodingPair(Method encode, Method decode)
method simpleXorDecode (line 49) | public static String simpleXorDecode(String str)
method simpleXorEncode (line 59) | public static String simpleXorEncode(String str, char key)
method simpleIndexedXorDecode (line 72) | public static String simpleIndexedXorDecode(String str)
method simpleIndexedXorEncode (line 82) | public static String simpleIndexedXorEncode(String str, char key)
method fibonnaciLFSRDecode (line 95) | public static String fibonnaciLFSRDecode(String str)
method fibonnaciLFSREncode (line 111) | public static String fibonnaciLFSREncode(String str, char key)
FILE: base/src/main/java/dprotect/runtime/util/Helpers.java
class Helpers (line 3) | public class Helpers {
method getNormalizedClassName (line 4) | public static String getNormalizedClassName(Class cls)
FILE: base/src/main/java/dprotect/runtime/util/Loader.java
class Loader (line 14) | public class Loader {
method currentJar (line 15) | public static File currentJar() throws URISyntaxException {
method getRuntimeClasses (line 19) | public static ClassPool getRuntimeClasses() {
FILE: base/src/main/java/proguard/AfterInitConfigurationVerifier.java
class AfterInitConfigurationVerifier (line 21) | public class AfterInitConfigurationVerifier implements Pass
method AfterInitConfigurationVerifier (line 27) | public AfterInitConfigurationVerifier(Configuration configuration)
method execute (line 32) | @Override
class BackportMaxVersionVisitor (line 43) | private static class BackportMaxVersionVisitor implements ClassVisitor {
method BackportMaxVersionVisitor (line 49) | private BackportMaxVersionVisitor(int maxClassFileVersion, int target)
method visitProgramClass (line 57) | @Override
method visitAnyClass (line 77) | @Override
FILE: base/src/main/java/proguard/AppView.java
class AppView (line 15) | public class AppView
method AppView (line 29) | public AppView(ClassPool programClassPool, ClassPool libraryClassPool)
method AppView (line 34) | public AppView()
method AppView (line 39) | public AppView(ClassPool programClassPool,
FILE: base/src/main/java/proguard/ArgumentWordReader.java
class ArgumentWordReader (line 32) | public class ArgumentWordReader extends WordReader
method ArgumentWordReader (line 52) | public ArgumentWordReader(String[] arguments, File baseDir)
method nextLine (line 62) | protected String nextLine() throws IOException
method lineLocationDescription (line 70) | protected String lineLocationDescription()
method main (line 80) | public static void main(String[] args) {
FILE: base/src/main/java/proguard/AssumeNoSideEffectsChecker.java
class AssumeNoSideEffectsChecker (line 33) | public class AssumeNoSideEffectsChecker
method AssumeNoSideEffectsChecker (line 41) | public AssumeNoSideEffectsChecker(WarningPrinter notePrinter)
method checkClassSpecifications (line 51) | public void checkClassSpecifications(List classSpecifications)
FILE: base/src/main/java/proguard/ClassMemberChecker.java
class ClassMemberChecker (line 37) | public class ClassMemberChecker
method ClassMemberChecker (line 48) | public ClassMemberChecker(ClassPool programClassPool,
method checkClassSpecifications (line 60) | public void checkClassSpecifications(List classSpecifications)
method checkMemberSpecifications (line 90) | private void checkMemberSpecifications(Clazz clazz,
method containsWildCards (line 136) | private static boolean containsWildCards(String string)
method visitProgramField (line 149) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 156) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/ClassPath.java
class ClassPath (line 31) | public class ClassPath
method hasOutput (line 39) | public boolean hasOutput()
method clear (line 55) | public void clear()
method add (line 60) | public void add(int index, ClassPathEntry classPathEntry)
method add (line 65) | public boolean add(ClassPathEntry classPathEntry)
method addAll (line 70) | public boolean addAll(ClassPath classPath)
method get (line 75) | public ClassPathEntry get(int index)
method remove (line 80) | public ClassPathEntry remove(int index)
method isEmpty (line 85) | public boolean isEmpty()
method size (line 90) | public int size()
FILE: base/src/main/java/proguard/ClassPathEntry.java
class ClassPathEntry (line 42) | public class ClassPathEntry
method ClassPathEntry (line 63) | public ClassPathEntry(File file, boolean isOutput)
method ClassPathEntry (line 74) | public ClassPathEntry(File file, boolean isOutput, String featureName)
method getName (line 85) | public String getName()
method getUncachedName (line 99) | private String getUncachedName()
method getFile (line 115) | public File getFile()
method setFile (line 124) | public void setFile(File file)
method isOutput (line 134) | public boolean isOutput()
method setOutput (line 143) | public void setOutput(boolean output)
method getFeatureName (line 152) | public String getFeatureName()
method setFeatureName (line 161) | public void setFeatureName(String featureName)
method isDex (line 170) | public boolean isDex()
method isApk (line 179) | public boolean isApk()
method isAab (line 189) | public boolean isAab()
method isJar (line 198) | public boolean isJar()
method isAar (line 207) | public boolean isAar()
method isWar (line 216) | public boolean isWar()
method isEar (line 225) | public boolean isEar()
method isJmod (line 234) | public boolean isJmod()
method isZip (line 243) | public boolean isZip()
method hasExtension (line 252) | private boolean hasExtension(String extension)
method endsWithIgnoreCase (line 262) | private static boolean endsWithIgnoreCase(String string, String suffix)
method isFiltered (line 275) | public boolean isFiltered()
method getFilter (line 292) | public List<String> getFilter()
method setFilter (line 300) | public void setFilter(List<String> filter)
method getApkFilter (line 309) | public List<String> getApkFilter()
method setApkFilter (line 317) | public void setApkFilter(List<String> filter)
method getAabFilter (line 326) | public List<String> getAabFilter()
method setAabFilter (line 334) | public void setAabFilter(List<String> filter)
method getJarFilter (line 343) | public List<String> getJarFilter()
method setJarFilter (line 351) | public void setJarFilter(List<String> filter)
method getAarFilter (line 360) | public List<String> getAarFilter()
method setAarFilter (line 368) | public void setAarFilter(List<String> filter)
method getWarFilter (line 377) | public List<String> getWarFilter()
method setWarFilter (line 385) | public void setWarFilter(List<String> filter)
method getEarFilter (line 394) | public List<String> getEarFilter()
method setEarFilter (line 402) | public void setEarFilter(List<String> filter)
method getJmodFilter (line 411) | public List<String> getJmodFilter()
method setJmodFilter (line 419) | public void setJmodFilter(List<String> filter)
method getZipFilter (line 427) | public List<String> getZipFilter()
method setZipFilter (line 435) | public void setZipFilter(List<String> filter)
method toString (line 443) | public String toString()
FILE: base/src/main/java/proguard/ClassSpecification.java
class ClassSpecification (line 33) | public class ClassSpecification implements Cloneable
method ClassSpecification (line 53) | public ClassSpecification()
method ClassSpecification (line 68) | public ClassSpecification(ClassSpecification classSpecification)
method ClassSpecification (line 109) | public ClassSpecification(String comments,
method ClassSpecification (line 158) | public ClassSpecification(String comments,
method addField (line 185) | public void addField(MemberSpecification fieldSpecification)
method addMethod (line 201) | public void addMethod(MemberSpecification methodSpecification)
method equals (line 215) | public boolean equals(Object object)
method hashCode (line 236) | public int hashCode()
method clone (line 250) | public Object clone()
FILE: base/src/main/java/proguard/ClassSpecificationVisitorFactory.java
class ClassSpecificationVisitorFactory (line 36) | public class ClassSpecificationVisitorFactory
method createClassPoolVisitor (line 50) | public ClassPoolVisitor createClassPoolVisitor(List classSpec...
method createClassPoolVisitor (line 78) | public ClassPoolVisitor createClassPoolVisitor(List classS...
method createClassPoolVisitor (line 124) | protected ClassPoolVisitor createClassPoolVisitor(ClassSpecification c...
method createCombinedClassVisitor (line 276) | protected ClassVisitor createCombinedClassVisitor(List att...
method createClassVisitor (line 367) | private ClassVisitor createClassVisitor(List fieldSpecific...
method addMemberVisitors (line 390) | private void addMemberVisitors(List memberSpecifications,
method createNonTestingClassVisitor (line 427) | protected ClassVisitor createNonTestingClassVisitor(MemberSpecificatio...
method createClassTester (line 446) | protected ClassPoolVisitor createClassTester(ClassSpecification classS...
method createClassTester (line 472) | protected ClassPoolVisitor createClassTester(ClassSpecification classS...
method createClassMemberTester (line 505) | private ClassVisitor createClassMemberTester(List fieldSpec...
method createClassMemberTester (line 526) | private ClassVisitor createClassMemberTester(List memberSpe...
method createClassVisitor (line 563) | private ClassVisitor createClassVisitor(MemberSpecification memberSpec...
method containsWildCards (line 664) | private boolean containsWildCards(String string)
method containsWildCardReferences (line 681) | private boolean containsWildCardReferences(String string)
FILE: base/src/main/java/proguard/Configuration.java
class Configuration (line 34) | public class Configuration
FILE: base/src/main/java/proguard/ConfigurationConstants.java
class ConfigurationConstants (line 28) | public class ConfigurationConstants
FILE: base/src/main/java/proguard/ConfigurationParser.java
class ConfigurationParser (line 39) | public class ConfigurationParser implements AutoCloseable
method ConfigurationParser (line 52) | public ConfigurationParser(String[] args,
method ConfigurationParser (line 63) | public ConfigurationParser(String[] args,
method ConfigurationParser (line 75) | public ConfigurationParser(String lines,
method ConfigurationParser (line 92) | public ConfigurationParser(File file) throws IOException
method ConfigurationParser (line 102) | public ConfigurationParser(File file,
method ConfigurationParser (line 113) | public ConfigurationParser(URL url,
method ConfigurationParser (line 124) | public ConfigurationParser(WordReader reader,
method parse (line 141) | public void parse(Configuration configuration)
method close (line 245) | @Override
method parseKeepKotlinMetadata (line 255) | protected boolean parseKeepKotlinMetadata() throws IOException
method parseIncludeArgument (line 262) | protected long parseIncludeArgument(long lastModified) throws ParseExc...
method parseBaseDirectoryArgument (line 314) | protected void parseBaseDirectoryArgument() throws ParseException, IOE...
method parseClassPathArgument (line 325) | protected ClassPath parseClassPathArgument(ClassPath classPath,
method parseClassVersion (line 467) | protected int parseClassVersion()
method parseIntegerArgument (line 485) | protected int parseIntegerArgument()
method parseURL (line 512) | protected URL parseURL()
method parseFiles (line 527) | protected List parseFiles(List files)
method parseFile (line 541) | protected File parseFile()
method parseOptionalFile (line 556) | protected File parseOptionalFile()
method parseOptionalArgument (line 577) | protected String parseOptionalArgument() throws IOException
method parseNoArgument (line 596) | protected boolean parseNoArgument(boolean value) throws IOException
method parseNoArgument (line 604) | protected long parseNoArgument(long value) throws IOException
method parseIfCondition (line 620) | protected List parseIfCondition(List keepClassSpecifications)
method parseKeepClassSpecificationArguments (line 656) | protected List parseKeepClassSpecificationArguments(List ...
method parseKeepClassSpecificationArguments (line 690) | protected KeepClassSpecification parseKeepClassSpecificationArguments(...
method parseAssumeClassSpecificationArguments (line 777) | protected List parseAssumeClassSpecificationArguments(List classSpecif...
method parseClassSpecificationArguments (line 800) | protected List<ClassSpecification> parseClassSpecificationArguments(Li...
method parseClassSpecificationArguments (line 817) | public ClassSpecification parseClassSpecificationArguments()
method parseClassSpecificationArguments (line 831) | public ClassSpecification parseClassSpecificationArguments(boolean rea...
method parseMemberSpecificationArguments (line 1031) | protected void parseMemberSpecificationArguments(String ex...
method parseValues (line 1358) | protected Number[] parseValues(String externalType,
method parseValue (line 1383) | protected Number parseValue(String externalType,
method parseBoolean (line 1435) | protected Integer parseBoolean(String string)
method parseCommaSeparatedLists (line 1457) | protected List parseCommaSeparatedLists(String expectedDescription,
method parseCommaSeparatedList (line 1512) | protected List parseCommaSeparatedList(String expectedDescription,
method parseCommaSeparatedList (line 1540) | protected List parseCommaSeparatedList(String expectedDescription,
method convertToClassSpecification (line 1662) | protected ClassSpecification convertToClassSpecification(List<String> ...
method removeMemberSpecification (line 1678) | protected ClassSpecification removeMemberSpecification(ClassSpecificat...
method unknownAccessFlag (line 1690) | protected int unknownAccessFlag() throws ParseException
method url (line 1699) | protected URL url(String word) throws ParseException, MalformedURLExce...
method file (line 1743) | protected File file(String word) throws ParseException
method replaceSystemProperties (line 1762) | protected String replaceSystemProperties(String word) throws ParseExce...
method readNextWord (line 1812) | protected void readNextWord(String expectedDescription)
method readNextWord (line 1823) | protected void readNextWord(String expectedDescription,
method readNextWord (line 1841) | protected void readNextWord() throws IOException
method readNextWord (line 1850) | protected void readNextWord(boolean isFileName,
method configurationEnd (line 1860) | protected boolean configurationEnd()
method configurationEnd (line 1869) | protected boolean configurationEnd(boolean expectingAtCharacter)
method checkJavaIdentifier (line 1882) | protected void checkJavaIdentifier(String expectedDescription)
method checkJavaIdentifier (line 1893) | protected void checkJavaIdentifier(String expectedDescription, boolean...
method isJavaIdentifier (line 1914) | protected boolean isJavaIdentifier(String word)
method containsGenerics (line 1948) | protected boolean containsGenerics(String word)
method checkFieldAccessFlags (line 1988) | protected void checkFieldAccessFlags(int requiredSetMemberAccessFlags,
method checkMethodAccessFlags (line 2006) | protected void checkMethodAccessFlags(int requiredSetMemberAccessFlags,
method main (line 2023) | public static void main(String[] args)
FILE: base/src/main/java/proguard/ConfigurationVerifier.java
class ConfigurationVerifier (line 35) | public class ConfigurationVerifier
method ConfigurationVerifier (line 45) | public ConfigurationVerifier(Configuration configuration)
method check (line 54) | public void check() throws IOException
method checkInputJarFirst (line 81) | private void checkInputJarFirst(ClassPath programJars) throws IOException
method checkOutputJarFilter (line 96) | private void checkOutputJarFilter(ClassPath programJars) throws IOExce...
method checkConflicts (line 116) | private void checkConflicts(ClassPath classPath1,
method printNotes (line 172) | private void printNotes(Configuration configuration, ClassPath program...
FILE: base/src/main/java/proguard/ConfigurationWriter.java
class ConfigurationWriter (line 39) | public class ConfigurationWriter implements AutoCloseable
method ConfigurationWriter (line 59) | public ConfigurationWriter(File configurationFile) throws IOException
method ConfigurationWriter (line 70) | public ConfigurationWriter(PrintWriter writer) throws IOException
method close (line 79) | @Override
method write (line 91) | public void write(Configuration configuration) throws IOException
method writeJarOptions (line 191) | private void writeJarOptions(String inputEntryOptionName,
method writeFilter (line 244) | private boolean writeFilter(boolean filtered, List filter)
method writeOption (line 267) | private void writeOption(String optionName, boolean flag)
method writeOption (line 276) | private void writeOption(String optionName, int argument)
method writeOption (line 287) | private void writeOption(String optionName, List arguments)
method writeOptions (line 293) | private void writeOptions(String optionName,
method writeOptions (line 309) | private void writeOptions(String optionName1, List<File> arguments1,
method writeOption (line 354) | private void writeOption(String optionName,
method writeOption (line 379) | private void writeOption(String optionName, String arguments)
method writeOption (line 385) | private void writeOption(String optionName,
method writeOption (line 403) | private void writeOption(String optionName, URL url)
method writeOption (line 434) | private void writeOption(String optionName, File file)
method writeOptions (line 452) | private void writeOptions(String[] optionNames,
method writeOption (line 465) | private void writeOption(String[] optionNames,
method writeOptions (line 516) | private void writeOptions(String optionName,
method writeOption (line 529) | private void writeOption(String optionName,
method writeComments (line 616) | private void writeComments(String comments)
method writeFieldSpecification (line 644) | private void writeFieldSpecification(List memberSpecifications)
method writeMethodSpecification (line 689) | private void writeMethodSpecification(List memberSpecifications)
method writeValueAssignment (line 735) | private void writeValueAssignment(String assignmentKeyword,
method externalClassNames (line 780) | private List externalClassNames(List internalClassNames)
method relativeFileName (line 797) | private String relativeFileName(File file)
method quotedString (line 818) | private String quotedString(String string)
method main (line 837) | public static void main(String[] args)
FILE: base/src/main/java/proguard/DataEntryReaderFactory.java
class DataEntryReaderFactory (line 53) | public class DataEntryReaderFactory
method DataEntryReaderFactory (line 72) | public DataEntryReaderFactory(boolean android)
method createDataEntryReader (line 85) | public DataEntryReader createDataEntryReader(ClassPathEntry classPathE...
method wrapInJarReader (line 179) | private DataEntryReader wrapInJarReader(DataEntryReader reader,
method getFilterExcludingVersionedClasses (line 248) | public static List<String> getFilterExcludingVersionedClasses(ClassPat...
FILE: base/src/main/java/proguard/DataEntryWriterFactory.java
class DataEntryWriterFactory (line 42) | public class DataEntryWriterFactory
method DataEntryWriterFactory (line 98) | public DataEntryWriterFactory(ClassPool programClassP...
method DataEntryWriterFactory (line 141) | public DataEntryWriterFactory(ClassPool programClassP...
method createDataEntryWriter (line 172) | public DataEntryWriter createDataEntryWriter(ClassPath classPath,
method outputFileOccurs (line 213) | private boolean outputFileOccurs(ClassPathEntry entry,
method createClassPathEntryWriter (line 238) | private DataEntryWriter createClassPathEntryWriter(ClassPathEntry cla...
method wrapInJarWriter (line 388) | private DataEntryWriter wrapInJarWriter(File file,
method wrapInSignedJarWriter (line 490) | private DataEntryWriter wrapInSignedJarWriter(DataEntryWriter writer,
FILE: base/src/main/java/proguard/DescriptorKeepChecker.java
class DescriptorKeepChecker (line 36) | public class DescriptorKeepChecker
method DescriptorKeepChecker (line 53) | public DescriptorKeepChecker(ClassPool programClassPool,
method checkClassSpecifications (line 67) | public void checkClassSpecifications(List keepSpecifications)
method visitProgramField (line 96) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 107) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitAnyClass (line 142) | @Override
method visitProgramClass (line 146) | @Override
FILE: base/src/main/java/proguard/Dumper.java
class Dumper (line 23) | public class Dumper implements Pass
method Dumper (line 29) | public Dumper(Configuration configuration)
method execute (line 35) | @Override
FILE: base/src/main/java/proguard/DuplicateClassPrinter.java
class DuplicateClassPrinter (line 33) | public class DuplicateClassPrinter
method DuplicateClassPrinter (line 42) | public DuplicateClassPrinter(WarningPrinter notePrinter)
method visitAnyClass (line 50) | @Override
method visitProgramClass (line 57) | @Override
method visitLibraryClass (line 66) | @Override
FILE: base/src/main/java/proguard/DuplicateResourceFilePrinter.java
class DuplicateResourceFilePrinter (line 34) | public class DuplicateResourceFilePrinter
method DuplicateResourceFilePrinter (line 43) | public DuplicateResourceFilePrinter(WarningPrinter notePrinter)
method visitResourceFile (line 51) | @Override
method visitKotlinModule (line 60) | @Override
FILE: base/src/main/java/proguard/FileWordReader.java
class FileWordReader (line 32) | public class FileWordReader extends LineWordReader
method FileWordReader (line 37) | public FileWordReader(File file) throws IOException
method FileWordReader (line 51) | public FileWordReader(URL url) throws IOException
FILE: base/src/main/java/proguard/FullyQualifiedClassNameChecker.java
class FullyQualifiedClassNameChecker (line 37) | public class FullyQualifiedClassNameChecker
method FullyQualifiedClassNameChecker (line 52) | public FullyQualifiedClassNameChecker(ClassPool programClassPool,
method checkClassSpecifications (line 66) | public void checkClassSpecifications(List classSpecifications)
method checkMemberSpecifications (line 91) | private void checkMemberSpecifications(List memberSpecifications, bool...
method checkDescriptor (line 119) | private void checkDescriptor(String descriptor)
method checkType (line 140) | private void checkType(String type)
method checkClassName (line 153) | private void checkClassName(String className)
method containsWildCards (line 184) | private static boolean containsWildCards(String string)
method visitAnyClass (line 198) | public void visitAnyClass(Clazz clazz)
FILE: base/src/main/java/proguard/GPL.java
class GPL (line 34) | public class GPL
method check (line 42) | public static void check()
method unknownPackageNames (line 67) | private static Set unknownPackageNames(LineNumberReader reader)
method uniquePackageNames (line 109) | private static String uniquePackageNames(Set packageNames)
method trimSuffix (line 131) | private static String trimSuffix(String string, char separator)
method containsPrefix (line 141) | private static boolean containsPrefix(Set set, String name)
method isKnown (line 165) | private static boolean isKnown(String packageName)
method main (line 189) | public static void main(String[] args)
FILE: base/src/main/java/proguard/GetAnnotationChecker.java
class GetAnnotationChecker (line 34) | public class GetAnnotationChecker
method GetAnnotationChecker (line 43) | public GetAnnotationChecker(WarningPrinter notePrinter)
method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...
FILE: base/src/main/java/proguard/GetEnclosingClassChecker.java
class GetEnclosingClassChecker (line 34) | public class GetEnclosingClassChecker
method GetEnclosingClassChecker (line 43) | public GetEnclosingClassChecker(WarningPrinter notePrinter)
method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...
FILE: base/src/main/java/proguard/GetEnclosingMethodChecker.java
class GetEnclosingMethodChecker (line 34) | public class GetEnclosingMethodChecker
method GetEnclosingMethodChecker (line 43) | public GetEnclosingMethodChecker(WarningPrinter notePrinter)
method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...
FILE: base/src/main/java/proguard/GetSignatureChecker.java
class GetSignatureChecker (line 34) | public class GetSignatureChecker
method GetSignatureChecker (line 43) | public GetSignatureChecker(WarningPrinter notePrinter)
method visitAnyConstant (line 51) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitMethodrefConstant (line 54) | public void visitMethodrefConstant(Clazz clazz, MethodrefConstant meth...
FILE: base/src/main/java/proguard/Initializer.java
class Initializer (line 47) | public class Initializer implements Pass
method Initializer (line 52) | public Initializer(Configuration configuration)
method execute (line 62) | @Override
method createClassNoteExceptionMatcher (line 558) | private StringMatcher createClassNoteExceptionMatcher(List noteExce...
method createClassMemberNoteExceptionMatcher (line 601) | private StringMatcher createClassMemberNoteExceptionMatcher(List no...
method containsWildCardReferences (line 645) | private static boolean containsWildCardReferences(String string)
FILE: base/src/main/java/proguard/InputReader.java
class InputReader (line 46) | public class InputReader implements Pass
method InputReader (line 63) | public InputReader(Configuration configuration)
method execute (line 73) | @Override
method readInput (line 201) | private void readInput(String messagePrefix,
method readInput (line 217) | public void readInput(String messagePrefix,
method readInput (line 238) | private void readInput(String messagePrefix,
class MyResourceFileFeatureNameSetter (line 291) | private class MyResourceFileFeatureNameSetter
method visitAnyResourceFile (line 296) | public void visitAnyResourceFile(ResourceFile resourceFile)
FILE: base/src/main/java/proguard/KeepClassMemberChecker.java
class KeepClassMemberChecker (line 34) | public class KeepClassMemberChecker
method KeepClassMemberChecker (line 42) | public KeepClassMemberChecker(WarningPrinter notePrinter)
method checkClassSpecifications (line 52) | public void checkClassSpecifications(List keepClassSpecifications)
FILE: base/src/main/java/proguard/KeepClassSpecification.java
class KeepClassSpecification (line 28) | public class KeepClassSpecification extends ClassSpecification
method KeepClassSpecification (line 62) | public KeepClassSpecification(boolean markClasses,
method KeepClassSpecification (line 107) | @Deprecated
method equals (line 132) | @Override
method hashCode (line 157) | @Override
method clone (line 173) | @Override
FILE: base/src/main/java/proguard/KeepClassSpecificationVisitorFactory.java
class KeepClassSpecificationVisitorFactory (line 36) | public class KeepClassSpecificationVisitorFactory
method KeepClassSpecificationVisitorFactory (line 55) | public KeepClassSpecificationVisitorFactory(boolean shrinking,
method createClassPoolVisitor (line 82) | public ClassPoolVisitor createClassPoolVisitor(List keepCl...
method createClassPoolVisitor (line 130) | public ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification ...
method createClassPoolVisitor (line 241) | private ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification...
FILE: base/src/main/java/proguard/KotlinMetadataAdapter.java
class KotlinMetadataAdapter (line 19) | public class KotlinMetadataAdapter
method execute (line 25) | @Override
FILE: base/src/main/java/proguard/LibraryKeepChecker.java
class LibraryKeepChecker (line 36) | public class LibraryKeepChecker
method LibraryKeepChecker (line 50) | public LibraryKeepChecker(ClassPool programClassPool,
method checkClassSpecifications (line 64) | public void checkClassSpecifications(List keepSpecifications)
method visitAnyClass (line 112) | @Override
method visitLibraryClass (line 116) | @Override
FILE: base/src/main/java/proguard/LineWordReader.java
class LineWordReader (line 32) | public class LineWordReader extends WordReader
method LineWordReader (line 41) | public LineWordReader(LineNumberReader lineNumberReader,
method LineWordReader (line 55) | public LineWordReader(LineNumberReader lineNumberReader,
method nextLine (line 68) | protected String nextLine() throws IOException
method lineLocationDescription (line 74) | protected String lineLocationDescription()
method close (line 80) | public void close() throws IOException
FILE: base/src/main/java/proguard/MemberSpecification.java
class MemberSpecification (line 31) | public class MemberSpecification
method MemberSpecification (line 44) | public MemberSpecification()
method MemberSpecification (line 73) | public MemberSpecification(int requiredSetAccessFlags,
method equals (line 90) | public boolean equals(Object object)
method hashCode (line 107) | public int hashCode()
FILE: base/src/main/java/proguard/MemberValueSpecification.java
class MemberValueSpecification (line 31) | public class MemberValueSpecification extends MemberSpecification
method MemberValueSpecification (line 39) | public MemberValueSpecification()
method MemberValueSpecification (line 71) | public MemberValueSpecification(int requiredSetAccessFlags,
method equals (line 91) | public boolean equals(Object object)
method hashCode (line 104) | public int hashCode()
FILE: base/src/main/java/proguard/OutputWriter.java
class OutputWriter (line 52) | public class OutputWriter implements Pass
method OutputWriter (line 57) | public OutputWriter(Configuration configuration)
method execute (line 67) | @Override
method retrievePrivateKeys (line 180) | private KeyStore.PrivateKeyEntry[] retrievePrivateKeys(Configuration c...
method retrievePrivateKey (line 246) | private KeyStore.PrivateKeyEntry retrievePrivateKey(File keyStoreFile,
method writeOutput (line 278) | private void writeOutput(DataEntryWriterFactory dataEntryWriterFactory,
method writeExtraConfigurationFiles (line 412) | private DataEntryReader writeExtraConfigurationFiles(Configuration ...
method renameResourceFiles (line 438) | private DataEntryWriter renameResourceFiles(ResourceFilePool resourceF...
method adaptResourceFiles (line 453) | private DataEntryReader adaptResourceFiles(Configuration configuration,
method writeDirectories (line 474) | private DirectoryFilter writeDirectories(Configuration configuration,
method createPackagePrefixMap (line 503) | private static Map<String, String> createPackagePrefixMap(ClassPool cl...
method log (line 528) | private static void log(ClassPath classPath, int fromIndex, int toInde...
FILE: base/src/main/java/proguard/ParseException.java
class ParseException (line 30) | public class ParseException extends Exception {
method ParseException (line 36) | public ParseException() {
method ParseException (line 48) | public ParseException(String s) {
FILE: base/src/main/java/proguard/ProGuard.java
class ProGuard (line 64) | public class ProGuard
method ProGuard (line 81) | public ProGuard(Configuration configuration)
method execute (line 91) | public void execute() throws Exception
method checkGpl (line 278) | private void checkGpl()
method requiresKotlinMetadata (line 283) | private boolean requiresKotlinMetadata()
method printConfiguration (line 298) | private void printConfiguration() throws IOException
method checkConfiguration (line 312) | private void checkConfiguration() throws IOException
method checkUpToDate (line 321) | private void checkUpToDate()
method readInput (line 330) | private void readInput() throws Exception
method clearPreverification (line 340) | private void clearPreverification() throws Exception
method initialize (line 350) | private void initialize() throws Exception
method mark (line 370) | private void mark() throws Exception
method stripKotlinMetadataAnnotations (line 379) | private void stripKotlinMetadataAnnotations() throws Exception
method checkConfigurationAfterInitialization (line 387) | private void checkConfigurationAfterInitialization() throws Exception
method introducePrimitiveArrayConstants (line 395) | private void introducePrimitiveArrayConstants() throws Exception
method backport (line 404) | private void backport() throws Exception
method addConfigurationLogging (line 414) | private void addConfigurationLogging() throws Exception
method printSeeds (line 424) | private void printSeeds() throws Exception
method inlineSubroutines (line 433) | private void inlineSubroutines() throws Exception
method shrink (line 443) | private void shrink(boolean afterOptimizer) throws Exception
method optimizeGson (line 459) | private void optimizeGson() throws Exception
method optimize (line 469) | private void optimize() throws Exception
method linearizeLineNumbers (line 491) | private void linearizeLineNumbers() throws Exception
method obfuscate (line 500) | private void obfuscate() throws Exception
method adaptKotlinMetadata (line 527) | private void adaptKotlinMetadata() throws Exception
method expandPrimitiveArrayConstants (line 537) | private void expandPrimitiveArrayConstants()
method target (line 546) | private void target() throws Exception
method preverify (line 555) | private void preverify() throws Exception
method trimLineNumbers (line 565) | private void trimLineNumbers() throws Exception
method sortClassElements (line 574) | private void sortClassElements()
method writeOutput (line 592) | private void writeOutput() throws Exception
method dump (line 602) | private void dump() throws Exception
method getVersion (line 611) | public static String getVersion()
method main (line 630) | public static void main(String[] args)
FILE: base/src/main/java/proguard/SeedPrinter.java
class SeedPrinter (line 37) | public class SeedPrinter implements Pass
method SeedPrinter (line 43) | public SeedPrinter(Configuration configuration)
method execute (line 54) | @Override
FILE: base/src/main/java/proguard/SubclassedClassFilter.java
class SubclassedClassFilter (line 32) | final class SubclassedClassFilter
method SubclassedClassFilter (line 38) | public SubclassedClassFilter(ClassVisitor classVisitor)
method visitAnyClass (line 46) | @Override
method visitProgramClass (line 53) | @Override
method visitLibraryClass (line 63) | @Override
FILE: base/src/main/java/proguard/Targeter.java
class Targeter (line 38) | public class Targeter implements Pass
method Targeter (line 43) | public Targeter(Configuration configuration)
method execute (line 52) | @Override
FILE: base/src/main/java/proguard/UpToDateChecker.java
class UpToDateChecker (line 34) | public class UpToDateChecker
method UpToDateChecker (line 43) | public UpToDateChecker(Configuration configuration)
method check (line 53) | public void check() throws UpToDateException
class ModificationTimeChecker (line 120) | private static class ModificationTimeChecker {
method updateInputModificationTime (line 130) | public void updateInputModificationTime(URL url)
method updateInputModificationTime (line 148) | public void updateInputModificationTime(File file)
method updateOutputModificationTime (line 161) | public void updateOutputModificationTime(File file)
method updateModificationTime (line 174) | public void updateModificationTime(File file, boolean isOutput)
method updateModificationTime (line 206) | public void updateModificationTime(long time, boolean isOutput)
method updateInputModificationTime (line 222) | public void updateInputModificationTime(long time)
method updateOutputModificationTime (line 236) | public void updateOutputModificationTime(long time)
method checkModificationTimes (line 247) | private void checkModificationTimes()
class UpToDateException (line 259) | public static class UpToDateException extends RuntimeException {}
FILE: base/src/main/java/proguard/WordReader.java
class WordReader (line 35) | public abstract class WordReader
method WordReader (line 53) | protected WordReader(File baseDir)
method WordReader (line 62) | protected WordReader(URL baseURL)
method setBaseDir (line 71) | public void setBaseDir(File baseDir)
method getBaseDir (line 87) | public File getBaseDir()
method getBaseURL (line 98) | public URL getBaseURL()
method includeWordReader (line 112) | public void includeWordReader(WordReader newIncludeWordReader)
method nextWord (line 137) | public String nextWord(boolean isFileName,
method lastComments (line 306) | public String lastComments() throws IOException
method locationDescription (line 327) | public String locationDescription()
method nextLine (line 346) | protected abstract String nextLine() throws IOException;
method lineLocationDescription (line 354) | protected abstract String lineLocationDescription();
method close (line 360) | public void close() throws IOException
method isOption (line 373) | private boolean isOption(char character)
method isComment (line 379) | private boolean isComment(char character)
method isDelimiter (line 385) | private boolean isDelimiter(char character)
method isStartDelimiter (line 391) | private boolean isStartDelimiter(char character)
method isNonStartDelimiter (line 397) | private boolean isNonStartDelimiter(char character)
method isFileDelimiter (line 409) | private boolean isFileDelimiter(char character,
method isQuote (line 421) | private boolean isQuote(char character)
FILE: base/src/main/java/proguard/backport/AbstractAPIConverter.java
class AbstractAPIConverter (line 51) | class AbstractAPIConverter
method AbstractAPIConverter (line 87) | AbstractAPIConverter(ClassPool programClassPool,
method replace (line 101) | protected MethodReplacement replace(String className,
method replace (line 118) | protected TypeReplacement replace(String className, String replacement...
method missing (line 129) | protected MethodReplacement missing(String className, String methodNam...
method missing (line 135) | protected TypeReplacement missing(String className)
method setTypeReplacements (line 141) | protected void setTypeReplacements(TypeReplacement[] replacements)
method setMethodReplacements (line 147) | protected void setMethodReplacements(MethodReplacement[] replacements)
method visitAnyClass (line 155) | @Override
method visitProgramClass (line 159) | @Override
method visitAnyMember (line 200) | @Override
method visitProgramField (line 204) | @Override
method visitProgramMethod (line 213) | @Override
method visitAnyAttribute (line 228) | @Override
method visitCodeAttribute (line 232) | @Override
method visitLocalVariableTableAttribute (line 249) | @Override
method visitLocalVariableTypeTableAttribute (line 256) | @Override
method visitSignatureAttribute (line 263) | @Override
method visitAnyAnnotationsAttribute (line 270) | @Override
method visitAnyParameterAnnotationsAttribute (line 277) | @Override
method visitAnnotationDefaultAttribute (line 284) | @Override
method visitLocalVariableInfo (line 293) | @Override
method visitLocalVariableTypeInfo (line 302) | @Override
method visitAnnotation (line 311) | @Override
method visitAnyElementValue (line 322) | @Override
method visitEnumConstantElementValue (line 326) | @Override
method visitClassElementValue (line 333) | @Override
method visitAnnotationElementValue (line 346) | @Override
method visitArrayElementValue (line 353) | @Override
method visitAnyInstruction (line 362) | @Override
method visitConstantInstruction (line 366) | @Override
method visitAnyConstant (line 408) | @Override
method visitClassConstant (line 412) | @Override
method visitFieldrefConstant (line 425) | @Override
method visitAnyMethodrefConstant (line 441) | @Override
method replaceClassName (line 469) | private String replaceClassName(Clazz clazz, String className)
method replaceDescriptor (line 491) | private String replaceDescriptor(Clazz clazz, String descriptor)
method updateDescriptor (line 524) | private int updateDescriptor(Clazz clazz, int descriptorIndex)
method replaceMethodInvocation (line 544) | private boolean replaceMethodInvocation(int offset, Clazz clazz, Metho...
class AbstractReplacement (line 566) | private abstract class AbstractReplacement
method isStatic (line 568) | boolean isStatic(Method method)
method isDefaultMethod (line 573) | boolean isDefaultMethod(Clazz clazz, Method method)
method isInterface (line 580) | boolean isInterface(Clazz clazz)
method findReferencedClass (line 585) | Clazz findReferencedClass(String className)
method findReferencedMethod (line 591) | Method findReferencedMethod(Clazz clazz, String methodName, String m...
method getReplacement (line 596) | String getReplacement(String original, String actual, String replace...
class MethodReplacement (line 629) | protected class MethodReplacement extends AbstractReplacement
method MethodReplacement (line 644) | MethodReplacement(String className, String methodName, ...
method isValid (line 663) | private boolean isValid()
method getDescReplacement (line 671) | private String getDescReplacement(String original, String actual, St...
method matches (line 686) | boolean matches(Clazz clazz, AnyMethodrefConstant anyMethodrefConstant)
method classPatternMatches (line 720) | private boolean classPatternMatches(String className, Clazz referenc...
method methodPatternMatches (line 727) | private boolean methodPatternMatches(String methodName, Clazz refere...
method descPatternMatches (line 737) | private boolean descPatternMatches(String methodDesc)
method replaceInstruction (line 743) | void replaceInstruction(int offset, Clazz clazz, Method method, AnyM...
class MissingMethodReplacement (line 819) | private class MissingMethodReplacement extends MethodReplacement
method MissingMethodReplacement (line 821) | MissingMethodReplacement(String className, String methodName, String...
method isValid (line 827) | boolean isValid()
method replaceInstruction (line 833) | void replaceInstruction(int offset, Clazz clazz, Method method, RefC...
class TypeReplacement (line 856) | protected class TypeReplacement extends AbstractReplacement
method TypeReplacement (line 863) | TypeReplacement(String matchingClassName, String replacementClassName)
method isValid (line 871) | boolean isValid()
method matchesClassName (line 879) | boolean matchesClassName(String className)
method replaceClassName (line 885) | String replaceClassName(Clazz clazz, String className)
class MissingTypeReplacement (line 892) | private class MissingTypeReplacement extends TypeReplacement
method MissingTypeReplacement (line 894) | MissingTypeReplacement(String className)
method isValid (line 900) | boolean isValid()
method replaceClassName (line 906) | String replaceClassName(Clazz clazz, String className)
FILE: base/src/main/java/proguard/backport/Backporter.java
class Backporter (line 44) | public class Backporter implements Pass
method Backporter (line 49) | public Backporter(Configuration configuration)
method execute (line 55) | @Override
FILE: base/src/main/java/proguard/backport/DefaultInterfaceMethodConverter.java
class DefaultInterfaceMethodConverter (line 44) | public class DefaultInterfaceMethodConverter
method DefaultInterfaceMethodConverter (line 59) | public DefaultInterfaceMethodConverter(ClassVisitor modifiedClassVisi...
method visitAnyClass (line 69) | @Override
method visitProgramClass (line 73) | @Override
method visitAnyAttribute (line 101) | @Override
method visitCodeAttribute (line 105) | @Override
method hasInheritedMethod (line 162) | private boolean hasInheritedMethod(Clazz clazz,
method callsDefaultMethodUsingSuper (line 180) | private boolean callsDefaultMethodUsingSuper(Clazz clazz,
method replaceDefaultMethodInvocation (line 213) | private void replaceDefaultMethodInvocation(ProgramClass targetClass,
class SuperInvocationInstructionMatcher (line 264) | private static class SuperInvocationInstructionMatcher
method SuperInvocationInstructionMatcher (line 276) | public SuperInvocationInstructionMatcher(Clazz referencedClass,
method visitAnyAttribute (line 286) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 289) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttri...
method visitAnyInstruction (line 304) | @Override
method visitConstantInstruction (line 308) | @Override
method visitAnyConstant (line 328) | @Override
method visitInterfaceMethodrefConstant (line 332) | @Override
method superInvocation (line 347) | public void superInvocation(Clazz clazz,
FILE: base/src/main/java/proguard/backport/JSR310Converter.java
class JSR310Converter (line 34) | public class JSR310Converter
method JSR310Converter (line 40) | public JSR310Converter(ClassPool programClassPool,
FILE: base/src/main/java/proguard/backport/LambdaExpression.java
class LambdaExpression (line 34) | public class LambdaExpression
method LambdaExpression (line 73) | public LambdaExpression(ProgramClass referencedClass,
method getLambdaClassName (line 108) | public String getLambdaClassName()
method getConstructorDescriptor (line 116) | public String getConstructorDescriptor()
method isSerializable (line 134) | public boolean isSerializable()
method isMethodReference (line 150) | public boolean isMethodReference()
method isStateless (line 159) | public boolean isStateless()
method invokesStaticInterfaceMethod (line 171) | public boolean invokesStaticInterfaceMethod()
method referencesPrivateSyntheticInterfaceMethod (line 184) | boolean referencesPrivateSyntheticInterfaceMethod()
method needsAccessorMethod (line 196) | public boolean needsAccessorMethod()
method referencesPrivateConstructor (line 211) | public boolean referencesPrivateConstructor()
method isLambdaMethod (line 223) | private static boolean isLambdaMethod(String methodName)
FILE: base/src/main/java/proguard/backport/LambdaExpressionCollector.java
class LambdaExpressionCollector (line 40) | public class LambdaExpressionCollector
method LambdaExpressionCollector (line 56) | public LambdaExpressionCollector(Map<Integer, LambdaExpression> lambda...
method visitAnyClass (line 64) | @Override
method visitProgramClass (line 68) | @Override
method visitAnyConstant (line 80) | @Override
method visitInvokeDynamicConstant (line 84) | @Override
method visitAnyMethodrefConstant (line 93) | @Override
method visitAnyAttribute (line 103) | @Override
method visitBootstrapMethodsAttribute (line 107) | @Override
method visitBootstrapMethodInfo (line 117) | @Override
method isLambdaMetaFactory (line 223) | private static boolean isLambdaMetaFactory(String className)
method isAlternateFactoryMethod (line 228) | private static boolean isAlternateFactoryMethod(String methodName)
method getIntegerConstant (line 233) | private static int getIntegerConstant(ProgramClass programClass, int c...
method getMethodTypeConstant (line 239) | private static MethodTypeConstant getMethodTypeConstant(ProgramClass p...
FILE: base/src/main/java/proguard/backport/LambdaExpressionConverter.java
class LambdaExpressionConverter (line 75) | public class LambdaExpressionConverter
method LambdaExpressionConverter (line 98) | public LambdaExpressionConverter(ClassPool programClassPool,
method visitAnyClass (line 116) | @Override
method visitProgramClass (line 120) | @Override
method visitAnyAttribute (line 171) | @Override
method visitCodeAttribute (line 175) | @Override
method visitAnyInstruction (line 191) | @Override
method visitConstantInstruction (line 195) | @Override
method visitAnyMember (line 309) | @Override
method visitProgramMethod (line 313) | @Override
method isDeserializationHook (line 328) | private static boolean isDeserializationHook(Clazz clazz, Method method)
method hasFlag (line 337) | private static boolean hasFlag(Member member, int flag)
method createLambdaClass (line 342) | private ProgramClass createLambdaClass(LambdaExpression lambdaExpression)
method fixInterfaceLambdaMethod (line 406) | private void fixInterfaceLambdaMethod(ProgramClass programClass,
method addAccessorMethod (line 435) | private void addAccessorMethod(ProgramClass programClass,
method completeStatelessLambdaClass (line 537) | private void completeStatelessLambdaClass(ProgramClass lambdaClass,
method completeCapturingLambdaClass (line 647) | private void completeCapturingLambdaClass(ProgramClass lambdaClass,
method completeInterfaceMethod (line 749) | private void completeInterfaceMethod(LambdaExpression lamb...
method addBridgeMethods (line 882) | private void addBridgeMethods(ProgramClass lambdaClass, LambdaExpressi...
method prependParameterToMethodDescriptor (line 945) | private static String prependParameterToMethodDescriptor(String method...
method convertToTargetType (line 971) | private static void convertToTargetType(String s...
FILE: base/src/main/java/proguard/backport/StaticInterfaceMethodConverter.java
class StaticInterfaceMethodConverter (line 43) | public class StaticInterfaceMethodConverter
method StaticInterfaceMethodConverter (line 53) | public StaticInterfaceMethodConverter(ClassPool programCla...
method visitAnyClass (line 69) | @Override
method visitProgramClass (line 73) | @Override
method replaceInstructions (line 171) | private void replaceInstructions(ProgramClass interfaceClass,
class MyReferencedClassFilter (line 227) | private static class MyReferencedClassFilter
method MyReferencedClassFilter (line 236) | public MyReferencedClassFilter(Clazz referencedClass,
method visitAnyClass (line 246) | @Override
method visitProgramClass (line 250) | @Override
method visitAnyConstant (line 265) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitAnyRefConstant (line 268) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
FILE: base/src/main/java/proguard/backport/StreamSupportConverter.java
class StreamSupportConverter (line 34) | public class StreamSupportConverter
method StreamSupportConverter (line 40) | public StreamSupportConverter(ClassPool programClassPool,
FILE: base/src/main/java/proguard/backport/StringConcatenationConverter.java
class StringConcatenationConverter (line 42) | public class StringConcatenationConverter
method StringConcatenationConverter (line 76) | public StringConcatenationConverter(InstructionVisitor extraInstructi...
method visitAnyInstruction (line 86) | @Override
method visitConstantInstruction (line 89) | @Override
method visitAnyAttribute (line 216) | @Override
method visitBootstrapMethodsAttribute (line 219) | @Override
method visitBootstrapMethodInfo (line 229) | @Override
method visitAnyConstant (line 251) | @Override
method visitStringConstant (line 262) | @Override
method isStringConcatFactory (line 275) | private static boolean isStringConcatFactory(String className)
method isMakeConcat (line 280) | private static boolean isMakeConcat(String methodName)
method isMakeConcatWithConstants (line 285) | private static boolean isMakeConcatWithConstants(String methodName)
method typicalStringLengthFromType (line 290) | private static int typicalStringLengthFromType(String internalTypeName)
method appendDescriptorFromInternalType (line 303) | private static String appendDescriptorFromInternalType(String internal...
method nextArgIndex (line 317) | private static int nextArgIndex(String recipe, int fromIndex)
FILE: base/src/main/java/proguard/classfile/ClassMemberPair.java
class ClassMemberPair (line 32) | public class ClassMemberPair
method ClassMemberPair (line 38) | public ClassMemberPair(Clazz clazz, Member member)
method accept (line 45) | public void accept(MemberVisitor memberVisitor)
method getName (line 51) | public String getName()
method equals (line 57) | @Override
method hashCode (line 68) | @Override
method toString (line 75) | @Override
FILE: base/src/main/java/proguard/classfile/pass/PrimitiveArrayConstantIntroducer.java
class PrimitiveArrayConstantIntroducer (line 17) | public class PrimitiveArrayConstantIntroducer implements Pass
method execute (line 19) | @Override
FILE: base/src/main/java/proguard/classfile/visitor/InjectedClassFilter.java
class InjectedClassFilter (line 33) | public class InjectedClassFilter
method InjectedClassFilter (line 40) | public InjectedClassFilter(ClassVisitor injectedClassVisitor,
method visitAnyClass (line 50) | @Override
method visitProgramClass (line 56) | @Override
method visitLibraryClass (line 67) | @Override
method delegateVisitor (line 79) | private ClassVisitor delegateVisitor(ProgramClass programClass)
FILE: base/src/main/java/proguard/configuration/ConfigurationLogger.java
class ConfigurationLogger (line 42) | public class ConfigurationLogger implements Runnable
method checkForName (line 140) | public static void checkForName(String reflectedClassName,
method checkLoadClass (line 154) | public static void checkLoadClass(String reflectedClassName,
method checkClass (line 168) | public static void checkClass(String reflectionClassName,
method checkGetField (line 215) | public static void checkGetField(Class reflectedClass,
method checkGetDeclaredField (line 231) | public static void checkGetDeclaredField(Class reflectedClass,
method checkGetField (line 248) | private static void checkGetField(String reflectionMethodName,
method checkGetDeclaredFields (line 281) | public static void checkGetDeclaredFields(Class reflectedClass,
method checkGetFields (line 307) | public static void checkGetFields(Class reflectedClass,
method checkGetDeclaredConstructor (line 332) | public static void checkGetDeclaredConstructor(Class reflectedClass,
method checkGetConstructor (line 344) | public static void checkGetConstructor(Class reflectedClass,
method checkGetConstructor (line 356) | public static void checkGetConstructor(String reflectionMethodName,
method checkGetDeclaredConstructors (line 393) | public static void checkGetDeclaredConstructors(Class reflectedClass,
method checkGetConstructors (line 419) | public static void checkGetConstructors(Class reflectedClass,
method checkGetDeclaredMethod (line 449) | public static void checkGetDeclaredMethod(Class reflectedClass,
method checkGetMethod (line 467) | public static void checkGetMethod(Class reflectedClass,
method checkGetMethod (line 486) | private static void checkGetMethod(String reflectionMethodName,
method checkGetDeclaredMethods (line 527) | public static void checkGetDeclaredMethods(Class reflectedClass,
method checkGetMethods (line 553) | public static void checkGetMethods(Class reflectedClass,
method isKept (line 578) | private static boolean isKept(MemberInfo memberInfo)
method isShrunk (line 590) | private static boolean isShrunk(MemberInfo memberInfo)
method isKept (line 601) | private static boolean isKept(ClassInfo classInfo)
method isShrunk (line 612) | private static boolean isShrunk(ClassInfo classInfo)
method getDeclaringClass (line 622) | private static MemberInfo getDeclaringClass(Class reflectedClass,
method getDeclaringClass (line 657) | private static MemberInfo getDeclaringClass(Class reflectedClass,
method allDeclaredFieldsKept (line 694) | private static boolean allDeclaredFieldsKept(Class clazz)
method allPublicFieldsKept (line 705) | private static boolean allPublicFieldsKept(Class clazz)
method allDeclaredConstructorsKept (line 716) | private static boolean allDeclaredConstructorsKept(Class clazz)
method allPublicConstructorsKept (line 726) | private static boolean allPublicConstructorsKept(Class clazz)
method allDeclaredMethodsKept (line 737) | private static boolean allDeclaredMethodsKept(Class clazz)
method allPublicMethodsKept (line 748) | private static boolean allPublicMethodsKept(Class clazz)
method signatureString (line 758) | private static String signatureString(String methodName,
method run (line 783) | public void run()
method printConfiguration (line 789) | private static void printConfiguration()
method keepClassRule (line 819) | private static String keepClassRule(String className)
method keepConstructorRule (line 825) | private static String keepConstructorRule(String className,
method keepMethodRule (line 834) | private static String keepMethodRule(String className,
method keepFieldRule (line 843) | private static String keepFieldRule(String className,
method keepAllConstructorsRule (line 852) | private static String keepAllConstructorsRule(Class className)
method keepAllMethodsRule (line 860) | private static String keepAllMethodsRule(Class className)
method keepAllPublicMethodsRule (line 868) | private static String keepAllPublicMethodsRule(Class className)
method keepAllFieldsRule (line 876) | private static String keepAllFieldsRule(Class className)
method keepAllPublicFieldsRule (line 883) | private static String keepAllPublicFieldsRule(Class className)
method originalClassName (line 892) | private static String originalClassName(Class className)
method originalClassName (line 898) | private static String originalClassName(String className)
method addArrayBrackets (line 924) | private static String addArrayBrackets(String className, int arrayDime...
method getExternalClassNameFromComponentType (line 947) | private static String getExternalClassNameFromComponentType(String com...
method isLibraryClass (line 981) | private static boolean isLibraryClass(Class clazz)
method getLogMethod (line 992) | private static Method getLogMethod()
method initializeClassMap (line 1009) | private static void initializeClassMap() throws IOException
method loadClassMap (line 1022) | public static void loadClassMap(InputStream inputStream, Map<String, C...
method shouldLog (line 1076) | private static <T> boolean shouldLog(Class reflectedClass,
method shouldLog (line 1090) | private static boolean shouldLog(Set<String> classes,
method shouldLog (line 1097) | private static <T> boolean shouldLog(Set<T> values,
method computeIfAbsent (line 1104) | private static <T> Set<T> computeIfAbsent(Map<String, Set<T>> map,
method log (line 1123) | private static void log(String message)
method hashFnv1a32_UTF8 (line 1148) | private static int hashFnv1a32_UTF8(String string)
method hash (line 1158) | private static int hash(String string, int init)
method hash (line 1167) | private static int hash(byte[] data, int init)
class ClassInfo (line 1183) | public static class ClassInfo
method ClassInfo (line 1195) | ClassInfo(String originalClassName,
method toString (line 1212) | @Override
class MemberInfo (line 1228) | public static class MemberInfo
method MemberInfo (line 1233) | MemberInfo(String declaringClassName,
method toString (line 1240) | public String toString()
FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingAdder.java
class ConfigurationLoggingAdder (line 58) | public class ConfigurationLoggingAdder implements Pass
method execute (line 63) | @Override
method initializeConfigurationLogger (line 111) | private void initializeConfigurationLogger(ClassPool programClassPool)
class ExtraClassAdder (line 123) | private static class ExtraClassAdder
method ExtraClassAdder (line 129) | ExtraClassAdder(ExtraDataEntryNameMap extraDataEntryNameMap)
method visitAnyInstruction (line 137) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java
class ConfigurationLoggingInstructionSequenceConstants (line 38) | public class ConfigurationLoggingInstructionSequenceConstants
method ConfigurationLoggingInstructionSequenceConstants (line 59) | public ConfigurationLoggingInstructionSequenceConstants(ClassPool prog...
FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java
class ConfigurationLoggingInstructionSequenceReplacer (line 49) | public class ConfigurationLoggingInstructionSequenceReplacer extends Ins...
method ConfigurationLoggingInstructionSequenceReplacer (line 51) | public ConfigurationLoggingInstructionSequenceReplacer(InstructionSequ...
method ConfigurationLoggingInstructionSequenceReplacer (line 71) | public ConfigurationLoggingInstructionSequenceReplacer(Constant[] ...
method ConfigurationLoggingInstructionSequenceReplacer (line 87) | public ConfigurationLoggingInstructionSequenceReplacer(Constant[] ...
method matchedArgument (line 105) | @Override
method matchedConstantIndex (line 122) | @Override
FILE: base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java
class ConfigurationLoggingInstructionSequencesReplacer (line 41) | public class ConfigurationLoggingInstructionSequencesReplacer
method ConfigurationLoggingInstructionSequencesReplacer (line 64) | public ConfigurationLoggingInstructionSequencesReplacer(Constant[] ...
method ConfigurationLoggingInstructionSequencesReplacer (line 94) | public ConfigurationLoggingInstructionSequencesReplacer(Constant[] ...
method createInstructionSequenceReplacers (line 125) | private static InstructionVisitor[] createInstructionSequenceReplacers...
FILE: base/src/main/java/proguard/configuration/InitialStateInfo.java
class InitialStateInfo (line 38) | public class InitialStateInfo
method InitialStateInfo (line 46) | public InitialStateInfo(ClassPool classPool)
method size (line 56) | public int size()
method classNames (line 65) | public List<String> classNames()
method getSuperClassName (line 78) | public String getSuperClassName(String className)
method getMethodHashMap (line 90) | public Map<ProgramMethod, Integer> getMethodHashMap(String className)
method getFieldHashMap (line 102) | public Map<ProgramField, Integer> getFieldHashMap(String className)
method initialize (line 110) | private void initialize(ClassPool classPool)
method hash (line 141) | private static int hash(Clazz clazz, Method method)
method hash (line 147) | private static int hash(Clazz clazz, Field field)
FILE: base/src/main/java/proguard/evaluation/AssumeClassSpecificationVisitorFactory.java
class AssumeClassSpecificationVisitorFactory (line 38) | public class AssumeClassSpecificationVisitorFactory
method AssumeClassSpecificationVisitorFactory (line 44) | public AssumeClassSpecificationVisitorFactory(ValueFactory valueFactory)
method createNonTestingClassVisitor (line 52) | protected ClassVisitor createNonTestingClassVisitor(MemberSpecificatio...
method value (line 90) | private Value value(Number[] values)
class MyMemberValueSetter (line 103) | private static class MyMemberValueSetter
method MyMemberValueSetter (line 109) | public MyMemberValueSetter(Value value)
method visitProgramField (line 117) | public void visitProgramField(ProgramClass programClass, ProgramFiel...
method visitProgramMethod (line 125) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
method visitLibraryField (line 133) | public void visitLibraryField(LibraryClass libraryClass, LibraryFiel...
method visitLibraryMethod (line 141) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMet...
FILE: base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationCounter.java
class KotlinAnnotationCounter (line 36) | public class KotlinAnnotationCounter
method KotlinAnnotationCounter (line 46) | public KotlinAnnotationCounter(SimpleUsageMarker javaUsageMarker)
method KotlinAnnotationCounter (line 52) | public KotlinAnnotationCounter() {}
method getCount (line 60) | public int getCount()
method getParameterAnnotationCount (line 72) | public int getParameterAnnotationCount(int index)
method reset (line 81) | public KotlinAnnotationCounter reset()
method visitAnyMember (line 91) | @Override
method visitAnyAnnotationsAttribute (line 100) | @Override
method visitAnyParameterAnnotationsAttribute (line 110) | @Override
method visitAnyAttribute (line 124) | @Override
method visitAnnotation (line 130) | @Override
method visitAnnotation (line 140) | @Override
FILE: base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationFlagFixer.java
class KotlinAnnotationFlagFixer (line 27) | public class KotlinAnnotationFlagFixer
method KotlinAnnotationFlagFixer (line 43) | public KotlinAnnotationFlagFixer()
method visitAnyKotlinMetadata (line 48) | @Override
method visitKotlinDeclarationContainerMetadata (line 53) | @Override
method visitKotlinClassMetadata (line 62) | @Override
method visitKotlinFileFacadeMetadata (line 78) | @Override
method visitKotlinSyntheticClassMetadata (line 84) | @Override
method visitKotlinMultiFileFacadeMetadata (line 90) | @Override
method visitKotlinMultiFilePartMetadata (line 95) | @Override
method visitAnyProperty (line 103) | @Override
method visitAnyFunction (line 148) | @Override
method visitConstructor (line 164) | @Override
method visitTypeAlias (line 185) | @Override
method visitAnyType (line 199) | @Override
method visitFunctionReceiverType (line 209) | @Override
method visitAnyValueParameter (line 220) | @Override
method visitAnyTypeParameter (line 224) | @Override
method visitFunctionValParameter (line 234) | @Override
method visitConstructorValParameter (line 253) | @Override
method visitPropertyValParameter (line 275) | @Override
method visitAnyVersionRequirement (line 294) | @Override
FILE: base/src/main/java/proguard/io/ClassMapDataEntryReplacer.java
class ClassMapDataEntryReplacer (line 46) | public class ClassMapDataEntryReplacer
method ClassMapDataEntryReplacer (line 54) | public ClassMapDataEntryReplacer(ClassPool programClassPool,
method read (line 65) | @Override
method writeClassMap (line 86) | private void writeClassMap() throws IOException
method writeMembers (line 125) | private <T extends Member> void writeMembers(Map<T, Integer> originalM...
method isKept (line 139) | static boolean isKept(int processingFlags)
method allDeclaredFieldsKept (line 149) | private static boolean allDeclaredFieldsKept(Clazz clazz)
method allPublicFieldsKept (line 171) | private static boolean allPublicFieldsKept(Clazz clazz)
method allDeclaredConstructorsKept (line 198) | private static boolean allDeclaredConstructorsKept(Clazz clazz)
method allPublicConstructorsKept (line 223) | private static boolean allPublicConstructorsKept(Clazz clazz)
method allDeclaredMethodsKept (line 249) | private static boolean allDeclaredMethodsKept(Clazz clazz)
method allPublicMethodsKept (line 273) | private static boolean allPublicMethodsKept(Clazz clazz)
FILE: base/src/main/java/proguard/io/ExtraDataEntryNameMap.java
class ExtraDataEntryNameMap (line 39) | public class ExtraDataEntryNameMap
method clear (line 47) | public void clear()
method clearExtraClasses (line 56) | public void clearExtraClasses()
method addExtraDataEntry (line 74) | public void addExtraDataEntry(String extraDataEntryName)
method addExtraClass (line 83) | public void addExtraClass(String extraDataEntryName)
method addExtraDataEntry (line 92) | public void addExtraDataEntry(String keyDataEntryName,
method addExtraDataEntryToClass (line 102) | public void addExtraDataEntryToClass(String keyClassName,
method addExtraClassToClass (line 113) | public void addExtraClassToClass(Clazz keyClass,
method addExtraClassToClass (line 124) | public void addExtraClassToClass(Clazz keyClass,
method addExtraClassToClass (line 135) | public void addExtraClassToClass(Clazz keyClass,
method addExtraClassToClass (line 146) | public void addExtraClassToClass(String keyClassName,
method addExtraClassToClass (line 157) | public void addExtraClassToClass(String keyClassName,
method getKeyDataEntryNames (line 168) | public Set<String> getKeyDataEntryNames()
method getAllExtraDataEntryNames (line 177) | public Set<String> getAllExtraDataEntryNames()
method getDefaultExtraDataEntryNames (line 186) | public Set<String> getDefaultExtraDataEntryNames()
method getExtraDataEntryNames (line 195) | public Set<String> getExtraDataEntryNames(String keyDataEntryName)
method getClassDataEntryName (line 203) | private String getClassDataEntryName(Clazz clazz)
method getClassDataEntryName (line 209) | private String getClassDataEntryName(Class clazz)
method getClassDataEntryName (line 215) | public String getClassDataEntryName(String className)
FILE: base/src/main/java/proguard/io/ExtraDataEntryReader.java
class ExtraDataEntryReader (line 32) | public class ExtraDataEntryReader implements DataEntryReader
method ExtraDataEntryReader (line 49) | public ExtraDataEntryReader(String extraEntryName,
method ExtraDataEntryReader (line 66) | public ExtraDataEntryReader(String extraEntryName,
method ExtraDataEntryReader (line 86) | public ExtraDataEntryReader(ExtraDataEntryNameMap extraEntryNameMap,
method ExtraDataEntryReader (line 105) | public ExtraDataEntryReader(ExtraDataEntryNameMap extraEntryNameMap,
method read (line 117) | @Override
method readExtraEntries (line 135) | private void readExtraEntries(DataEntry parentEntry,
FILE: base/src/main/java/proguard/io/KotlinModuleRewriter.java
class KotlinModuleRewriter (line 35) | public class KotlinModuleRewriter
method KotlinModuleRewriter (line 43) | public KotlinModuleRewriter(ClassPool programClassPool, Charset charse...
method read (line 50) | public void read(DataEntry dataEntry) throws IOException
method copyData (line 56) | protected void copyData(InputStream inputStream, OutputStream outputSt...
class PackageInformation (line 74) | private class PackageInformation
method PackageInformation (line 81) | private PackageInformation(String fqName) {this.fqName = fqName;}
method addToModule (line 84) | public void addToModule(KmModule out)
class ModuleTransformer (line 90) | private class ModuleTransformer extends KmModuleVisitor
method getPackageInformation (line 95) | private PackageInformation getPackageInformation(String fqName)
method getPackageInformation (line 110) | private PackageInformation getPackageInformation(Clazz clazz)
method visitPackageParts (line 116) | public void visitPackageParts(String fqName, List<String> fileFacade...
method getResult (line 149) | public KmModule getResult()
method visitAnnotation (line 160) | public void visitAnnotation(KmAnnotation annotation)
method visitEnd (line 166) | public void visitEnd() {}
FILE: base/src/main/java/proguard/io/UniqueDataEntryWriter.java
class UniqueDataEntryWriter (line 22) | public class UniqueDataEntryWriter implements DataEntryWriter
method UniqueDataEntryWriter (line 28) | public UniqueDataEntryWriter(DataEntryWriter dataEntryWriter)
method createDirectory (line 36) | @Override
method sameOutputStream (line 54) | @Override
method createOutputStream (line 61) | @Override
method close (line 79) | @Override
method println (line 86) | @Override
FILE: base/src/main/java/proguard/logging/Logging.java
class Logging (line 15) | public class Logging
method configureVerbosity (line 17) | public static void configureVerbosity(boolean verbose) {
FILE: base/src/main/java/proguard/mark/Marker.java
class Marker (line 82) | public class Marker implements Pass
method Marker (line 88) | public Marker(Configuration configuration)
method execute (line 99) | @Override
method createShrinkingMarker (line 145) | private ClassPoolVisitor createShrinkingMarker(Configuration configura...
method createOptimizationMarker (line 167) | private ClassPoolVisitor createOptimizationMarker(Configuration config...
method createObfuscationMarker (line 203) | private ClassPoolVisitor createObfuscationMarker(Configuration configu...
method markSafeGeneralizationMembers (line 232) | private void markSafeGeneralizationMembers(ClassPool programClassPool,
method disableOptimizationForKotlinFeatures (line 254) | private void disableOptimizationForKotlinFeatures(ClassPool programCla...
class KotlinDontOptimizeMarker (line 267) | public static class KotlinDontOptimizeMarker
method visitAnyKotlinMetadata (line 279) | @Override
method visitKotlinDeclarationContainerMetadata (line 283) | @Override
method visitKotlinClassMetadata (line 291) | @Override
method visitKotlinSyntheticClassMetadata (line 324) | @Override
method visitAnyFunction (line 353) | @Override
method visitFunction (line 359) | @Override
method visitSyntheticFunction (line 399) | @Override
method hasAnyOf (line 418) | private static boolean hasAnyOf(int value, int ... flag)
FILE: base/src/main/java/proguard/obfuscate/AttributeShrinker.java
class AttributeShrinker (line 39) | public class AttributeShrinker
method visitAnyClass (line 47) | @Override
method visitProgramClass (line 51) | @Override
method visitProgramMember (line 70) | public void visitProgramMember(ProgramClass programClass, ProgramMembe...
method visitAnyAttribute (line 84) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitRecordAttribute (line 87) | public void visitRecordAttribute(Clazz clazz, RecordAttribute recordAt...
method visitCodeAttribute (line 94) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitRecordComponentInfo (line 105) | public void visitRecordComponentInfo(Clazz clazz, RecordComponentInfo ...
method shrinkArray (line 121) | private static int shrinkArray(Processable[] array, int length)
FILE: base/src/main/java/proguard/obfuscate/AttributeUsageMarker.java
class AttributeUsageMarker (line 35) | public class AttributeUsageMarker
method visitAnyAttribute (line 44) | public void visitAnyAttribute(Clazz clazz, Attribute attribute)
method markAsUsed (line 56) | private static void markAsUsed(Processable processable)
method isUsed (line 66) | public static boolean isUsed(Processable processable)
FILE: base/src/main/java/proguard/obfuscate/ClassNameAdapterFunction.java
class ClassNameAdapterFunction (line 36) | public class ClassNameAdapterFunction implements StringFunction
method ClassNameAdapterFunction (line 45) | public ClassNameAdapterFunction(ClassPool classPool)
method transform (line 54) | @Override
method createPackagePrefixMap (line 135) | private static Map createPackagePrefixMap(ClassPool classPool)
FILE: base/src/main/java/proguard/obfuscate/ClassObfuscator.java
class ClassObfuscator (line 46) | public class ClassObfuscator
method ClassObfuscator (line 102) | public ClassObfuscator(ClassPool programClassPool,
method visitAnyClass (line 149) | @Override
method visitProgramClass (line 156) | @Override
method visitLibraryClass (line 185) | @Override
method visitAnyAttribute (line 196) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitInnerClassesAttribute (line 199) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
method visitEnclosingMethodAttribute (line 206) | public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethod...
method visitInnerClassesInfo (line 220) | public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerC...
method isSyntheticKotlinLambdaClass (line 245) | private boolean isSyntheticKotlinLambdaClass(Clazz innerClass)
method isNumericClassName (line 266) | private boolean isNumericClassName(Clazz innerClass,
method visitClassConstant (line 297) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
class MyKeepCollector (line 308) | private class MyKeepCollector
method visitAnyClass (line 311) | @Override
method visitProgramClass (line 315) | @Override
method visitLibraryClass (line 343) | public void visitLibraryClass(LibraryClass libraryClass)
method mapPackageName (line 376) | private void mapPackageName(String className,
method newPackagePrefix (line 409) | private String newPackagePrefix(String packagePrefix)
method generateUniquePackagePrefix (line 450) | private String generateUniquePackagePrefix(String newSuperPackagePrefix)
method generateUniquePackagePrefix (line 479) | private String generateUniquePackagePrefix(String newSuperPackage...
method generateUniqueClassName (line 500) | private String generateUniqueClassName(String newPackagePrefix)
method generateUniqueNumericClassName (line 528) | private String generateUniqueNumericClassName(String newPackagePrefix)
method generateUniqueClassName (line 551) | private String generateUniqueClassName(String newPackagePrefix,
method mixedCaseClassName (line 584) | private String mixedCaseClassName(String className)
method setNewClassName (line 597) | public static void setNewClassName(Clazz clazz, String name)
method hasOriginalClassName (line 609) | public static boolean hasOriginalClassName(Clazz clazz)
method newClassName (line 621) | public static String newClassName(Clazz clazz)
FILE: base/src/main/java/proguard/obfuscate/ClassRenamer.java
class ClassRenamer (line 39) | public class ClassRenamer
method ClassRenamer (line 51) | public ClassRenamer()
method ClassRenamer (line 65) | public ClassRenamer(ClassVisitor extraClassVisitor,
method visitAnyClass (line 75) | @Override
method visitProgramClass (line 82) | @Override
method visitLibraryClass (line 94) | @Override
method visitProgramMember (line 118) | public void visitProgramMember(ProgramClass programClass,
method visitLibraryMember (line 136) | public void visitLibraryMember(LibraryClass libraryClass,
method visitClassConstant (line 156) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
FILE: base/src/main/java/proguard/obfuscate/DictionaryNameFactory.java
class DictionaryNameFactory (line 34) | public class DictionaryNameFactory implements NameFactory
method DictionaryNameFactory (line 51) | public DictionaryNameFactory(URL url,
method DictionaryNameFactory (line 67) | public DictionaryNameFactory(URL url,
method DictionaryNameFactory (line 85) | public DictionaryNameFactory(File file,
method DictionaryNameFactory (line 101) | public DictionaryNameFactory(File file,
method DictionaryNameFactory (line 120) | public DictionaryNameFactory(Reader reader,
method DictionaryNameFactory (line 137) | public DictionaryNameFactory(Reader reader,
method DictionaryNameFactory (line 220) | public DictionaryNameFactory(DictionaryNameFactory dictionaryNameFactory,
method reset (line 230) | public void reset()
method nextName (line 238) | public String nextName()
method main (line 262) | public static void main(String[] args)
FILE: base/src/main/java/proguard/obfuscate/MapCleaner.java
class MapCleaner (line 33) | public class MapCleaner
method MapCleaner (line 43) | public MapCleaner(Map map)
method visitAnyClass (line 51) | public void visitAnyClass(Clazz clazz)
FILE: base/src/main/java/proguard/obfuscate/MappingKeeper.java
class MappingKeeper (line 33) | public class MappingKeeper implements MappingProcessor
method MappingKeeper (line 49) | public MappingKeeper(ClassPool classPool,
method processClassMapping (line 59) | public boolean processClassMapping(String className,
method processFieldMapping (line 99) | public void processFieldMapping(String className,
method processMethodMapping (line 138) | public void processMethodMapping(String className,
FILE: base/src/main/java/proguard/obfuscate/MappingPrinter.java
class MappingPrinter (line 56) | public class MappingPrinter
method MappingPrinter (line 73) | public MappingPrinter(PrintWriter printWriter)
method visitAnyClass (line 81) | @Override
method visitProgramClass (line 85) | @Override
method visitProgramField (line 108) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 126) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitAnyAttribute (line 154) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 157) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitLineNumberTableAttribute (line 163) | public void visitLineNumberTableAttribute(Clazz clazz, Method method, ...
method printInlinedMethodMapping (line 276) | private void printInlinedMethodMapping(String className,
method printEnclosingMethodMapping (line 336) | private void printEnclosingMethodMapping(String className,
class SourceFileNamePrinter (line 388) | private static class SourceFileNamePrinter implements AttributeVisitor
method SourceFileNamePrinter (line 392) | public SourceFileNamePrinter(PrintWriter pw)
method visitSourceFileAttribute (line 397) | @Override
method visitAnyAttribute (line 414) | @Override
FILE: base/src/main/java/proguard/obfuscate/MappingProcessor.java
type MappingProcessor (line 32) | public interface MappingProcessor
method processClassMapping (line 42) | public boolean processClassMapping(String className,
method processFieldMapping (line 53) | public void processFieldMapping(String className,
method processMethodMapping (line 76) | public void processMethodMapping(String className,
FILE: base/src/main/java/proguard/obfuscate/MappingReader.java
class MappingReader (line 32) | public class MappingReader
method MappingReader (line 37) | public MappingReader(File mappingFile)
method pump (line 47) | public void pump(MappingProcessor mappingProcessor) throws IOException
method processClassMapping (line 112) | private String processClassMapping(String line,
method processClassMemberMapping (line 145) | private void processClassMemberMapping(String className,
FILE: base/src/main/java/proguard/obfuscate/MemberNameCleaner.java
class MemberNameCleaner (line 34) | public class MemberNameCleaner implements MemberVisitor
method visitProgramField (line 38) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 44) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 50) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 56) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
FILE: base/src/main/java/proguard/obfuscate/MemberNameCollector.java
class MemberNameCollector (line 37) | public class MemberNameCollector
method MemberNameCollector (line 51) | public MemberNameCollector(boolean allowAggressiveOverloading,
method visitAnyMember (line 61) | public void visitAnyMember(Clazz clazz, Member member)
FILE: base/src/main/java/proguard/obfuscate/MemberNameConflictFixer.java
class MemberNameConflictFixer (line 36) | public class MemberNameConflictFixer implements MemberVisitor
method MemberNameConflictFixer (line 57) | public MemberNameConflictFixer(boolean allowAggressiveOverloa...
method visitProgramField (line 73) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 79) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 93) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 94) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitMember (line 103) | private void visitMember(Clazz clazz,
FILE: base/src/main/java/proguard/obfuscate/MemberObfuscator.java
class MemberObfuscator (line 41) | public class MemberObfuscator
method MemberObfuscator (line 58) | public MemberObfuscator(boolean allowAggressiveOverloading,
method visitAnyMember (line 70) | public void visitAnyMember(Clazz clazz, Member member)
method retrieveNameMap (line 127) | static Map retrieveNameMap(Map descriptorMap, String descriptor)
method setFixedNewMemberName (line 148) | public static void setFixedNewMemberName(Member member, String name)
method setNewMemberName (line 169) | public static void setNewMemberName(Member member, String name)
method hasFixedNewMemberName (line 180) | static boolean hasFixedNewMemberName(Member member)
method newMemberName (line 195) | public static String newMemberName(Member member)
class MyFixedName (line 205) | private static class MyFixedName extends SimpleProcessable
method MyFixedName (line 207) | public MyFixedName(String newName)
FILE: base/src/main/java/proguard/obfuscate/MemberSpecialNameFilter.java
class MemberSpecialNameFilter (line 37) | public class MemberSpecialNameFilter implements MemberVisitor
method MemberSpecialNameFilter (line 47) | public MemberSpecialNameFilter(MemberVisitor memberVisitor)
method visitProgramField (line 55) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 64) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 73) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 82) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method hasSpecialName (line 97) | private static boolean hasSpecialName(Member member)
FILE: base/src/main/java/proguard/obfuscate/MultiMappingProcessor.java
class MultiMappingProcessor (line 29) | public class MultiMappingProcessor
method MultiMappingProcessor (line 40) | public MultiMappingProcessor(MappingProcessor[] mappingProcessors)
method processClassMapping (line 48) | public boolean processClassMapping(String className,
method processFieldMapping (line 63) | public void processFieldMapping(String className,
method processMethodMapping (line 80) | public void processMethodMapping(String className,
FILE: base/src/main/java/proguard/obfuscate/NameFactory.java
type NameFactory (line 29) | public interface NameFactory
method reset (line 31) | public void reset();
method nextName (line 33) | public String nextName();
FILE: base/src/main/java/proguard/obfuscate/NameFactoryResetter.java
class NameFactoryResetter (line 32) | public class NameFactoryResetter
method NameFactoryResetter (line 42) | public NameFactoryResetter(NameFactory nameFactory)
method visitAnyClass (line 50) | @Override
FILE: base/src/main/java/proguard/obfuscate/NameMarker.java
class NameMarker (line 42) | class NameMarker
method visitAnyClass (line 51) | @Override
method visitProgramClass (line 58) | @Override
method visitLibraryClass (line 68) | @Override
method visitProgramField (line 77) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 83) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 89) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 95) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitAnyAttribute (line 103) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitInnerClassesAttribute (line 106) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
method visitInnerClassesInfo (line 115) | public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerC...
method visitClassConstant (line 131) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
method keepClassName (line 143) | public void keepClassName(Clazz clazz)
method keepFieldName (line 153) | private void keepFieldName(Clazz clazz, Field field)
method keepMethodName (line 163) | private void keepMethodName(Clazz clazz, Method method)
FILE: base/src/main/java/proguard/obfuscate/NameObfuscationReferenceFixer.java
class NameObfuscationReferenceFixer (line 24) | public class NameObfuscationReferenceFixer
method NameObfuscationReferenceFixer (line 29) | public NameObfuscationReferenceFixer(Configuration configuration)
method execute (line 35) | @Override
FILE: base/src/main/java/proguard/obfuscate/NewMemberNameFilter.java
class NewMemberNameFilter (line 36) | public class NewMemberNameFilter implements MemberVisitor
method NewMemberNameFilter (line 46) | public NewMemberNameFilter(MemberVisitor memberVisitor)
method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 63) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 72) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 81) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method hasName (line 95) | private boolean hasName(Clazz clazz)
method hasName (line 104) | private boolean hasName(Clazz clazz, Method method)
method hasName (line 116) | private boolean hasName(Member member)
FILE: base/src/main/java/proguard/obfuscate/NumericNameFactory.java
class NumericNameFactory (line 29) | public class NumericNameFactory implements NameFactory
method reset (line 36) | public void reset()
method nextName (line 42) | public String nextName()
FILE: base/src/main/java/proguard/obfuscate/ObfuscationPreparation.java
class ObfuscationPreparation (line 20) | public class ObfuscationPreparation implements Pass
method ObfuscationPreparation (line 26) | public ObfuscationPreparation(Configuration configuration)
method execute (line 32) | @Override
FILE: base/src/main/java/proguard/obfuscate/Obfuscator.java
class Obfuscator (line 119) | public class Obfuscator implements Pass
method Obfuscator (line 124) | public Obfuscator(Configuration configuration)
method execute (line 133) | @Override
FILE: base/src/main/java/proguard/obfuscate/OriginalClassNameFilter.java
class OriginalClassNameFilter (line 34) | public class OriginalClassNameFilter
method OriginalClassNameFilter (line 51) | public OriginalClassNameFilter(ClassVisitor acceptedClassVisitor,
method visitAnyClass (line 61) | @Override
method selectVisitor (line 73) | private ClassVisitor selectVisitor(Clazz clazz)
FILE: base/src/main/java/proguard/obfuscate/ParameterNameMarker.java
class ParameterNameMarker (line 34) | public class ParameterNameMarker
method ParameterNameMarker (line 45) | public ParameterNameMarker(AttributeVisitor attributeUsageMarker)
method visitAnyAttribute (line 53) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitLocalVariableTableAttribute (line 56) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
method visitLocalVariableTypeTableAttribute (line 88) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
method hasParameters (line 122) | private boolean hasParameters(Clazz clazz, Method method)
FILE: base/src/main/java/proguard/obfuscate/PrefixingNameFactory.java
class PrefixingNameFactory (line 30) | public class PrefixingNameFactory implements NameFactory
method PrefixingNameFactory (line 41) | public PrefixingNameFactory(NameFactory delegateNameFactory,
method nextName (line 51) | public String nextName()
method reset (line 56) | public void reset()
FILE: base/src/main/java/proguard/obfuscate/RenamedFlagSetter.java
class RenamedFlagSetter (line 34) | public class RenamedFlagSetter
method visitAnyClass (line 43) | @Override
method visitProgramClass (line 47) | @Override
method visitProgramMember (line 66) | public void visitProgramMember(ProgramClass programClass, ProgramMembe...
FILE: base/src/main/java/proguard/obfuscate/ResourceFileNameAdapter.java
class ResourceFileNameAdapter (line 21) | public class ResourceFileNameAdapter
method ResourceFileNameAdapter (line 26) | public ResourceFileNameAdapter(Configuration configuration)
method execute (line 32) | @Override
FILE: base/src/main/java/proguard/obfuscate/ResourceFileNameObfuscator.java
class ResourceFileNameObfuscator (line 33) | public class ResourceFileNameObfuscator
method ResourceFileNameObfuscator (line 41) | public ResourceFileNameObfuscator(StringFunction nameObfuscationFunction,
method ResourceFileNameObfuscator (line 48) | public ResourceFileNameObfuscator(StringFunction nameObfuscationF...
method visitAnyResourceFile (line 60) | @Override
method setNewResourceFileName (line 84) | private static void setNewResourceFileName(ResourceFile resourceFile, ...
method isObfuscated (line 97) | public static boolean isObfuscated(ResourceFile resourceFile)
method getOriginalResourceFileName (line 109) | public static String getOriginalResourceFileName(ResourceFile resource...
FILE: base/src/main/java/proguard/obfuscate/ResourceJavaReferenceFixer.java
class ResourceJavaReferenceFixer (line 37) | public class ResourceJavaReferenceFixer implements ResourceFileVisitor
method visitResourceFile (line 41) | @Override
method visitKotlinModule (line 61) | @Override
FILE: base/src/main/java/proguard/obfuscate/SimpleNameFactory.java
class SimpleNameFactory (line 31) | public class SimpleNameFactory implements NameFactory
method SimpleNameFactory (line 48) | public SimpleNameFactory()
method SimpleNameFactory (line 59) | public SimpleNameFactory(boolean generateMixedCaseNames)
method reset (line 67) | public void reset()
method nextName (line 73) | public String nextName()
method name (line 82) | private String name(int index)
method newName (line 92) | private String newName(int index)
method charAt (line 121) | private char charAt(int index)
method main (line 128) | public static void main(String[] args)
method printNameSamples (line 141) | private static void printNameSamples(SimpleNameFactory factory, int co...
FILE: base/src/main/java/proguard/obfuscate/SourceFileRenamer.java
class SourceFileRenamer (line 36) | public class SourceFileRenamer
method SourceFileRenamer (line 48) | public SourceFileRenamer(String newSourceFileAttribute)
method visitAnyClass (line 56) | @Override
method visitProgramClass (line 60) | @Override
method visitAnyAttribute (line 70) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitSourceFileAttribute (line 73) | public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute ...
method visitSourceDirAttribute (line 81) | public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute so...
FILE: base/src/main/java/proguard/obfuscate/SpecialNameFactory.java
class SpecialNameFactory (line 29) | public class SpecialNameFactory implements NameFactory
method SpecialNameFactory (line 42) | public SpecialNameFactory(NameFactory nameFactory)
method reset (line 50) | public void reset()
method nextName (line 56) | public String nextName()
method isSpecialName (line 67) | static boolean isSpecialName(String name)
method main (line 74) | public static void main(String[] args)
FILE: base/src/main/java/proguard/obfuscate/UniqueMemberNameFactory.java
class UniqueMemberNameFactory (line 31) | public class UniqueMemberNameFactory implements NameFactory
method newInjectedMemberNameFactory (line 47) | public static UniqueMemberNameFactory newInjectedMemberNameFactory(Cla...
method UniqueMemberNameFactory (line 62) | public UniqueMemberNameFactory(NameFactory delegateNameFactory,
method nextName (line 72) | public String nextName()
method reset (line 89) | public void reset()
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasNameObfuscator.java
class KotlinAliasNameObfuscator (line 29) | public class KotlinAliasNameObfuscator
method KotlinAliasNameObfuscator (line 38) | public KotlinAliasNameObfuscator(NameFactory nameFactory)
method visitAnyKotlinMetadata (line 45) | @Override
method visitKotlinDeclarationContainerMetadata (line 49) | @Override
method visitAnyType (line 57) | @Override
method visitTypeAlias (line 60) | @Override
method visitAliasExpandedType (line 68) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasReferenceFixer.java
class KotlinAliasReferenceFixer (line 28) | public class KotlinAliasReferenceFixer
method visitAnyType (line 34) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinCallableReferenceFixer.java
class KotlinCallableReferenceFixer (line 47) | public class KotlinCallableReferenceFixer
method KotlinCallableReferenceFixer (line 53) | public KotlinCallableReferenceFixer(ClassPool programClassPool, ClassP...
method visitAnyKotlinMetadata (line 61) | @Override
method visitKotlinSyntheticClassMetadata (line 64) | @Override
class NameOrSignatureReplacementSequences (line 124) | public static final class NameOrSignatureReplacementSequences
method NameOrSignatureReplacementSequences (line 130) | NameOrSignatureReplacementSequences(String name, ClassPool programCl...
method getSequences (line 149) | @Override
method getConstants (line 155) | @Override
class NameAndSignatureReplacementSequences (line 162) | public static final class NameAndSignatureReplacementSequences
method NameAndSignatureReplacementSequences (line 173) | NameAndSignatureReplacementSequences(String name, String signature, ...
method getSequences (line 209) | @Override
method getConstants (line 215) | @Override
class OwnerReplacementSequences (line 222) | public static final class OwnerReplacementSequences
method OwnerReplacementSequences (line 228) | OwnerReplacementSequences(String name, ClassPool programClassPool, C...
method getSequences (line 253) | @Override
method getConstants (line 259) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinCompanionEqualizer.java
class KotlinCompanionEqualizer (line 32) | public class KotlinCompanionEqualizer
method visitAnyKotlinMetadata (line 36) | @Override
method visitKotlinClassMetadata (line 39) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultImplsMethodNameEqualizer.java
class KotlinDefaultImplsMethodNameEqualizer (line 29) | public class KotlinDefaultImplsMethodNameEqualizer
method visitAnyFunction (line 33) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultMethodNameEqualizer.java
class KotlinDefaultMethodNameEqualizer (line 30) | public class KotlinDefaultMethodNameEqualizer
method visitAnyFunction (line 34) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinIntrinsicsReplacementSequences.java
class KotlinIntrinsicsReplacementSequences (line 32) | public final class KotlinIntrinsicsReplacementSequences
method KotlinIntrinsicsReplacementSequences (line 43) | public KotlinIntrinsicsReplacementSequences(ClassPool programClassPool...
method getSequences (line 195) | @Override
method getConstants (line 201) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleFixer.java
class KotlinModuleFixer (line 42) | public class KotlinModuleFixer
method visitKotlinModule (line 47) | @Override
class ModulePackageNameFixer (line 76) | private static class ModulePackageNameFixer
method ModulePackageNameFixer (line 81) | ModulePackageNameFixer(List<String> packageNames)
method visitKotlinModulePackage (line 86) | @Override
class ToMoveCollector (line 127) | private static class ToMoveCollector
method ToMoveCollector (line 133) | private ToMoveCollector(Map<String, KotlinFileFacadeKindMetadata> ...
method visitKotlinModulePackage (line 140) | @Override
class ModulePartCleaner (line 167) | private static class ModulePartCleaner
method ModulePartCleaner (line 173) | private ModulePartCleaner(Map<String, KotlinFileFacadeKindMetadata> ...
method visitKotlinModulePackage (line 180) | @Override
method createNewModulePackages (line 203) | private static void createNewModulePackages(KotlinModule ...
method addFileFacadesToModule (line 220) | private static void addFileFacadesToModule(KotlinModule ...
method addMultiFilePartsToModule (line 233) | private static void addMultiFilePartsToModule(KotlinModule ...
method moduleNameToFileName (line 248) | private static String moduleNameToFileName(String moduleName)
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleNameObfuscator.java
class KotlinModuleNameObfuscator (line 34) | public class KotlinModuleNameObfuscator
method KotlinModuleNameObfuscator (line 39) | public KotlinModuleNameObfuscator(NameFactory nameFactory)
method visitKotlinModule (line 48) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinMultiFileFacadeFixer.java
class KotlinMultiFileFacadeFixer (line 38) | public class KotlinMultiFileFacadeFixer
method visitAnyKotlinMetadata (line 43) | @Override
method visitKotlinMultiFileFacadeMetadata (line 46) | @Override
method dontObfuscate (line 78) | private static boolean dontObfuscate(Processable processable)
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinObjectFixer.java
class KotlinObjectFixer (line 36) | public class KotlinObjectFixer
method visitAnyKotlinMetadata (line 39) | @Override
method visitKotlinClassMetadata (line 43) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyNameObfuscator.java
class KotlinPropertyNameObfuscator (line 29) | public class KotlinPropertyNameObfuscator
method KotlinPropertyNameObfuscator (line 37) | public KotlinPropertyNameObfuscator(NameFactory nameFactory)
method visitAnyKotlinMetadata (line 44) | @Override
method visitKotlinDeclarationContainerMetadata (line 48) | @Override
method visitAnyProperty (line 57) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyRenamer.java
class KotlinPropertyRenamer (line 31) | public class KotlinPropertyRenamer implements KotlinPropertyVisitor
method visitAnyProperty (line 33) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSourceDebugExtensionAttributeObfuscator.java
class KotlinSourceDebugExtensionAttributeObfuscator (line 31) | public class KotlinSourceDebugExtensionAttributeObfuscator
method visitSourceDebugExtensionAttribute (line 45) | @Override
method visitAnyAttribute (line 53) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticClassFixer.java
class KotlinSyntheticClassFixer (line 38) | public class KotlinSyntheticClassFixer
method visitAnyKotlinMetadata (line 42) | @Override
method visitKotlinClassMetadata (line 45) | @Override
method visitKotlinSyntheticClassMetadata (line 63) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticToStringObfuscator.java
class KotlinSyntheticToStringObfuscator (line 70) | public class KotlinSyntheticToStringObfuscator
method visitAnyKotlinMetadata (line 83) | @Override
method visitKotlinClassMetadata (line 86) | @Override
class MyObfuscatedToStringFixer (line 121) | private static final class MyObfuscatedToStringFixer
method MyObfuscatedToStringFixer (line 131) | private MyObfuscatedToStringFixer(Map<String, String> originalToNewN...
method visitAnyAttribute (line 139) | @Override
method visitCodeAttribute (line 142) | @Override
method visitAnyInstruction (line 152) | @Override
method visitConstantInstruction (line 155) | @Override
method visitStringConstant (line 177) | @Override
method visitUtf8Constant (line 183) | @Override
method visitAnyConstant (line 208) | @Override
class PropertyNameCollector (line 213) | private static final class PropertyNameCollector
method PropertyNameCollector (line 218) | private PropertyNameCollector(Map<String, String> nameMap) {
method visitAnyProperty (line 224) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinUnsupportedExceptionReplacementSequences.java
class KotlinUnsupportedExceptionReplacementSequences (line 37) | public final class KotlinUnsupportedExceptionReplacementSequences
method KotlinUnsupportedExceptionReplacementSequences (line 46) | public KotlinUnsupportedExceptionReplacementSequences(ClassPool progra...
method getSequences (line 72) | @Override
method getConstants (line 78) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinValueParameterNameShrinker.java
class KotlinValueParameterNameShrinker (line 31) | public class KotlinValueParameterNameShrinker
method visitAnyKotlinMetadata (line 40) | @Override
method visitKotlinDeclarationContainerMetadata (line 44) | @Override
method visitKotlinClassMetadata (line 53) | @Override
method visitKotlinSyntheticClassMetadata (line 61) | @Override
method visitConstructor (line 72) | @Override
method visitAnyProperty (line 86) | @Override
method visitAnyFunction (line 100) | @Override
class MyValueParameterShrinker (line 111) | private static class MyValueParameterShrinker implements KotlinValuePa...
method visitAnyValueParameter (line 115) | @Override
FILE: base/src/main/java/proguard/obfuscate/kotlin/KotlinValueParameterUsageMarker.java
class KotlinValueParameterUsageMarker (line 50) | public class KotlinValueParameterUsageMarker
method visitAnyKotlinMetadata (line 67) | @Override
method visitKotlinDeclarationContainerMetadata (line 70) | @Override
method visitKotlinClassMetadata (line 79) | @Override
method visitKotlinSyntheticClassMetadata (line 86) | @Override
method visitConstructor (line 95) | @Override
method visitAnyProperty (line 111) | @Override
method visitAnyFunction (line 130) | @Override
method visitAnyMember (line 146) | @Override
method visitProgramMethod (line 150) | @Override
method visitAnyValueParameter (line 158) | @Override
method markAsUsed (line 171) | private static void markAsUsed(Processable processable)
method isUsed (line 181) | static boolean isUsed(Processable processable)
FILE: base/src/main/java/proguard/obfuscate/util/InstructionSequenceObfuscator.java
class InstructionSequenceObfuscator (line 35) | public class InstructionSequenceObfuscator
method InstructionSequenceObfuscator (line 42) | public InstructionSequenceObfuscator(ReplacementSequences replacementS...
method visitAnyClass (line 59) | @Override
method visitProgramClass (line 63) | @Override
method visitAnyMember (line 72) | @Override
method visitProgramMethod (line 75) | @Override
class MyInstructionSequenceReplacer (line 86) | private static class MyInstructionSequenceReplacer extends MultiInstru...
method MyInstructionSequenceReplacer (line 89) | MyInstructionSequenceReplacer(Constant[] constants,
method createInstructionSequenceReplacers (line 97) | private static InstructionVisitor[] createInstructionSequenceReplace...
FILE: base/src/main/java/proguard/obfuscate/util/ReplacementSequences.java
type ReplacementSequences (line 26) | public interface ReplacementSequences
method getSequences (line 28) | Instruction[][][] getSequences();
method getConstants (line 29) | Constant[] getConstants();
FILE: base/src/main/java/proguard/optimize/BootstrapMethodArgumentShrinker.java
class BootstrapMethodArgumentShrinker (line 41) | public class BootstrapMethodArgumentShrinker
method visitBootstrapMethodInfo (line 51) | public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo ...
method visitMethodHandleConstant (line 79) | public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstan...
method visitAnyRefConstant (line 86) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
method visitLibraryMethod (line 95) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitProgramMethod (line 98) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/CalledMemberVisitor.java
class CalledMemberVisitor (line 33) | public class CalledMemberVisitor
method CalledMemberVisitor (line 40) | public CalledMemberVisitor(MemberVisitor memberVisitor)
method visitAnyInstruction (line 51) | public void visitAnyInstruction(Clazz clazz,
method visitConstantInstruction (line 60) | public void visitConstantInstruction(Clazz clazz,
FILE: base/src/main/java/proguard/optimize/ChangedCodePrinter.java
class ChangedCodePrinter (line 39) | public class ChangedCodePrinter
method ChangedCodePrinter (line 46) | public ChangedCodePrinter(AttributeVisitor attributeVisitor)
method visitUnknownAttribute (line 54) | public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknow...
method visitSourceDebugExtensionAttribute (line 60) | public void visitSourceDebugExtensionAttribute(Clazz clazz, SourceDebu...
method visitBootstrapMethodsAttribute (line 66) | public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMetho...
method visitSourceFileAttribute (line 72) | public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute ...
method visitSourceDirAttribute (line 78) | public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute so...
method visitInnerClassesAttribute (line 84) | public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttrib...
method visitEnclosingMethodAttribute (line 90) | public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethod...
method visitNestHostAttribute (line 96) | public void visitNestHostAttribute(Clazz clazz, NestHostAttribute nest...
method visitNestMembersAttribute (line 102) | public void visitNestMembersAttribute(Clazz clazz, NestMembersAttribut...
method visitPermittedSubclassesAttribute (line 108) | public void visitPermittedSubclassesAttribute(Clazz clazz, PermittedSu...
method visitModuleAttribute (line 114) | public void visitModuleAttribute(Clazz clazz, ModuleAttribute moduleAt...
method visitModuleMainClassAttribute (line 120) | public void visitModuleMainClassAttribute(Clazz clazz, ModuleMainClass...
method visitModulePackagesAttribute (line 126) | public void visitModulePackagesAttribute(Clazz clazz, ModulePackagesAt...
method visitDeprecatedAttribute (line 132) | public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute ...
method visitSyntheticAttribute (line 138) | public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute sy...
method visitSignatureAttribute (line 144) | public void visitSignatureAttribute(Clazz clazz, SignatureAttribute sy...
method visitDeprecatedAttribute (line 150) | public void visitDeprecatedAttribute(Clazz clazz, Field field, Depreca...
method visitSyntheticAttribute (line 156) | public void visitSyntheticAttribute(Clazz clazz, Field field, Syntheti...
method visitSignatureAttribute (line 162) | public void visitSignatureAttribute(Clazz clazz, Field field, Signatur...
method visitDeprecatedAttribute (line 168) | public void visitDeprecatedAttribute(Clazz clazz, Method method, Depre...
method visitSyntheticAttribute (line 174) | public void visitSyntheticAttribute(Clazz clazz, Method method, Synthe...
method visitSignatureAttribute (line 180) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
method visitConstantValueAttribute (line 186) | public void visitConstantValueAttribute(Clazz clazz, Field field, Cons...
method visitMethodParametersAttribute (line 192) | public void visitMethodParametersAttribute(Clazz clazz, Method method,...
method visitExceptionsAttribute (line 198) | public void visitExceptionsAttribute(Clazz clazz, Method method, Excep...
method visitStackMapAttribute (line 204) | public void visitStackMapAttribute(Clazz clazz, Method method, CodeAtt...
method visitStackMapTableAttribute (line 210) | public void visitStackMapTableAttribute(Clazz clazz, Method method, Co...
method visitLineNumberTableAttribute (line 216) | public void visitLineNumberTableAttribute(Clazz clazz, Method method, ...
method visitLocalVariableTableAttribute (line 222) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
method visitLocalVariableTypeTableAttribute (line 228) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
method visitRuntimeVisibleAnnotationsAttribute (line 234) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Runti...
method visitRuntimeInvisibleAnnotationsAttribute (line 240) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Run...
method visitRuntimeVisibleAnnotationsAttribute (line 246) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field...
method visitRuntimeInvisibleAnnotationsAttribute (line 252) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Fie...
method visitRuntimeVisibleAnnotationsAttribute (line 258) | public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Metho...
method visitRuntimeInvisibleAnnotationsAttribute (line 264) | public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Met...
method visitRuntimeVisibleParameterAnnotationsAttribute (line 270) | public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz cla...
method visitRuntimeInvisibleParameterAnnotationsAttribute (line 276) | public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz c...
method visitRuntimeVisibleTypeAnnotationsAttribute (line 282) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, R...
method visitRuntimeVisibleTypeAnnotationsAttribute (line 288) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, F...
method visitRuntimeVisibleTypeAnnotationsAttribute (line 294) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, M...
method visitRuntimeVisibleTypeAnnotationsAttribute (line 300) | public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, M...
method visitRuntimeInvisibleTypeAnnotationsAttribute (line 306) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
method visitRuntimeInvisibleTypeAnnotationsAttribute (line 312) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
method visitRuntimeInvisibleTypeAnnotationsAttribute (line 318) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
method visitRuntimeInvisibleTypeAnnotationsAttribute (line 324) | public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz,...
method visitAnnotationDefaultAttribute (line 330) | public void visitAnnotationDefaultAttribute(Clazz clazz, Method method...
method visitCodeAttribute (line 336) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method codeHasChanged (line 357) | private boolean codeHasChanged(CodeAttribute codeAttribute, byte[] old...
method printChangedCode (line 376) | private void printChangedCode(Clazz clazz,
FILE: base/src/main/java/proguard/optimize/ConstantMemberFilter.java
class ConstantMemberFilter (line 36) | public class ConstantMemberFilter
method ConstantMemberFilter (line 47) | public ConstantMemberFilter(MemberVisitor constantMemberVisitor)
method visitProgramField (line 55) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 66) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/ConstantParameterFilter.java
class ConstantParameterFilter (line 37) | public class ConstantParameterFilter
method ConstantParameterFilter (line 48) | public ConstantParameterFilter(MemberVisitor constantParameterVisitor)
method visitProgramMethod (line 56) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/DuplicateInitializerFixer.java
class DuplicateInitializerFixer (line 39) | public class DuplicateInitializerFixer
method DuplicateInitializerFixer (line 61) | public DuplicateInitializerFixer()
method DuplicateInitializerFixer (line 72) | public DuplicateInitializerFixer(MemberVisitor extraFixedInitializerVi...
method visitProgramMethod (line 80) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitAnyAttribute (line 182) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 185) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitSignatureAttribute (line 199) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
method visitAnyParameterAnnotationsAttribute (line 216) | public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method ...
FILE: base/src/main/java/proguard/optimize/DuplicateInitializerInvocationFixer.java
class DuplicateInitializerInvocationFixer (line 40) | public class DuplicateInitializerInvocationFixer
method DuplicateInitializerInvocationFixer (line 59) | public DuplicateInitializerInvocationFixer()
method DuplicateInitializerInvocationFixer (line 70) | public DuplicateInitializerInvocationFixer(InstructionVisitor extraAdd...
method visitAnyAttribute (line 78) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 81) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitAnyInstruction (line 98) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttrib...
method visitConstantInstruction (line 101) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
method visitAnyMethodrefConstant (line 137) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConstan...
method visitLibraryMethod (line 151) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitProgramMethod (line 154) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/InfluenceFixpointVisitor.java
class InfluenceFixpointVisitor (line 38) | public class InfluenceFixpointVisitor
method InfluenceFixpointVisitor (line 77) | public InfluenceFixpointVisitor(MemberVisitorFactory memberVisitorFact...
method visitClassPool (line 85) | @Override
type MemberVisitorFactory (line 123) | public interface MemberVisitorFactory
method createMemberVisitor (line 129) | MemberVisitor createMemberVisitor(MemberVisitor influencedMethodColl...
class MyThreadFactory (line 136) | private class MyThreadFactory
method newThread (line 141) | @Override
class MyAnalysisThread (line 152) | private class MyAnalysisThread
method MyAnalysisThread (line 162) | public MyAnalysisThread(Runnable runnable)
class MyAnalysisSubmitter (line 172) | private class MyAnalysisSubmitter
method visitAnyMember (line 177) | @Override
class MyAnalysis (line 199) | private class MyAnalysis
method MyAnalysis (line 206) | private MyAnalysis(Clazz clazz, Member member)
method run (line 215) | @Override
method equals (line 239) | @Override
method hashCode (line 249) | @Override
class CountLatch (line 262) | private static class CountLatch
method increment (line 270) | public synchronized void increment()
method decrement (line 279) | public synchronized void decrement()
method await (line 294) | public synchronized void await()
FILE: base/src/main/java/proguard/optimize/KeepMarker.java
class KeepMarker (line 38) | public class KeepMarker
method visitAnyClass (line 45) | @Override
method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 60) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 66) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 72) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitAnyAttribute (line 80) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 83) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method isKept (line 91) | public static boolean isKept(Clazz clazz)
method isKept (line 100) | public static boolean isKept(Field field)
method isKept (line 109) | public static boolean isKept(Method method)
method isKept (line 118) | public static boolean isKept(CodeAttribute codeAttribute)
FILE: base/src/main/java/proguard/optimize/KeptClassFilter.java
class KeptClassFilter (line 34) | public class KeptClassFilter
method KeptClassFilter (line 47) | public KeptClassFilter(ClassVisitor acceptedVisitor)
method KeptClassFilter (line 60) | public KeptClassFilter(ClassVisitor acceptedVisitor,
method visitAnyClass (line 70) | @Override
method selectVisitor (line 83) | private ClassVisitor selectVisitor(Clazz clazz)
FILE: base/src/main/java/proguard/optimize/KeptMemberFilter.java
class KeptMemberFilter (line 34) | public class KeptMemberFilter
method KeptMemberFilter (line 45) | public KeptMemberFilter(MemberVisitor memberVisitor)
method visitProgramField (line 53) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 62) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitLibraryField (line 71) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 80) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
FILE: base/src/main/java/proguard/optimize/LineNumberTrimmer.java
class LineNumberTrimmer (line 20) | public class LineNumberTrimmer
method execute (line 23) | @Override
FILE: base/src/main/java/proguard/optimize/MemberDescriptorSpecializer.java
class MemberDescriptorSpecializer (line 53) | public class MemberDescriptorSpecializer
method MemberDescriptorSpecializer (line 75) | public MemberDescriptorSpecializer(boolean specializeFieldTypes,
method MemberDescriptorSpecializer (line 106) | public MemberDescriptorSpecializer(boolean specializeFieldTypes,
method visitProgramField (line 124) | @Override
method visitProgramMethod (line 170) | @Override
method valueType (line 314) | private String valueType(String type, Value value)
method updateDescriptor (line 338) | private void updateDescriptor(ProgramClass programClass,
method newUniqueMemberName (line 362) | private String newUniqueMemberName(String name, String descriptor)
FILE: base/src/main/java/proguard/optimize/MemberReferenceGeneralizer.java
class MemberReferenceGeneralizer (line 46) | public class MemberReferenceGeneralizer
method MemberReferenceGeneralizer (line 77) | public MemberReferenceGeneralizer(boolean fieldGeneralizat...
method MemberReferenceGeneralizer (line 106) | public MemberReferenceGeneralizer(boolean fieldGeneralizat...
method visitAnyInstruction (line 122) | @Override
method visitConstantInstruction (line 126) | @Override
method visitAnyRefConstant (line 188) | @Override
method visitClassConstant (line 264) | @Override
method visitAnyClass (line 274) | @Override
FILE: base/src/main/java/proguard/optimize/MethodDescriptorShrinker.java
class MethodDescriptorShrinker (line 55) | public class MethodDescriptorShrinker
method MethodDescriptorShrinker (line 68) | public MethodDescriptorShrinker()
method MethodDescriptorShrinker (line 79) | public MethodDescriptorShrinker(MemberVisitor extraMemberVisitor)
method visitProgramMethod (line 87) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitAnyAttribute (line 148) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitSignatureAttribute (line 151) | public void visitSignatureAttribute(Clazz clazz, Method method, Signat...
method visitAnyParameterAnnotationsAttribute (line 187) | public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method ...
method shrinkDescriptor (line 258) | private String shrinkDescriptor(Method method,
method shrinkReferencedClasses (line 304) | private Clazz[] shrinkReferencedClasses(Method method,
FILE: base/src/main/java/proguard/optimize/MethodStaticizer.java
class MethodStaticizer (line 38) | public class MethodStaticizer
method MethodStaticizer (line 47) | public MethodStaticizer()
method MethodStaticizer (line 58) | public MethodStaticizer(MemberVisitor extraStaticMemberVisitor)
method visitProgramMethod (line 66) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/OptimizationInfoClassFilter.java
class OptimizationInfoClassFilter (line 36) | public class OptimizationInfoClassFilter
method OptimizationInfoClassFilter (line 47) | public OptimizationInfoClassFilter(ClassVisitor classVisitor)
method visitAnyClass (line 56) | @Override
method visitProgramClass (line 63) | @Override
method visitLibraryClass (line 74) | @Override
FILE: base/src/main/java/proguard/optimize/OptimizationInfoMemberFilter.java
class OptimizationInfoMemberFilter (line 38) | public class OptimizationInfoMemberFilter
method OptimizationInfoMemberFilter (line 50) | public OptimizationInfoMemberFilter(MemberVisitor memberVisitor)
method OptimizationInfoMemberFilter (line 65) | public OptimizationInfoMemberFilter(MemberVisitor memberVisitor,
method visitLibraryField (line 75) | public void visitLibraryField(LibraryClass libraryClass, LibraryField ...
method visitLibraryMethod (line 76) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitProgramField (line 78) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 91) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
FILE: base/src/main/java/proguard/optimize/Optimizer.java
class Optimizer (line 204) | public class Optimizer implements Pass
method Optimizer (line 339) | public Optimizer(Configuration configuration)
method execute (line 345) | @Override
method optimize (line 446) | private void optimize(Configuration configuration,
method createPeepholeOptimizations (line 1771) | private List<InstructionVisitor> createPeepholeOptimizations(Configura...
method disabled (line 1913) | private String disabled(boolean flag)
method disabled (line 1923) | private String disabled(boolean flag1, boolean flag2)
FILE: base/src/main/java/proguard/optimize/ParameterShrinker.java
class ParameterShrinker (line 42) | public class ParameterShrinker
method ParameterShrinker (line 55) | public ParameterShrinker()
method ParameterShrinker (line 66) | public ParameterShrinker(MemberVisitor extraUnusedParameterMethodVisitor)
method visitAnyAttribute (line 74) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 77) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
FILE: base/src/main/java/proguard/optimize/ReverseDependencyCalculator.java
class ReverseDependencyCalculator (line 40) | public class ReverseDependencyCalculator
method ReverseDependencyCalculator (line 47) | public ReverseDependencyCalculator(ClassPool classPool)
method reverseDependencyStore (line 57) | public ReverseDependencyStore reverseDependencyStore()
method isCalledBy (line 76) | private MultiValueMap<Method, ClassMemberPair> isCalledBy()
method methodsByProgramMethodOptimizationInfo (line 91) | private MultiValueMap<ProgramMethodOptimizationInfo, Method> methodsBy...
class FillMethodsByProgramMethodOptimizationInfo (line 103) | private static class FillMethodsByProgramMethodOptimizationInfo
method FillMethodsByProgramMethodOptimizationInfo (line 109) | public FillMethodsByProgramMethodOptimizationInfo(MultiValueMap<Prog...
method visitProgramField (line 115) | @Override
method visitProgramMethod (line 119) | @Override
method visitLibraryField (line 131) | @Override
method visitLibraryMethod (line 135) | @Override
class AddDependencies (line 142) | private static class AddDependencies
method AddDependencies (line 148) | AddDependencies(MultiValueMap<Method, ClassMemberPair> isCalledBy)
method visitAnyMember (line 154) | @Override
class Adder (line 167) | private class Adder
method Adder (line 173) | Adder(ClassMemberPair source)
method visitAnyMember (line 179) | @Override
method visitProgramMethod (line 183) | @Override
FILE: base/src/main/java/proguard/optimize/ReverseDependencyStore.java
class ReverseDependencyStore (line 32) | public class ReverseDependencyStore
method ReverseDependencyStore (line 44) | public ReverseDependencyStore(MultiValueMap<Method, ClassMemberPair> ...
class InfluencedMethodTraveller (line 62) | public class InfluencedMethodTraveller
method InfluencedMethodTraveller (line 68) | public InfluencedMethodTraveller(MemberVisitor memberVisitor) {this....
method visitProgramMethod (line 71) | @Override
FILE: base/src/main/java/proguard/optimize/SideEffectVisitorMarkerFactory.java
class SideEffectVisitorMarkerFactory (line 34) | class SideEffectVisitorMarkerFactory
method SideEffectVisitorMarkerFactory (line 43) | public SideEffectVisitorMarkerFactory(boolean optimizeConservatively)
method createMemberVisitor (line 50) | public MemberVisitor createMemberVisitor(MemberVisitor influencedMetho...
FILE: base/src/main/java/proguard/optimize/TailRecursionSimplifier.java
class TailRecursionSimplifier (line 41) | public class TailRecursionSimplifier
method TailRecursionSimplifier (line 65) | public TailRecursionSimplifier()
method TailRecursionSimplifier (line 76) | public TailRecursionSimplifier(InstructionVisitor extraTailRecursionVi...
method visitAnyAttribute (line 84) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 87) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitAnyInstruction (line 135) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttrib...
method visitConstantInstruction (line 142) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
method visitExceptionInfo (line 230) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribu...
class MyRecursionChecker (line 243) | private class MyRecursionChecker
method isRecursive (line 254) | public boolean isRecursive()
method visitAnyMethodrefConstant (line 261) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConst...
method visitExceptionInfo (line 269) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttri...
method storeParameters (line 282) | private void storeParameters(Clazz clazz, Method method)
FILE: base/src/main/java/proguard/optimize/TimedClassPoolVisitor.java
class TimedClassPoolVisitor (line 32) | public class TimedClassPoolVisitor
method TimedClassPoolVisitor (line 40) | public TimedClassPoolVisitor(String message, ClassVisitor classVisitor)
method TimedClassPoolVisitor (line 45) | public TimedClassPoolVisitor(String message, ClassPoolVisitor classPoo...
method visitClassPool (line 54) | public void visitClassPool(ClassPool classPool)
method getPadding (line 67) | private String getPadding(int pos, int size)
FILE: base/src/main/java/proguard/optimize/WriteOnlyFieldFilter.java
class WriteOnlyFieldFilter (line 35) | public class WriteOnlyFieldFilter
method WriteOnlyFieldFilter (line 46) | public WriteOnlyFieldFilter(MemberVisitor writeOnlyFieldVisitor)
method visitProgramField (line 54) | public void visitProgramField(ProgramClass programClass, ProgramField ...
FILE: base/src/main/java/proguard/optimize/evaluation/EvaluationShrinker.java
class EvaluationShrinker (line 48) | public class EvaluationShrinker
method EvaluationShrinker (line 115) | public EvaluationShrinker()
method EvaluationShrinker (line 136) | public EvaluationShrinker(PartialEvaluator partialEvaluator,
method EvaluationShrinker (line 162) | public EvaluationShrinker(InstructionUsageMarker instructionUsageMarker,
method visitAnyAttribute (line 176) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 179) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitCodeAttribute0 (line 215) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
class MyStaticInvocationFixer (line 330) | private class MyStaticInvocationFixer
method visitAnyInstruction (line 341) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitConstantInstruction (line 344) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
method visitAnyRefConstant (line 361) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
method visitAnyMember (line 369) | public void visitAnyMember(Clazz clazz, Member member) {}
method visitProgramMethod (line 372) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
class MyBackwardBranchFixer (line 390) | private class MyBackwardBranchFixer
method visitAnyInstruction (line 395) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method isAllSmallerThanOrEqual (line 415) | private boolean isAllSmallerThanOrEqual(InstructionOffsetValue instr...
method lastNecessaryInstructionOffset (line 445) | private int lastNecessaryInstructionOffset(int instructionOffset)
class MyNonReturningSubroutineFixer (line 464) | private class MyNonReturningSubroutineFixer
method visitAnyInstruction (line 469) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitBranchInstruction (line 472) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
class MyStackConsistencyFixer (line 497) | private class MyStackConsistencyFixer
method visitAnyInstruction (line 502) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitSimpleInstruction (line 678) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
method visitBranchInstruction (line 700) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
method visitAnySwitchInstruction (line 723) | public void visitAnySwitchInstruction(Clazz clazz, Method method, Co...
method isDupOrSwap (line 750) | private boolean isDupOrSwap(Instruction instruction)
method fixDupSwap (line 770) | private int fixDupSwap(int instructionOffset,
method fixedDup (line 789) | private int fixedDup(int instructionOffset, int topBefore, int topAf...
method fixedDup_x1 (line 808) | private int fixedDup_x1(int instructionOffset, int topBefore, int to...
method fixedDup_x2 (line 847) | private int fixedDup_x2(int instructionOffset, int topBefore, int to...
method fixedDup2 (line 939) | private int fixedDup2(int instructionOffset, int topBefore, int topA...
method fixedDup2_x1 (line 996) | private int fixedDup2_x1(int instructionOffset, int topBefore, int t...
method fixedDup2_x2 (line 1137) | private int fixedDup2_x2(int instructionOffset, int topBefore, int t...
method fixedSwap (line 1232) | private int fixedSwap(int instructionOffset, int topBefore, int topA...
method complexPop (line 1259) | private int complexPop(int popMask)
class MyInstructionDeleter (line 1278) | private class MyInstructionDeleter
method visitAnyInstruction (line 1283) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitExceptionInfo (line 1303) | public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribu...
method isAnyUnnecessaryInstructionBranchingOver (line 1320) | private boolean isAnyUnnecessaryInstructionBranchingOver(int instructi...
method isAnyLargerThan (line 1343) | private boolean isAnyLargerThan(InstructionOffsetValue instructionOffs...
method insertPushInstructions (line 1371) | private void insertPushInstructions(int offset,
method pushOpcode (line 1395) | private byte pushOpcode(int computationalType)
method insertPopInstructions (line 1415) | private void insertPopInstructions(int offset,
method insertInstruction (line 1479) | private void insertInstruction(int offset,
method insertInstructions (line 1516) | private void insertInstructions(int offset,
method replaceByStaticInvocation (line 1564) | private void replaceByStaticInvocation(Clazz clazz,
method replaceByInfiniteLoop (line 1584) | private void replaceByInfiniteLoop(Clazz clazz,
method replaceBySimpleInstructions (line 1604) | private void replaceBySimpleInstructions(int offset,
method simpleInstructions (line 1668) | private Instruction[] simpleInstructions(int opcodes)
FILE: base/src/main/java/proguard/optimize/evaluation/EvaluationSimplifier.java
class EvaluationSimplifier (line 47) | public class EvaluationSimplifier
method EvaluationSimplifier (line 70) | public EvaluationSimplifier(boolean predictNullPointerExceptions)
method EvaluationSimplifier (line 86) | public EvaluationSimplifier(PartialEvaluator partialEvaluator,
method visitAnyAttribute (line 100) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 103) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitCodeAttribute0 (line 137) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
method visitSimpleInstruction (line 168) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeAtt...
method visitVariableInstruction (line 437) | public void visitVariableInstruction(Clazz clazz, Method method, CodeA...
method visitConstantInstruction (line 498) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
method visitBranchInstruction (line 542) | public void visitBranchInstruction(Clazz clazz, Method method, CodeAtt...
method visitTableSwitchInstruction (line 563) | public void visitTableSwitchInstruction(Clazz clazz, Method method, Co...
method visitLookUpSwitchInstruction (line 587) | public void visitLookUpSwitchInstruction(Clazz clazz, Method method, C...
method replaceAnyPushInstruction (line 617) | private void replaceAnyPushInstruction(Clazz clazz,
method replaceIntegerPushInstruction (line 650) | private void replaceIntegerPushInstruction(Clazz clazz,
method replaceIntegerPushInstruction (line 665) | private void replaceIntegerPushInstruction(Clazz clazz,
method replaceLongPushInstruction (line 719) | private void replaceLongPushInstruction(Clazz clazz,
method replaceLongPushInstruction (line 734) | private void replaceLongPushInstruction(Clazz clazz,
method replaceFloatPushInstruction (line 791) | private void replaceFloatPushInstruction(Clazz clazz,
method replaceFloatPushInstruction (line 806) | private void replaceFloatPushInstruction(Clazz clazz,
method replaceDoublePushInstruction (line 862) | private void replaceDoublePushInstruction(Clazz clazz,
method replaceDoublePushInstruction (line 877) | private void replaceDoublePushInstruction(Clazz clazz,
method replaceReferencePushInstruction (line 935) | private void replaceReferencePushInstruction(Clazz clazz,
method replaceConstantPushInstruction (line 956) | private void replaceConstantPushInstruction(Clazz clazz,
method replaceVariablePushInstruction (line 973) | private void replaceVariablePushInstruction(Clazz clazz,
method replaceJsrInstruction (line 991) | private void replaceJsrInstruction(Clazz clazz,
method deleteReferencePopInstruction (line 1018) | private void deleteReferencePopInstruction(Clazz clazz,
method replaceBranchInstruction (line 1038) | private void replaceBranchInstruction(Clazz clazz,
method replaceSimpleEnumSwitchInstruction (line 1071) | private void replaceSimpleEnumSwitchInstruction(Clazz ...
method replaceSimpleEnumSwitchInstruction (line 1110) | private void replaceSimpleEnumSwitchInstruction(Clazz ...
method replaceSimpleEnumSwitchInstruction (line 1157) | private void replaceSimpleEnumSwitchInstruction(Clazz ...
method replaceSimpleEnumSwitchInstruction (line 1196) | private void replaceSimpleEnumSwitchInstruction(Clazz ...
method cleanUpSwitchInstruction (line 1245) | private void cleanUpSwitchInstruction(Clazz clazz,
method trimSwitchInstruction (line 1293) | private void trimSwitchInstruction(Clazz clazz,
method trimSwitchInstruction (line 1353) | private void trimSwitchInstruction(Clazz clazz,
method isDivisionByZero (line 1417) | private boolean isDivisionByZero(int offset, int computationType)
method isNullReference (line 1452) | private boolean isNullReference(int offset, int popStackEntryIndex)
method replaceByException (line 1466) | private void replaceByException(Clazz clazz,
method replaceByInfiniteLoop (line 1506) | private void replaceByInfiniteLoop(Clazz clazz,
method replaceInstruction (line 1535) | private void replaceInstruction(Clazz clazz,
method insertPopInstructions (line 1569) | private void insertPopInstructions(int offset, int popCount)
method replaceSimpleEnumSwitchInstruction (line 1631) | private void replaceSimpleEnumSwitchInstruction(Clazz clazz,
FILE: base/src/main/java/proguard/optimize/evaluation/InstructionUsageMarker.java
class InstructionUsageMarker (line 59) | public class InstructionUsageMarker
method InstructionUsageMarker (line 92) | public InstructionUsageMarker(boolean markExternalSideEffects)
method InstructionUsageMarker (line 104) | public InstructionUsageMarker(PartialEvaluator partialEvaluator,
method InstructionUsageMarker (line 122) | public InstructionUsageMarker(PartialEvaluator partialEvaluator,
method isTraced (line 147) | public boolean isTraced(int instructionOffset)
method tracedInstructionFilter (line 157) | public InstructionVisitor tracedInstructionFilter(InstructionVisitor i...
method tracedInstructionFilter (line 167) | public InstructionVisitor tracedInstructionFilter(boolean t...
method isInstructionNecessary (line 178) | public boolean isInstructionNecessary(int instructionOffset)
method isExtraPushPopInstructionNecessary (line 188) | public boolean isExtraPushPopInstructionNecessary(int instructionOffset)
method necessaryInstructionFilter (line 198) | public InstructionVisitor necessaryInstructionFilter(InstructionVisito...
method necessaryInstructionFilter (line 208) | public InstructionVisitor necessaryInstructionFilter(boolean ...
method getStackBefore (line 219) | public TracedStack getStackBefore(int instructionOffset)
method getStackAfter (line 229) | public TracedStack getStackAfter(int instructionOffset)
method isStackEntryUnwantedBefore (line 240) | public boolean isStackEntryUnwantedBefore(int instructionOffset,
method isStackEntriesPresentBefore (line 251) | public boolean isStackEntriesPresentBefore(int instructionOffset,
method isStackEntryPresentBefore (line 274) | public boolean isStackEntryPresentBefore(int instructionOffset,
method isStackEntriesNecessaryAfter (line 291) | public boolean isStackEntriesNecessaryAfter(int instructionOffset,
method isAnyStackEntryNecessaryAfter (line 314) | public boolean isAnyStackEntryNecessaryAfter(InstructionOffsetValue in...
method isStackEntryNecessaryAfter (line 339) | public boolean isStackEntryNecessaryAfter(int instructionOffset,
method branchTargets (line 352) | public InstructionOffsetValue branchTargets(int instructionOffset)
method visitAnyAttribute (line 360) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 363) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitCodeAttribute0 (line 394) | public void visitCodeAttribute0(Clazz clazz, Method method, CodeAttrib...
class MyParameterUsageMarker (line 577) | private class MyParameterUsageMarker
method visitAnyInstruction (line 588) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitConstantInstruction (line 591) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
method visitAnyRefConstant (line 632) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
method visitAnyMember (line 640) | public void visitAnyMember(Clazz clazz, Member member) {}
method visitProgramMethod (line 643) | public void visitProgramMethod(ProgramClass programClass, ProgramMet...
class MyInitialUsageMarker (line 657) | private class MyInitialUsageMarker
method visitAnyInstruction (line 671) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitSimpleInstruction (line 684) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
method visitConstantInstruction (line 709) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
method visitBranchInstruction (line 762) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
method visitAnyConstant (line 779) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitStringConstant (line 782) | public void visitStringConstant(Clazz clazz, StringConstant stringCo...
method visitClassConstant (line 798) | public void visitClassConstant(Clazz clazz, ClassConstant classConst...
method visitFieldrefConstant (line 814) | public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fiel...
method visitAnyMethodrefConstant (line 820) | public void visitAnyMethodrefConstant(Clazz clazz, AnyMethodrefConst...
method visitParameter (line 875) | public void visitParameter(Clazz clazz, Member member, int parameter...
method createReverseDependencies (line 900) | private void createReverseDependencies(Clazz clazz,
method createReverseDependencies (line 914) | private void createReverseDependencies(int offset,
method createReverseDependencies (line 950) | private void createReverseDependencies(int offset,
class MyProducerMarker (line 995) | private class MyProducerMarker
method visitAnyInstruction (line 1000) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitSimpleInstruction (line 1006) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
method visitVariableInstruction (line 1057) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
method visitConstantInstruction (line 1071) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
method visitBranchInstruction (line 1077) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
class MyVariableInitializationMarker (line 1099) | private class MyVariableInitializationMarker
method visitAnyInstruction (line 1104) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method visitVariableInstruction (line 1107) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
class MyStackConsistencyMarker (line 1125) | private class MyStackConsistencyMarker
method visitAnyInstruction (line 1130) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
class MyExtraPushPopInstructionMarker (line 1156) | private class MyExtraPushPopInstructionMarker
method visitAnyInstruction (line 1161) | public void visitAnyInstruction(Clazz clazz, Method method, CodeAttr...
method markVariableProducers (line 1201) | private void markVariableProducers(int consumerOffset,
method markVariableInitializersBefore (line 1236) | private InstructionOffsetValue markVariableInitializersBefore(int ...
method markVariableInitializersAfter (line 1286) | private InstructionOffsetValue markVariableInitializersAfter(int ...
method markStackProducers (line 1324) | private void markStackProducers(Clazz clazz,
method conditionallyMarkStackEntryProducers (line 1352) | private void conditionallyMarkStackEntryProducers(int consumerOffset,
method markStackEntryProducers (line 1376) | private void markStackEntryProducers(int consumerOffset,
method markStackEntryProducers (line 1398) | private void markStackEntryProducers(InstructionOffsetValue producerOf...
method markReverseDependencies (line 1438) | private void markReverseDependencies(int instructionOffset)
method markStraddlingBranches (line 1460) | private void markStraddlingBranches(int instruction...
method markStraddlingBranch (line 1493) | private void markStraddlingBranch(int instructionOffsetStart,
method initializeNecessary (line 1512) | private void initializeNecessary(CodeAttribute codeAttribute)
method isVariableInitialization (line 1564) | private boolean isVariableInitialization(int instructionOffset,
method markStackEntryAfter (line 1602) | private void markStackEntryAfter(int instructionOffset,
method markStackEntryUnwantedBefore (line 1626) | private void markStackEntryUnwantedBefore(int instructionOffset,
method markInstructions (line 1637) | private void markInstructions(InstructionOffsetValue instructionOffsets)
method markInstruction (line 1652) | private void markInstruction(int instructionOffset)
method markExtraPushPopInstruction (line 1673) | private void markExtraPushPopInstruction(int instructionOffset)
method isAnyInstructionNecessary (line 1699) | private boolean isAnyInstructionNecessary(int startInstructionOffset,
class MyNecessaryInstructionFilter (line 1722) | private class MyNecessaryInstructionFilter implements InstructionVisitor
method MyNecessaryInstructionFilter (line 1728) | public MyNecessaryInstructionFilter(boolean necessary,
method visitSimpleInstruction (line 1738) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeA...
method visitVariableInstruction (line 1747) | public void visitVariableInstruction(Clazz clazz, Method method, Cod...
method visitConstantInstruction (line 1756) | public void visitConstantInstruction(Clazz clazz, Method method, Cod...
method visitBranchInstruction (line 1765) | public void visitBranchInstruction(Clazz clazz, Method method, CodeA...
method visitTableSwitchInstruction (line 1774) | public void visitTableSwitchInstruction(Clazz clazz, Method method, ...
method visitLookUpSwitchInstruction (line 1783) | public void visitLookUpSwitchInstruction(Clazz clazz, Method method,...
method shouldVisit (line 1798) | private boolean shouldVisit(int offset)
FILE: base/src/main/java/proguard/optimize/evaluation/LoadingInvocationUnit.java
class LoadingInvocationUnit (line 35) | public class LoadingInvocationUnit
method LoadingInvocationUnit (line 46) | public LoadingInvocationUnit(ValueFactory valueFactory)
method LoadingInvocationUnit (line 56) | public LoadingInvocationUnit(ValueFactory valueFactory,
method getFieldClassValue (line 71) | @Override
method getFieldValue (line 95) | @Override
method getMethodParameterValue (line 119) | @Override
method getMethodReturnValue (line 144) | @Override
FILE: base/src/main/java/proguard/optimize/evaluation/ParameterTracingInvocationUnit.java
class ParameterTracingInvocationUnit (line 42) | public class ParameterTracingInvocationUnit
method ParameterTracingInvocationUnit (line 57) | public ParameterTracingInvocationUnit(SimplifiedInvocationUnit invocat...
method setMethodParameterValue (line 65) | @Override
method getMethodReturnValue (line 74) | @Override
method mayReturnType (line 156) | private boolean mayReturnType(Clazz clazz,
FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumArrayPropagator.java
class SimpleEnumArrayPropagator (line 38) | public class SimpleEnumArrayPropagator
method visitAnyClass (line 55) | @Override
method visitProgramClass (line 59) | @Override
method visitProgramField (line 77) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 83) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method setMethodReturnValue (line 105) | private static void setMethodReturnValue(Method method, Value value)
FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumClassChecker.java
class SimpleEnumClassChecker (line 49) | public class SimpleEnumClassChecker
method visitAnyClass (line 65) | @Override
method visitProgramClass (line 69) | @Override
class MemberCollectionFilter (line 99) | private static class MemberCollectionFilter
method MemberCollectionFilter (line 114) | public MemberCollectionFilter(Set<Member> members,
method MemberCollectionFilter (line 129) | public MemberCollectionFilter(Set<Member> members,
method visitAnyMember (line 141) | public void visitAnyMember(Clazz clazz, Member member)
method delegateVisitor (line 153) | private MemberVisitor delegateVisitor(Member member)
FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumClassSimplifier.java
class SimpleEnumClassSimplifier (line 41) | public class SimpleEnumClassSimplifier
method visitAnyClass (line 152) | @Override
method visitProgramClass (line 156) | @Override
method visitAnyAttribute (line 181) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 184) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumDescriptorSimplifier.java
class SimpleEnumDescriptorSimplifier (line 45) | public class SimpleEnumDescriptorSimplifier
method visitAnyClass (line 60) | @Override
method visitProgramClass (line 64) | @Override
method visitAnyConstant (line 83) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitStringConstant (line 86) | public void visitStringConstant(Clazz clazz, StringConstant stringCons...
method visitInvokeDynamicConstant (line 112) | public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConst...
method visitClassConstant (line 135) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
method visitMethodTypeConstant (line 161) | public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant me...
method visitProgramField (line 186) | public void visitProgramField(ProgramClass programClass, ProgramField ...
method visitProgramMethod (line 234) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitAnyAttribute (line 292) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitCodeAttribute (line 295) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitLocalVariableTableAttribute (line 302) | public void visitLocalVariableTableAttribute(Clazz clazz, Method metho...
method visitLocalVariableTypeTableAttribute (line 309) | public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method m...
method visitSignatureAttribute (line 316) | public void visitSignatureAttribute(Clazz clazz, SignatureAttribute si...
method visitLocalVariableInfo (line 338) | public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAtt...
method visitLocalVariableTypeInfo (line 358) | public void visitLocalVariableTypeInfo(Clazz clazz, Method method, Cod...
method simplifyDescriptor (line 387) | private String simplifyDescriptor(String descriptor,
method simplifyDescriptor (line 399) | private String simplifyDescriptor(String descriptor,
method simplifyReferencedClasses (line 601) | private Clazz[] simplifyReferencedClasses(String descriptor,
method isSimpleEnum (line 790) | private boolean isSimpleEnum(Clazz clazz)
FILE: base/src/main/java/proguard/optimize/evaluation/SimpleEnumUseChecker.java
class SimpleEnumUseChecker (line 46) | public class SimpleEnumUseChecker
method SimpleEnumUseChecker (line 72) | public SimpleEnumUseChecker()
method SimpleEnumUseChecker (line 83) | public SimpleEnumUseChecker(PartialEvaluator partialEvaluator)
method visitAnyClass (line 91) | @Override
method visitProgramClass (line 95) | @Override
method visitAnyAttribute (line 116) | public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
method visitBootstrapMethodsAttribute (line 119) | public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMetho...
method visitCodeAttribute (line 126) | public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribu...
method visitBootstrapMethodInfo (line 157) | public void visitBootstrapMethodInfo(Clazz clazz, BootstrapMethodInfo ...
method visitAnyConstant (line 169) | public void visitAnyConstant(Clazz clazz, Constant constant) {}
method visitStringConstant (line 172) | public void visitStringConstant(Clazz clazz, StringConstant stringCons...
method visitMethodHandleConstant (line 179) | public void visitMethodHandleConstant(Clazz clazz, MethodHandleConstan...
method visitMethodTypeConstant (line 187) | public void visitMethodTypeConstant(Clazz clazz, MethodTypeConstant me...
method visitAnyRefConstant (line 194) | public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
method visitClassConstant (line 201) | public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
method visitSimpleInstruction (line 210) | public void visitSimpleInstruction(Clazz clazz, Method method, CodeAtt...
method visitVariableInstruction (line 275) | public void visitVariableInstruction(Clazz clazz, Method method, CodeA...
method visitConstantInstruction (line 280) | public void visitConstantInstruction(Clazz clazz, Method method, CodeA...
method visitBranchInstruction (line 390) | public void visitBranchInstruction(Clazz clazz, Method method, CodeAtt...
method visitAnySwitchInstruction (line 432) | public void visitAnySwitchInstruction(Clazz clazz, Method method, Code...
method visitLibraryMethod (line 439) | public void visitLibraryMethod(LibraryClass libraryClass, LibraryMetho...
method visitProgramMethod (line 442) | public void visitProgramMethod(ProgramClass programClass, ProgramMetho...
method visitParameter (line 461) | public void visitParameter(Clazz clazz, Member member, int parameterIn...
method isSupportedMethod (line 491) | private boolean isSupportedMethod(String name, String type)
method isUnsupportedMethod (line 504) | private boolean isUnsupportedMethod(String name, String type)
method isMethodSki
Condensed preview — 690 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,931K chars).
[
{
"path": ".editorconfig",
"chars": 59,
"preview": "root = true\n\n[*.java]\nindent_style = space\nindent_size = 4\n"
},
{
"path": ".gitattributes",
"chars": 32,
"preview": "gradlew -text\ngradlew.bat -text\n"
},
{
"path": ".github/scripts/s3-deploy.py",
"chars": 5153,
"preview": "#!/usr/bin/env python3\nimport sys\nimport os\nimport logging\nimport pathlib\nfrom mako.template import Template\nfrom enum i"
},
{
"path": ".github/workflows/continuous_integration.yml",
"chars": 881,
"preview": "name: Continuous Integration\non:\n pull_request:\n branches:\n - skip\n - skip\n push:\n branches:\n - s"
},
{
"path": ".github/workflows/main.yml",
"chars": 1119,
"preview": "name: 'dProtect Main'\non: [push, workflow_dispatch]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: "
},
{
"path": ".gitignore",
"chars": 68,
"preview": ".gradle\n.hg/**\n.hgtags\n.idea\nbuild\nlocal.properties\n/lib/\ndocs/html\n"
},
{
"path": ".hgignore",
"chars": 20,
"preview": "syntax: glob\n.git/*\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 10182,
"preview": "# Contributing to ProGuard\n\nThank you for contributing!\n\n- You can report issues on our [issue tracker](issues) on GitHu"
},
{
"path": "LICENSE",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "README.md",
"chars": 2821,
"preview": "<p align=\"center\">\n <br />\n <br />\n <a href=\"https://obfuscator.re/dprotect\">\n <img src=\".github/img/banner.webp\" "
},
{
"path": "annotations/annotations.pro",
"chars": 3714,
"preview": "#\n# This ProGuard configuration file specifies how annotations can be used\n# to configure the processing of other code.\n"
},
{
"path": "annotations/build.gradle",
"chars": 555,
"preview": "plugins {\n id 'java'\n id 'maven-publish'\n}\n\nsourceSets.main {\n java {\n srcDirs = ['src']\n }\n resou"
},
{
"path": "annotations/src/proguard/annotation/Keep.java",
"chars": 494,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepApplication.java",
"chars": 437,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepClassMemberNames.java",
"chars": 463,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepClassMembers.java",
"chars": 468,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepGettersSetters.java",
"chars": 476,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepImplementations.java",
"chars": 443,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepName.java",
"chars": 498,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicClassMemberNames.java",
"chars": 476,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicClassMembers.java",
"chars": 481,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicGettersSetters.java",
"chars": 489,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicImplementations.java",
"chars": 456,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java",
"chars": 498,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java",
"chars": 506,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n */\npackage"
},
{
"path": "ant/build.gradle",
"chars": 1251,
"preview": "import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\n\nplugins {\n id 'com.github.johnrengelman.shadow'\n "
},
{
"path": "ant/src/proguard/ant/ClassPathElement.java",
"chars": 5814,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/ClassSpecificationElement.java",
"chars": 8683,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/ConfigurationElement.java",
"chars": 4249,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/ConfigurationTask.java",
"chars": 19098,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/FilterElement.java",
"chars": 2437,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/KeepSpecificationElement.java",
"chars": 3642,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/MemberSpecificationElement.java",
"chars": 11962,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/ProGuardTask.java",
"chars": 10220,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "ant/src/proguard/ant/package.html",
"chars": 64,
"preview": "<body>\nThis package contains the Ant task for ProGuard.\n</body>\n"
},
{
"path": "ant/src/proguard/ant/task.properties",
"chars": 105,
"preview": "proguard = proguard.ant.ProGuardTask\nproguardconfiguration = proguard.ant.ConfigurationTask\n"
},
{
"path": "base/build.gradle",
"chars": 3330,
"preview": "plugins {\n id 'java-library'\n id 'java-test-fixtures'\n id 'maven-publish'\n id \"org.jetbrains.kotlin.jvm\" ver"
},
{
"path": "base/src/main/java/dprotect/ArithmeticObfuscationClassSpecification.java",
"chars": 1135,
"preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class ArithmeticObfuscationClassSpecification extends Obfu"
},
{
"path": "base/src/main/java/dprotect/CFObfuscationClassSpecification.java",
"chars": 838,
"preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class CFObfuscationClassSpecification extends ObfuscationC"
},
{
"path": "base/src/main/java/dprotect/ClassObfuSpecVisitorFactory.java",
"chars": 1869,
"preview": "package dprotect;\n\nimport proguard.ClassSpecificationVisitorFactory;\n\nimport proguard.classfile.visitor.*;\n\nimport java."
},
{
"path": "base/src/main/java/dprotect/Configuration.java",
"chars": 1716,
"preview": "package dprotect;\n\nimport proguard.ClassSpecification;\n\nimport java.util.*;\n\n\n/**\n * The extended dProtect configuration"
},
{
"path": "base/src/main/java/dprotect/ConfigurationConstants.java",
"chars": 1052,
"preview": "package dprotect;\n\npublic class ConfigurationConstants extends proguard.ConfigurationConstants\n{\n public static final"
},
{
"path": "base/src/main/java/dprotect/ConfigurationParser.java",
"chars": 28034,
"preview": "package dprotect;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n\nimport proguard."
},
{
"path": "base/src/main/java/dprotect/ConstantObfuscationClassSpecification.java",
"chars": 868,
"preview": "package dprotect;\nimport proguard.ClassSpecification;\n\npublic class ConstantObfuscationClassSpecification extends Obfusc"
},
{
"path": "base/src/main/java/dprotect/DProtect.java",
"chars": 19039,
"preview": "package dprotect;\n\nimport dprotect.obfuscation.CodeObfuscator;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.a"
},
{
"path": "base/src/main/java/dprotect/ObfuscationClassSpecification.java",
"chars": 1183,
"preview": "package dprotect;\nimport proguard.ClassSpecification;\n\n\npublic class ObfuscationClassSpecification extends ClassSpecific"
},
{
"path": "base/src/main/java/dprotect/deobfuscation/Deobfuscator.java",
"chars": 3048,
"preview": "package dprotect.deobfuscation;\n\nimport dprotect.Configuration;\nimport dprotect.obfuscation.arithmetic.*;\nimport dprotec"
},
{
"path": "base/src/main/java/dprotect/deobfuscation/strings/XoredStrings.java",
"chars": 5328,
"preview": "package dprotect.deobfuscation.strings;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Log"
},
{
"path": "base/src/main/java/dprotect/obfuscation/CodeObfuscator.java",
"chars": 12451,
"preview": "package dprotect.obfuscation;\n\nimport dprotect.Configuration;\nimport dprotect.obfuscation.arithmetic.*;\nimport dprotect."
},
{
"path": "base/src/main/java/dprotect/obfuscation/Marker.java",
"chars": 3796,
"preview": "package dprotect.obfuscation;\n\nimport dprotect.ClassObfuSpecVisitorFactory;\nimport dprotect.Configuration;\nimport dprote"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationFilter.java",
"chars": 1509,
"preview": "package dprotect.obfuscation.arithmetic;\nimport dprotect.obfuscation.info.ObfuscationInfo;\nimport static dprotect.Obfusc"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationInfo.java",
"chars": 317,
"preview": "package dprotect.obfuscation.arithmetic;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Arith"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/ArithmeticObfuscationMarker.java",
"chars": 1805,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport dprotect.ArithmeticObfuscationClassSpecification;\nimport dprotect.Obfus"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBANormalizer.java",
"chars": 2427,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAdd.java",
"chars": 9211,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationAnd.java",
"chars": 4208,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationOr.java",
"chars": 5494,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationSub.java",
"chars": 5104,
"preview": "package dprotect.obfuscation.arithmetic;\n\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*"
},
{
"path": "base/src/main/java/dprotect/obfuscation/arithmetic/MBAObfuscationXor.java",
"chars": 5561,
"preview": "package dprotect.obfuscation.arithmetic;\n\nimport proguard.classfile.constant.*;\nimport proguard.classfile.instruction.*;"
},
{
"path": "base/src/main/java/dprotect/obfuscation/constants/ConstantFieldMarker.java",
"chars": 1714,
"preview": "package dprotect.obfuscation.constants;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.lo"
},
{
"path": "base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationInfo.java",
"chars": 268,
"preview": "package dprotect.obfuscation.constants;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Consta"
},
{
"path": "base/src/main/java/dprotect/obfuscation/constants/ConstantObfuscationMarker.java",
"chars": 2132,
"preview": "package dprotect.obfuscation.constants;\n\nimport dprotect.ConstantObfuscationClassSpecification;\nimport dprotect.Obfuscat"
},
{
"path": "base/src/main/java/dprotect/obfuscation/constants/ConstantsObfuscator.java",
"chars": 11023,
"preview": "package dprotect.obfuscation.constants;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Random;\n"
},
{
"path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscation.java",
"chars": 14278,
"preview": "package dprotect.obfuscation.controlflow;\n\nimport java.util.Random;\nimport java.util.ArrayList;\nimport java.util.HashMap"
},
{
"path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationInfo.java",
"chars": 276,
"preview": "package dprotect.obfuscation.controlflow;\nimport static dprotect.ObfuscationClassSpecification.Level;\n\npublic class Cont"
},
{
"path": "base/src/main/java/dprotect/obfuscation/controlflow/ControlFlowObfuscationMarker.java",
"chars": 2146,
"preview": "package dprotect.obfuscation.controlflow;\n\nimport dprotect.CFObfuscationClassSpecification;\nimport dprotect.ObfuscationC"
},
{
"path": "base/src/main/java/dprotect/obfuscation/info/ObfuscationInfo.java",
"chars": 1718,
"preview": "package dprotect.obfuscation.info;\n\nimport dprotect.obfuscation.arithmetic.ArithmeticObfuscationInfo;\nimport dprotect.ob"
},
{
"path": "base/src/main/java/dprotect/obfuscation/info/ObfuscationInfoSetter.java",
"chars": 1907,
"preview": "package dprotect.obfuscation.info;\n\nimport proguard.classfile.*;\nimport proguard.classfile.constant.visitor.ConstantVisi"
},
{
"path": "base/src/main/java/dprotect/obfuscation/strings/StringFieldMarker.java",
"chars": 2414,
"preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.log4"
},
{
"path": "base/src/main/java/dprotect/obfuscation/strings/StringObfuscationMarker.java",
"chars": 1393,
"preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\n\nimport org.apache.logging.log4"
},
{
"path": "base/src/main/java/dprotect/obfuscation/strings/StringObfuscator.java",
"chars": 10200,
"preview": "package dprotect.obfuscation.strings;\n\nimport dprotect.obfuscation.info.ObfuscationInfo;\nimport dprotect.runtime.strings"
},
{
"path": "base/src/main/java/dprotect/runtime/strings/StringEncoding.java",
"chars": 4264,
"preview": "package dprotect.runtime.strings;\nimport java.lang.reflect.Method;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimp"
},
{
"path": "base/src/main/java/dprotect/runtime/util/Helpers.java",
"chars": 185,
"preview": "package dprotect.runtime.util;\n\npublic class Helpers {\n public static String getNormalizedClassName(Class cls)\n {\n"
},
{
"path": "base/src/main/java/dprotect/runtime/util/Loader.java",
"chars": 1309,
"preview": "package dprotect.runtime.util;\n\nimport proguard.classfile.*;\nimport proguard.io.*;\nimport proguard.classfile.visitor.*;\n"
},
{
"path": "base/src/main/java/proguard/AfterInitConfigurationVerifier.java",
"chars": 2986,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/AppView.java",
"chars": 1614,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ArgumentWordReader.java",
"chars": 2792,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/AssumeNoSideEffectsChecker.java",
"chars": 3888,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ClassMemberChecker.java",
"chars": 6229,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ClassPath.java",
"chars": 2352,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ClassPathEntry.java",
"chars": 12052,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ClassSpecification.java",
"chars": 11588,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ClassSpecificationVisitorFactory.java",
"chars": 30631,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/Configuration.java",
"chars": 15958,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ConfigurationConstants.java",
"chars": 10208,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ConfigurationParser.java",
"chars": 93005,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ConfigurationVerifier.java",
"chars": 10436,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ConfigurationWriter.java",
"chars": 32956,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/DataEntryReaderFactory.java",
"chars": 10749,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/DataEntryWriterFactory.java",
"chars": 24104,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/DescriptorKeepChecker.java",
"chars": 6341,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/Dumper.java",
"chars": 1245,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/DuplicateClassPrinter.java",
"chars": 2264,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/DuplicateResourceFilePrinter.java",
"chars": 2168,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/FileWordReader.java",
"chars": 1819,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/FullyQualifiedClassNameChecker.java",
"chars": 6783,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/GPL.java",
"chars": 6782,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/GetAnnotationChecker.java",
"chars": 2886,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/GetEnclosingClassChecker.java",
"chars": 2563,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/GetEnclosingMethodChecker.java",
"chars": 2572,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/GetSignatureChecker.java",
"chars": 2694,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/Initializer.java",
"chars": 31447,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/InputReader.java",
"chars": 12029,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/KeepClassMemberChecker.java",
"chars": 3213,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/KeepClassSpecification.java",
"chars": 8361,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/KeepClassSpecificationVisitorFactory.java",
"chars": 13585,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/KotlinMetadataAdapter.java",
"chars": 1194,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/LibraryKeepChecker.java",
"chars": 4639,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/LineWordReader.java",
"chars": 2384,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/MemberSpecification.java",
"chars": 4788,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/MemberValueSpecification.java",
"chars": 3797,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/OutputWriter.java",
"chars": 23742,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ParseException.java",
"chars": 1625,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/ProGuard.java",
"chars": 19060,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/SeedPrinter.java",
"chars": 3774,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/SubclassedClassFilter.java",
"chars": 2026,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/Targeter.java",
"chars": 3156,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/UpToDateChecker.java",
"chars": 8189,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/WordReader.java",
"chars": 12365,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/AbstractAPIConverter.java",
"chars": 33178,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/Backporter.java",
"chars": 16103,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/DefaultInterfaceMethodConverter.java",
"chars": 12818,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/JSR310Converter.java",
"chars": 2542,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/LambdaExpression.java",
"chars": 7996,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/LambdaExpressionCollector.java",
"chars": 9495,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/LambdaExpressionConverter.java",
"chars": 47172,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/StaticInterfaceMethodConverter.java",
"chars": 9944,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/StreamSupportConverter.java",
"chars": 19404,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/backport/StringConcatenationConverter.java",
"chars": 16195,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/classfile/ClassMemberPair.java",
"chars": 2087,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/classfile/pass/PrimitiveArrayConstantIntroducer.java",
"chars": 618,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/classfile/visitor/InjectedClassFilter.java",
"chars": 2510,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/ConfigurationLogger.java",
"chars": 46054,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/ConfigurationLoggingAdder.java",
"chars": 6306,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceConstants.java",
"chars": 11614,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequenceReplacer.java",
"chars": 5990,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/ConfigurationLoggingInstructionSequencesReplacer.java",
"chars": 7960,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/configuration/InitialStateInfo.java",
"chars": 4651,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/evaluation/AssumeClassSpecificationVisitorFactory.java",
"chars": 5080,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationCounter.java",
"chars": 4529,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/fixer/kotlin/KotlinAnnotationFlagFixer.java",
"chars": 14245,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/io/ClassMapDataEntryReplacer.java",
"chars": 11228,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/io/ExtraDataEntryNameMap.java",
"chars": 6154,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/io/ExtraDataEntryReader.java",
"chars": 6137,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/io/KotlinModuleRewriter.java",
"chars": 5704,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/io/UniqueDataEntryWriter.java",
"chars": 2221,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/logging/Logging.java",
"chars": 806,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/mark/Marker.java",
"chars": 19021,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/AttributeShrinker.java",
"chars": 4253,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/AttributeUsageMarker.java",
"chars": 2142,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ClassNameAdapterFunction.java",
"chars": 5278,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ClassObfuscator.java",
"chars": 23330,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ClassRenamer.java",
"chars": 5384,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/DictionaryNameFactory.java",
"chars": 9772,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MapCleaner.java",
"chars": 1470,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MappingKeeper.java",
"chars": 7289,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MappingPrinter.java",
"chars": 18279,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MappingProcessor.java",
"chars": 3751,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MappingReader.java",
"chars": 9242,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MemberNameCleaner.java",
"chars": 1909,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MemberNameCollector.java",
"chars": 3641,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MemberNameConflictFixer.java",
"chars": 6588,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MemberObfuscator.java",
"chars": 6717,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MemberSpecialNameFilter.java",
"chars": 3069,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/MultiMappingProcessor.java",
"chars": 4138,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NameFactory.java",
"chars": 1146,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NameFactoryResetter.java",
"chars": 1572,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NameMarker.java",
"chars": 4966,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NameObfuscationReferenceFixer.java",
"chars": 1231,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NewMemberNameFilter.java",
"chars": 3391,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/NumericNameFactory.java",
"chars": 1286,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ObfuscationPreparation.java",
"chars": 1602,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/Obfuscator.java",
"chars": 36396,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/OriginalClassNameFilter.java",
"chars": 2610,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ParameterNameMarker.java",
"chars": 4626,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/PrefixingNameFactory.java",
"chars": 1812,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/RenamedFlagSetter.java",
"chars": 2337,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ResourceFileNameAdapter.java",
"chars": 1021,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ResourceFileNameObfuscator.java",
"chars": 4207,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/ResourceJavaReferenceFixer.java",
"chars": 2094,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/SimpleNameFactory.java",
"chars": 4448,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/SourceFileRenamer.java",
"chars": 2790,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/SpecialNameFactory.java",
"chars": 2216,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/UniqueMemberNameFactory.java",
"chars": 3003,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasNameObfuscator.java",
"chars": 3101,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinAliasReferenceFixer.java",
"chars": 2396,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinCallableReferenceFixer.java",
"chars": 10734,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinCompanionEqualizer.java",
"chars": 2596,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultImplsMethodNameEqualizer.java",
"chars": 1797,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinDefaultMethodNameEqualizer.java",
"chars": 1845,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinIntrinsicsReplacementSequences.java",
"chars": 8665,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleFixer.java",
"chars": 11311,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinModuleNameObfuscator.java",
"chars": 1648,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinMultiFileFacadeFixer.java",
"chars": 2991,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinObjectFixer.java",
"chars": 2588,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyNameObfuscator.java",
"chars": 3082,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinPropertyRenamer.java",
"chars": 1808,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSourceDebugExtensionAttributeObfuscator.java",
"chars": 2604,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticClassFixer.java",
"chars": 4268,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
},
{
"path": "base/src/main/java/proguard/obfuscate/kotlin/KotlinSyntheticToStringObfuscator.java",
"chars": 10078,
"preview": "/*\n * ProGuard -- shrinking, optimization, obfuscation, and preverification\n * of Java bytecode.\n *\n * Copyr"
}
]
// ... and 490 more files (download for full content)
About this extraction
This page contains the full source code of the open-obfuscator/dProtect GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 690 files (4.5 MB), approximately 1.2M tokens, and a symbol index with 4392 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.