Ubuntu LinuxでAndroidをビルドする

画像



この記事は、私の最初の出版物である「 Build Android for Mac OS X」の間接的な続きであり、Android 4.0.xの古いバージョンに関するビルドの問題を解決するという同様の目標があります。



簡単な紹介。 プロジェクトの1つで、特定のハードウェア用のファームウェアを作成するために、元のAndroidコードを完成させることに取り組んでいます。 ビルドバージョンはすでに比較的古い-AOSP 4.0.4でしたが、ハードウェアメーカーの安定したコードブランチに基づいています。 私はもともとMacOSで働いていましたが、このプロジェクトでは開発を容易にするためにLinuxに切り替えることにしました。 だから、運命の意思で、私はMacOSから、Androidを構築するために現在推奨されているLinuxのバージョンである、最近のUbuntu Linux 12.04.3に切り替えました。



新しい環境の主な問題は古い問題です。AOSPの古いバージョンは追跡されず、ビルドシステムに対して新しい編集は行われません。 したがって、マスターを組み立てるのがそれほど難しくない場合、Ubuntuの最新バージョン用に以前のバージョンのAndroidを組み立てるには、いくつかの問題を修正する必要があります。



私の場合、作業環境は次のようになります。



AOSPを組み立てる際のすべての主要なポイントと困難さは、公式文書に詳しく説明されています 。 MacOSに関しては、Ubuntuの場合、古いバージョンのベースOSを使用してAOSP 4.0.xバージョンをビルドすることが提案されています。 特に、「既知の問題」セクションでは、「 Ubuntu 11.10での4.0.x以前でのビルドエラー 」問題を解決するために、古いUbuntu 10.04リリースを使用することを提案しています。



解決策

インストールは、いくつかのアプリケーションプログラムを除き、ほぼ純粋なUbuntuで実行されました。 環境の初期設定は、公式の説明に従って行われました。



以下に、コンソールからのエラーテキストと修正方法を示します。 AOSPのバージョンと環境に応じて、全体または一部が表示される場合があります。 ほとんどの解決策はインターネットで見つけることができます。必要なアクションの簡単な説明のみを提供します。



エラー0
または、それはまったく間違いではありませんが、アセンブリ用に独自のOracle Javaパッケージをインストールする必要があります。これはしばらくの間Ubuntuパッケージに含まれていませんでした。



訂正
Androidをビルドするには、それぞれJDK 6バージョンが必要です。これには、Oracleリポジトリに必要なパッケージを指定し、必要なパッケージをインストールします。

sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java6-installer
      
      





同様に、他の目的で必要な場合は、最新のJDK 7thバージョンをインストールできます。

 sudo apt-get install oracle-java7-installer
      
      





エラー1
必要なパッケージをインストールするとき、libgl1-mesa-glx パッケージはインストールされません:i386:必要なlibGL x86ライブラリが含まれています。 次の理由でインストールされていません。

 The following packages have unmet dependencies: libgl1-mesa-glx:i386 : Depends: libglapi-mesa:i386 (= 8.0.4-0ubuntu0.6) Recommends: libgl1-mesa-dri:i386 (>= 7.2) E: Unable to correct problems, you have held broken packages.
      
      





それとともに、libgl1-mesa-devパッケージがインストール用に指定されており、これにはlibGLが含まれていますが、x64バージョンはAOSPのビルドには適していません。



x64アーキテクチャ用にlibgl1-mesa-devでビルドしようとすると、リンク時にエラーが発生します。

 /usr/bin/ld: cannot find -lGL collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1 make: *** Waiting for unfinished jobs.... /usr/bin/ld: cannot find -lGL collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/lib/libEGL_translator.so] Error 1
      
      





訂正
libgl1-mesa-glx:i386およびlibgl1-mesa-devパッケージの代わりに、libgl1-mesa-dev:i386パッケージをインストールします。

 sudo apt-get install libgl1-mesa-dev:i386
      
      





