Androidプロジェクトをビルドする:ジャンクファイルを排除する

最初のAndroidプロジェクトを終えて、リリースをビルドする際に十分な柔軟性がないという問題に遭遇しました。



最初は、antはアセンブリに使用されることになっています。 プロジェクトを作成するとき、プラットフォームはbuild.xmlを親切に作成します。 原則として、設定全体は、local.propertiesファイルでAndroid-SDKへのパスを指定することで構成されます。 また、そこにkey.storeおよびkey.aliasパラメーターを指定して、アプリケーションがアセンブリ中に自動的に署名するようにすることもできます。 アセンブリプロセス中にキーに提案されたパスワードはシェルにログインされるため、Googleはドキュメントでこれを行うことを推奨していません。



しかし、アセンブリ中に何か特別なことをする必要がある場合はどうでしょうか? 私の場合、 asset / testフォルダーにある最終パッケージからいくつかのファイルを除外する必要がありました。 これらのファイルには、認証用のWebサービスとデータをテストするためのパスが格納されます。 最終アプリケーションにそれらを含める必要はまったくありません。 単純さにもかかわらず、解決策はすぐには見つかりませんでした。 問題は、ドキュメントの量が少ないことです。 将来の時間を節約するために、中を見ることをお勧めします。





build.xmlの内部を見ると、そこにあるカスタマイズ用のコメントアウトされた要素を見つけることができます:



 <!-- extension targets. Uncomment the ones where you want to do custom work in between standard targets --> <!-- <target name="-pre-build"> </target> <target name="-pre-compile"> </target> [This is typically used for code obfuscation. Compiled code location: ${out.classes.absolute.dir} If this is not done in place, override ${out.dex.input.absolute.dir}] <target name="-post-compile"> </target> -->
      
      







命令が来た後



<setup />







SDK / tools / ant / main_rules.xmlの内容をインポートします 。 指定したファイルの中を見ると、プロジェクトを構築するプロセス全体を見ることができます。 残念ながら、そこから-pre-build、-pre-compile、または-post-compileを使用することは、当面のタスクには適さないことがわかります。 アセットを.apkファイルにパックするプロセスは次のようになります。



 <target name="-package-resources"> <echo>Packaging resources</echo> <aapt executable="${aapt}" command="package" versioncode="${version.code}" debug="${build.packaging.debug}" manifest="AndroidManifest.xml" assets="${asset.absolute.dir}" androidjar="${android.jar}" apkfolder="${out.absolute.dir}" resourcefilename="${resource.package.file.name}" resourcefilter="${aapt.resource.filter}"> <res path="${resource.absolute.dir}" /> <!-- <nocompress /> forces no compression on any files in assets or res/raw --> <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw --> </aapt> </target> 
      





<target name="-package-resources"> <echo>Packaging resources</echo> <aapt executable="${aapt}" command="package" versioncode="${version.code}" debug="${build.packaging.debug}" manifest="AndroidManifest.xml" assets="${asset.absolute.dir}" androidjar="${android.jar}" apkfolder="${out.absolute.dir}" resourcefilename="${resource.package.file.name}" resourcefilter="${aapt.resource.filter}"> <res path="${resource.absolute.dir}" /> <!-- <nocompress /> forces no compression on any files in assets or res/raw --> <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw --> </aapt> </target>









明らかに、このタスクで何かを変更する必要があります。 論理的に、私は2つのオプションを見ました:

1.パッケージング中に不必要な資産を除外する例外を何らかの方法で設定します。

2.もう1つのステップを追加します。既存のapkから不要なファイルを削除します。



最も難しいのは、ドキュメントを検索することでした。 明らかに、タスクはaaptプラットフォームツールに依存しています。 しかし、それについてのすべては、シェルの正式なヘルプとドキュメントのテキストです。



aidl、aapt、dexdump、dxなどの他のプラットフォームツールは通常、AndroidビルドツールまたはAndroid開発ツール(ADT)によって呼び出されるため、これらのツールを直接呼び出す必要はほとんどありません。 一般的なルールとして、ビルドツールまたはADTプラグインを使用して、必要に応じてそれらを呼び出す必要があります。



main-rules.xmltask-defヘッダーから、このaaptはcom.android.ant.AaptExecLoopTaskクラスにすぎないことがわかります。 ソースコードクラスを見つけます 。 このことから、タスクはaaptコマンドラインユーティリティを使用した標準パッケージングの狭いレイヤーにすぎないことがわかります。 パスと名前をカスタマイズできますが、アセットを操作するときにaapt自体に設定されないため、より深い柔軟性は設定されません。 このツールでは、ディレクトリの指定のみが許可され、ファイルリストの管理は許可されません。 まだオプションが表示されている場合は、コメントでそれらを読んでうれしいです。



したがって、私はパッケージをそのままにして、2番目の方法、つまりパッケージの後に不要なファイルを削除することにします。 これを行うには、 build.xml内のタスクの依存関係を再定義します

パッケージングタスクに依存する「-package-release」:



 <target name="-package-release" depends="-dex, -package-resources, -package-removetestassets"> <package-helper output.filepath="${out.unsigned.file}"/> </target> 
      





<target name="-package-release" depends="-dex, -package-resources, -package-removetestassets"> <package-helper output.filepath="${out.unsigned.file}"/> </target>









これで、main_rules.xmlのオリジナルの代わりにこのターゲットが使用されます。 新しい依存関係-package-removetestassetsが追加されます。 不要なアセットを削除する最も簡単なタスクを追加します。



 <target name="-package-removetestassets"> <echo>Excluding test assets from apk</echo> <exec executable="${aapt}"> <arg value="remove"/> <arg value="${out.absolute.dir}/${resource.package.file.name}"/> <arg value="assets/test/*.*"/> </exec> </target> 
      





<target name="-package-removetestassets"> <echo>Excluding test assets from apk</echo> <exec executable="${aapt}"> <arg value="remove"/> <arg value="${out.absolute.dir}/${resource.package.file.name}"/> <arg value="assets/test/*.*"/> </exec> </target>









build.xmlへの最小限の変更で、結果が達成されます。 これは非常に重要です Androidの新しいバージョンにアップグレードする際のリスクを軽減します。



この投稿がお役に立てば幸いです。



All Articles