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.something
、my.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 の依存関係を強制終了/置換して、例外を取り除くにはどうすればよいですか?