1

ProGuard を使用して Java アプリを難読化しようとしていますが、特定のトピックに問題があります。

私のアプリは Java 1.7、GUI 用の Valkyrie RCP、Bean コンテナー用の spring 3.1.3、データベース通信用の spring JDBC を使用しているため、spring には GUI ビューから jdbc の daos までのすべてのオブジェクトが含まれています。

ProGuard 5.1 でコードを難読化すると、Spring で Bean をインスタンス化する際に問題が発生します。私は ant ターゲットを使用しています。コードは次のとおりです。

<proguard
          optimize="false"
          shrink="false"
          obfuscate="true"
          allowaccessmodification="false"
          usemixedcaseclassnames="false"
          skipnonpubliclibraryclasses="false"
          printseeds="obfuscateseeds.txt"
          printusage="obfuscateusage.txt"
          printmapping="obfuscatemapping.txt">

  <keepattribute name="*Annotation*"/>

  <injar name="${proj.output}/app/lib/myjar.jar"/>
  <outjar name="${proj.output}/app/lib/myjar-ofuscated.jar"/>

  <keep name="com.myjar.Main">
    <method name="main"/>
  </keep>

  <libraryjar name="${env.JAVA_HOME}/jre/lib/rt.jar"/>
  ...

</proguard>

私は多くの構成クラスを持っており、プロガードはそれらを非常にうまく使用していますが、それらの一部がインスタンス化される瞬間に、間違ったメソッドが呼び出されます。たとえば、私のメインの構成オブジェクトは次のようになります。

@Configuration
@EnableTransactionManagement
@Import({ RulesContext.class })
public class MainContext implements ApplicationConfig{

    @Autowired private RulesContext rulesContext;

    @Bean public AnnotationBeanConfigurerAspect annotationBeanConfigurerAspect(){
        logger.debug("annotationBeanConfigurerAspect");

        return AnnotationBeanConfigurerAspect.aspectOf();
    }

    /* lot of methods between */

    @Bean @Override public RulesSource rulesSource() {
        logger.debug("rulesSource");
        DefaultRulesSource rules = new DefaultRulesSource();
        rules.addRules(rulesContext.enterpriseRules());
        rules.addRules(rulesContext.coinRules());
        rules.addRules(rulesContext.bankRules());
    }

    /* lot of methods after */
}

難読化されると、結果は次のようになります。

@Configuration
@EnableTransactionManagement
@Import({o.class})
public class b
  implements ApplicationConfig
{
  @Autowired
  private o f;

  @Bean
  public AnnotationBeanConfigurerAspect a()
  {
    this.a.debug("annotationBeanConfigurerAspect");
    return AnnotationBeanConfigurerAspect.aspectOf();
  }

  @Bean
  public RulesSource rulesSource()
  {
    this.a.debug("rulesSource");
    DefaultRulesSource localDefaultRulesSource = new DefaultRulesSource();
    localDefaultRulesSource.addRules(this.f.a());
    localDefaultRulesSource.addRules(this.f.b());
    localDefaultRulesSource.addRules(this.f.c());
  }
}

アプリを実行すると、例外がスローされます。

org.springframework.beans.factory.BeanCreationException: クラス com.myjar.jb で定義された「rulesSource」という名前の Bean の作成中にエラーが発生しました: Bean のインスタンス化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanDefinitionStoreException: ファクトリ メソッド [パブリック org.valkyriercp.rules.RulesSource com.myjar.jbrulesSource()] が例外をスローしました。ネストされた例外は java.lang.ClassCastException: org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect は com.myjar.ngbb にキャストできません

オブジェクト com.myjar.ngbb (難読化前の RulesContext) には、適切な RulesObject を返すメソッド a() がありますが、何らかの理由で、難読化された RulesContext オブジェクトのメソッド a() は呼び出されませんが、代わりに b オブジェクト (MainContext) を使用します。したがって、b (MainContext) オブジェクトのメソッド a() は AnnotationBeanConfigurerAspect オブジェクトを返しますが、これは Rules オブジェクトではないため例外です。

すべてのSpring構成オブジェクトを含むパッケージの難読化を回避すると、プログラムは非常にうまく動作します。問題が存在する場合、それは単なる難読化です。

同様の問題に遭遇した人はいますか?どのように解決しますか?または、何が起こっているかについての手がかりはありますか?

お時間をいただきありがとうございます

4

0 に答える 0