5

Apache の httpclient lib を再パッケージ化して、Android アプリ ( https://code.google.com/p/httpclientandroidlib/のように HttpClient 4.3.1 を使用)に同梱したいと考えています。

したがって、 httpclient 4.3.1 jar (すべての依存関係を含む) を手動でダウンロードし、jarjar を使用して再パッケージ化しました。

x@x$: cd libs && for f in *.jar; do java -jar ../jarjar-1.4.jar process ../rules.txt $f out/my-$f; done

rules.txtを使用:

 rule org.apache.http.** my.repackaged.org.apache.http.@1

次に、ant を使用して出力をまとめました。

<project name="MyProject" default="merge" basedir=".">
  <target name="merge">
        <zip destfile="my-org-apache-httpclient-4.3.1.jar">
            <zipgroupfileset dir="libs/out" includes="*.jar"/>
        </zip>
  </target>
</project>

そのファイルを使用してアプリを開発およびテストできますが、それを Android にデプロイするとmy.repackaged.org.apache.logging.log4j.somethingmy.package.org.apache.logging.whatEver.

そこで、バイトコード操作を使用して、commons-logging への依存関係を取り除きたいと思います。これは以前に行われました: http://sixlegs.com/blog/java/dependency-killer.html

しかし、私は実際にどのようにそれを行うのだろうか?org.apache.commons.logging.Log への依存関係のみがあります。

x$x$: java -jar jarjar-1.4.jar find jar my-org-apache-httpclient-4.3.1.jar commons-logging-1.1.3.jar
my/http/impl/execchain/ServiceUnavailableRetryExec -> org/apache/commons/logging/Log
my/http/impl/execchain/RetryExec -> org/apache/commons/logging/Log
my/http/impl/execchain/RedirectExec -> org/apache/commons/logging/Log
my/http/impl/execchain/ProtocolExec -> org/apache/commons/logging/Log
...

私は、これらの依存関係を削除し、彼がここで行ったように独自の実装に置き換えることだと思いますhttps://code.google.com/p/httpclientandroidlib/providedしたがって、 org.apache.commons.logging.Log インターフェイスを実装し、単に dedefates する commons-logging のスコープを持つクラスが 1 つだけの新しい Maven プロジェクトを作成しましたandroid.utils.Log

MyLog implements org.apache.commons.logging.Log {}

パッケージmy.logに入れ、それを my-log-1.0.0.jar にパッケージ化しました。その jar を再パッケージ化された httpclient-jars と同じフォルダーに配置し、上記のように ant を使用して my-org-apache-httpclient-4.3.1.jar にまとめてパッケージ化しました。


アプローチ1

私は再びjarjarを使用しようとしました:

java -jar jarjar-1.4.jar process rules2.txt my-org-apache-httpclient-4.3.1.jar my-org-apache-httpclient-4.3.1-without-logging-dep.jar

rules2.txtを使用:

rule my.repackaged.commons.logging.** my.log.@1

しかし、それは機能しません。my.repackaged.org.apache.logging.log4j.something参照先が見つからないという例外my.package.org.apache.logging.whatEverは引き続きスローされます。


アプローチ 2

また、最終的な jar からログ記録を削除するか、my.repackaged.org.apache.log4j を再パッケージ化して元のパッケージにログを記録しようとしました。

rules2.txt v2 :

rule my.repackaged.org.apache.log4j.** org.apache.log4j.@1
rule my.repackaged.org.apache.logging.** org.apache.logging.@1

しかし、それはまだ例外を投げています:my.repackaged.org.apache.logging.log4j.somethingによって参照されていますmy.package.org.apache.logging.whatEver


質問

commons-logging の依存関係を強制終了/置換して、例外を取り除くにはどうすればよいですか?

4

1 に答える 1