Back to page

− Links

 Print 

Diff of AndroidのANEを作成するためにライブラリの依存関係を調べてaarを利用する :: NJF Wiki

Diff of xpwiki:AndroidのANEを作成するためにライブラリの依存関係を調べてaarを利用する

« Prev[3]  
1: 2019-05-21 (Tue) 22:10:58 njf[4] source[5] Edit Backup No.1 as current.[6] Cur: 2019-05-21 (Tue) 23:50:11 njf[4] source[7] Edit[8]
Line 1: Line 1:
*はじめに [#l33a0f65] *はじめに [#l33a0f65]
-Androidアプリの開発がAndroid Studioのみで公式サポートされるようになってから、ライブラリがjarからaarで配布されることが多くなり、ライブラリ構成も今までよりも小さな機能単位で分割されるようになりました。Android Studioで開発する場合はソフト側で依存関係の解決してくれるので特に問題は無いのですが、ANEを作るのはとても大変になり、もはや手作業で依存関係を調整するのは現実的ではなくなってきました。そこで依存関係を調べてダウンロードし、展開して名前を変更してANEを作りやすくするツールを作ったので、その時の知見をここに書きます。ツール自体は汎用性がなく公開するに耐えるような物ではないので、その時に利用した各種仕様や注意事項をまとめています。自分でツールを作るのが最善の方法か分かりませんし、例えばAndroid Studioの使い方に精通すれば簡単に依存性に基づいてライブラリをダウンロードできるかもしれません。ただ、同じような問題に悩んでいる人の役に立つ可能性もあると思いこの記事を公開します。 +Androidアプリの開発がAndroid Studioのみで公式サポートされるようになってから、ライブラリがjarからaarで配布されることが多くなり、ライブラリ構成も今までよりも小さな機能単位で分割されるようになりました。 
-ライブラリの依存関係を調べる+ 
 +Android Studioで開発する場合はソフト側で依存関係の解決してくれるので特に問題は無いのですが、ANEを作るのはとても大変になり、もはや手作業で依存関係を調整するのは現実的ではなくなってきました。 
 + 
 +そこで依存関係を調べてダウンロードし、展開して名前を変更してANEを作りやすくするツールを作ったので、その時の知見をここに書きます。 
 + 
 +ツール自体は汎用性がなく公開するに耐えるような物ではないので公開する予定はありませんが、その時に利用した各種仕様や注意事項をまとめています。 
 + 
 +自分でツールを作るのが最善の方法か分かりませんし、例えばAndroid Studioの使い方に精通すれば簡単に依存性に基づいてライブラリをダウンロードできるかもしれません。ただ、同じような問題に悩んでいる人の役に立つ可能性もあると思いこの記事を公開します。 
 + 
 +*ライブラリの依存関係を調べる [#q99a555b]
ライブラリの依存関係はAndroid Studioの機能でもできるのですが、それを見ながら一つずつダウンロードするのは面倒なので、pomファイルを利用しました。 ライブラリの依存関係はAndroid Studioの機能でもできるのですが、それを見ながら一つずつダウンロードするのは面倒なので、pomファイルを利用しました。
Line 51: Line 60:
pomファイルの詳しい仕様は[[https://maven.apache.org/pom.html]]で公開されています。また、実際にファイルを見るとだいたいどのような事が書いてあるか分かると思います。そこで、わかりにくい部分や注意すべき所だけ解説します。 pomファイルの詳しい仕様は[[https://maven.apache.org/pom.html]]で公開されています。また、実際にファイルを見るとだいたいどのような事が書いてあるか分かると思います。そこで、わかりにくい部分や注意すべき所だけ解説します。
-packaging + 
-そのライブラリがどのようなファイル形式で配布されているかです。省略されているとjarファイルです。ライブラリのファイルをダウンロードするときに必要になります。全部のライブラリがaar形式で配布されているわけではないので注意が必要です。 +**packaging [#u5035232] 
-version+ 
 +そのライブラリがどのようなファイル形式で配布されているかです。省略されているとjarファイルです。ライブラリのファイルをダウンロードするときに必要になります。全てのライブラリがaar形式で配布されているわけではないので注意が必要です。 
 + 
 +**version [#z62b430f] 
dependencyのversionに時々ついている[](角括弧)は正確にそのバージョンでなければならない事を意味します。他に「[1.0,2.0)」となっていれば、1.0以上、2.0未満を表すなど、数学の数値の範囲を表す記号と同様のルールがあります。特にそういった記号がなければ推奨されるバージョンを指します。 dependencyのversionに時々ついている[](角括弧)は正確にそのバージョンでなければならない事を意味します。他に「[1.0,2.0)」となっていれば、1.0以上、2.0未満を表すなど、数学の数値の範囲を表す記号と同様のルールがあります。特にそういった記号がなければ推奨されるバージョンを指します。
-exclude+**exclude [#u6e32678] 
dependencyの中に「exclude」というタグがあり、ライブラリ名が記載されていることがあります。その場合はそのライブラリはさらにその下の階層の依存性から取り除かなければなりません。この処理を忘れるとライブラリ同士のバージョンなどが衝突しやすくなります。 dependencyの中に「exclude」というタグがあり、ライブラリ名が記載されていることがあります。その場合はそのライブラリはさらにその下の階層の依存性から取り除かなければなりません。この処理を忘れるとライブラリ同士のバージョンなどが衝突しやすくなります。
-ダウンロードするURL+*ダウンロードするURL [#z00994f3] 
依存関係が分かれば次はそれをダウンロードします。そのURLはGoogleなら 依存関係が分かれば次はそれをダウンロードします。そのURLはGoogleなら
Line 69: Line 84:
このあたりをおさえておけば、pomファイルから依存関係を割り出してダウンロードするツールが作れると思います。 このあたりをおさえておけば、pomファイルから依存関係を割り出してダウンロードするツールが作れると思います。
-aarファイルをANEに取り込む時の注意点 +*aarファイルをANEに取り込む時の注意点 [#vb01a509] 
-テスト用のライブラリ+ 
 +**テスト用のライブラリ [#u1de991e]
junitやmockitoなどはテスト用のライブラリなので、ANEに含める必要はありません。 junitやmockitoなどはテスト用のライブラリなので、ANEに含める必要はありません。
-aarの概要+**aarの概要 [#y38ad463] 
ライブラリをダウンロードしたら、それをzip解凍して必要なファイルを取り出さなければなりません。 ライブラリをダウンロードしたら、それをzip解凍して必要なファイルを取り出さなければなりません。
Line 81: Line 98:
多くのライブラリでは 多くのライブラリでは
-AndroidManifest.xml + AndroidManifest.xml 
-classes.jar + classes.jar 
-/res/+ /res/
-をANEに取り込む必要があります。また、+をANEやAirアプリに取り込む必要があります。また、
-/assets/+ /assets/
も必要となることがあります。他の「/libs/name.jar」や「/jni/abi_name/name.so」も必要となる可能性がありますが、私は扱ったことがないのでここでは省略します。 も必要となることがあります。他の「/libs/name.jar」や「/jni/abi_name/name.so」も必要となる可能性がありますが、私は扱ったことがないのでここでは省略します。
-AndroidManifest.xml+**AndroidManifest.xml [#ybb30f9e]
AndroidManifest.xmlの「manifest」の「package」属性にパッケージ名が記載されています。これはANEを作成するときのplatform.xmlで指定する「packagedResource」の下の「packageName」になります。例えば、play-services-adsならAndroidManifest.xmlは AndroidManifest.xmlの「manifest」の「package」属性にパッケージ名が記載されています。これはANEを作成するときのplatform.xmlで指定する「packagedResource」の下の「packageName」になります。例えば、play-services-adsならAndroidManifest.xmlは
Line 98: Line 115:
   xmlns:tools="http://schemas.android.com/tools"    xmlns:tools="http://schemas.android.com/tools"
   package="com.google.android.gms.ads.impl" >    package="com.google.android.gms.ads.impl" >
 + 
     <uses-sdk      <uses-sdk
       android:minSdkVersion="14"        android:minSdkVersion="14"
       tools:overrideLibrary="android.support.customtabs" />        tools:overrideLibrary="android.support.customtabs" />
 + 
 </manifest>  </manifest>
Line 110: Line 127:
実際にどのような項目が必要でどう統合されるかを確かめるなら、Android Studioで実際にライブラリを含むapkファイルを作成して、それをzip解凍すると統合されたAndroidManifest.xmlが得られます。ただし、このAndroidManifest.xmlはバイナリファイルになっているので、例えば 実際にどのような項目が必要でどう統合されるかを確かめるなら、Android Studioで実際にライブラリを含むapkファイルを作成して、それをzip解凍すると統合されたAndroidManifest.xmlが得られます。ただし、このAndroidManifest.xmlはバイナリファイルになっているので、例えば
-[[https://qiita.com/red12sparrow11/items/59962c8b065860944670]]を参考にするなどしてテキストに戻す必要があります。またこのAndroidManifest.xmlは変数が展開されてしまっているので、これをそのままapp.xmlに書くのはよくありません。しかし、どういった項目が必要かの参考にはなります。+[[https://qiita.com/red12sparrow11/items/59962c8b065860944670]]を参考にするなどしてテキストに戻す必要があります。またこのAndroidManifest.xmlは変数が展開されてしまっているので、これをそのままapp.xmlに書くのはよくありません。参照している値が変わったときに同期がとれなくなるからです。しかし、どういった項目が必要かの参考にはなります。
-classes.jar+**classes.jar [#z3e65289]
classes.jarはplatform.xmlのpackagedDependencyに記載するものです。わかりやすい名前に変更しておいた方が良いでしょう。 classes.jarはplatform.xmlのpackagedDependencyに記載するものです。わかりやすい名前に変更しておいた方が良いでしょう。
-/res/+ 
 +**/res/ [#d0ae37d5]
/res/はANEの作成ではplatform.xmlのpackagedResourceのfolderNameで指定する物で、パッケージ名と組にして管理する必要があります。わかりやすい名前に変更しておいた方が良いでしょう。中身が空の時も多く、その時はplatform.xmlに記載する必要はありません。 /res/はANEの作成ではplatform.xmlのpackagedResourceのfolderNameで指定する物で、パッケージ名と組にして管理する必要があります。わかりやすい名前に変更しておいた方が良いでしょう。中身が空の時も多く、その時はplatform.xmlに記載する必要はありません。
-/assets/ + 
-定数や画像などのAndroidのリソースは多言語化、多解像度対応が容易なRクラスを利用するために/res/に入れるのが普通です。しかし、直接ファイルをあつかいたい場合にはリソースを/assets/に入れることがあります。この中にファイルがあれば、それらはAne作成時ではなく、Airアプリ作成時に取り込んでおく必要があります。Animateの「Air for Android設定」の「含めるファイル」の一番上の階層に入れておくと、apkを書き出すとその中に自動的に「assets」というディレクトリが作成されてそこに格納されます。+**/assets/ [#lb0b316c] 
 + 
 +定数や画像などのAndroidのリソースは多言語化、多解像度対応が容易なRクラスを利用するために/res/に入れるのが普通です。しかし、直接ファイルをあつかいたい場合にはリソースを/assets/に入れることがあります。この中にファイルがあれば、それらはANE作成時ではなく、Airアプリ作成時に取り込んでおく必要があります。Animateの「Air for Android設定」の「含めるファイル」の一番上の階層に入れておけば、apkを書き出すとその中に自動的に「assets」というディレクトリが作成されてそこに格納されます。
例えば取り込むaarファイルを展開した/assets/以下に「test.png」というファイルが含まれていたら、以下のようにします。 例えば取り込むaarファイルを展開した/assets/以下に「test.png」というファイルが含まれていたら、以下のようにします。
 +
 +&ref(ane_assets.png,mw:480,mh:360);
 +
 +ライブラリアップデートでANEを作り替えるときは、Airの方での取り込みも修正しないといけないわけです。忘れやすいところですから注意してください。
 +
 +*まとめ [#x7a691e4]
 +pomファイルを使って依存性を見る方法は仕様がはっきりしているxmlファイルなので解析がしやすく、ツール化がしやすいというメリットがあります。
 +
 +とはいえ、仕様の確認、ツールの作成、テストで数日かかってしまったので、できればAir SDKの方でMavenで使うURLやライブラリ名を読み込んで自動で依存関係を解決してくれたらなあ、と思います。せめてaarはそのまま読み込んで欲しいです。aarのメリットが全く生かせていない、というよりむしろ面倒になっているので。
« Prev[3]