パッケージの内容のより詳細な説明は、Ubuntuの説明にあります。必要なlibgl1-mesa-glxも含まれていることがわかります。



また、パッケージをインストールすると、/ usr / lib / i386-linux-gnu /ディレクトリにシンボリックリンクが作成されるため、コマンドでマニュアルに示されているように、追加で作成する必要はありません。

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
      
      





エラー2
システムで使用されるgccコンパイラバージョン(4.6.x)には、_FORTIFY_SOURCEシンボルのオーバーライドに関する問題があります。これは、公式の「 既知の問題 」でも説明されています。 解決策として、Ubuntu 10.04にロールバックすることが提案されていますが、これは明らかに最適なオプションではありません。 警告とエラーのテキストは次のとおりです。

 <command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]
      
      





または

 <command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] <built-in>:0:0: note: this is the location of the previous definition cc1plus: all warnings being treated as errors
      
      





訂正
この問題は、gcc-4.4と必要なライブラリをインストールすることで解決できます。

 sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib
      
      





このブログでは、gccの2xバージョンの構成と、gcc-4.4の優先バージョンとしての使用について詳しく読むことができます。 目的のために、必要なパッケージをインストールし、コンパイラのバージョンを示すコマンドでアセンブリを開始するだけで十分です。

 make CC="gcc-4.4" CXX="g++-4.4"
      
      





上記の操作の後、Androidは望みどおりに組み立てられますが、実際にはいくつかの問題が発生する可能性があります。



エラー3
ハードウェアレンダリングアクセラレーションを有効にするために、指定された "-gpu on"パラメーターでエミュレーターを起動すると、エミュレーターで次のメッセージと黒い画面が表示されます。

 Failed to load libGL.so error libGL.so: cannot open shared object file: No such file or directory Failed to load libGL.so error libGL.so: cannot open shared object file: No such file or directory
      
      





通常モードでは、エミュレーターは正常に起動しますが、それを把握するのは興味深いことでした。コンピューターが再起動した後、ファンは最大で動作し続け、電源が切れないことがわかりました。 控えめに言えば、非常に不快な効果です。このようなノイズがあると、動作するのが非常に不便になります。



訂正
パッケージを確認したところ、パッケージの1つをインストールすると、NVidiaの独自のグラフィックドライバーが削除され、その結果、システムはファン速度の調整方法と目的のライブラリの検索場所を忘れていました。 悪意のあるパッケージはlibncurses5-dev:i386であることが判明しました。インストール時には、次のリクエストが送信されることに注意してください。

 sudo apt-get install libncurses5-dev:i386 The following packages will be REMOVED: dkms gcc gcc-4.6 nvidia-304
      
      





したがって、この問題の解決策は、専用のドライバーをコンソールまたはコントロールパネルから再インストールするだけです。



エラー4
システムカーネルファイルを指定せずにエミュレーターが起動したときに発生します。 前の記事で、この点を示すのを忘れていましたが、これで説明が完全に完了するように修正しました。 そのため、AOSP 4.0.4エミュレータを起動すると、次のメッセージが表示されます。

 emulator: ERROR: bad workspace: cannot find prebuilt kernel in: /home/user/Development/workspace_aosp/android-4.0.4_r1.1/prebuilts/qemu-kernel/arm/kernel-qemu-armv7
      
      





AOSPの最近のバージョンでは、事前作成されたファイルが別のディレクトリに移動され、この修正が古いバージョンのアセンブリスクリプトに適用されたが、場所は変更されなかったため、問題が発生しました。



訂正
エミュレーターを起動するときのカーネルの場所、アセンブリーのルートからの相対パスを指定します。

 emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7
      
      





またはパフォーマンスを向上させるには:

 emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7 -memory 1024 -gpu on
      
      





おわりに

一般に、Linuxビルドの方が高速で、報告会の時間が短縮されましたが、グラフィックドライバーとファンの状況により、最初は行き詰まりました。 したがって、Linuxのアセンブリはそれほど問題ではないと評価できますが、完全に明確ではありません:)。



All Articles