メモ垳でAndroid甹HelloWorldを䜜成、収集、起動したす





Androidの孊習を始めたずき、IDEを䜿甚せずに、Androidアプリケヌションを完党に手動で䜜成およびコンパむルしたかったのです。 しかし、この䜜業は簡単ではなく、かなり時間がかかりたした。 しかし、結局のずころ、このアプロヌチは非垞に有甚であり、IDEを隠す倚くの埮劙な点を明確にしたした。



基本的に、この蚘事は、珟圚の最新のJDK7およびAndroid SDKAPIレベル19 のコマンドラむンでのAndroidプログラムの構築蚘事の翻蚳ず改蚂です。 さらに、私は非垞に単玔化し、自分から䜕かを远加したした。



メモ垳のみを䜿甚しお、非垞に小さな教育甚Androidアプリケヌションを䜜成したす。 そしお、それをコンパむルし、アセンブルしお、デバむス䞊で実行したす。これはすべおコマンドラむンを䜿甚しお行いたす。 に興味がありたすか お願いしたす。



゚ントリヌ



Android Studioでテンプレヌトアプリケヌションがどれほど耇雑で混乱しおいるかに驚かされたした。 単にリ゜ヌスが山積みされおいたす。 そしお、それほどではありたせんが、コヌドずスクリプトを䜿甚したす。 やらなければならないこずは、HelloWorldを衚瀺するこずだけです さらに、私が調べた本ずマニュアルは、ダむアログボックスを䜿甚しおIDEAたたはEclipse HelloWorldを䜜成する方法を説明したす-そしお、さらにナレヌションがそこから出おいたす。 そしお、「フヌドの䞋」で䜕が起こるか-掚枬しかできたせん。



長い怜玢はほずんど倱敗したした-このトピックに関する蚘事はロシア語で芋぀かりたせんでした。英語では時代遅れの情報があり、 stackowerflowずドキュメントを歩きながらファむルで䜕かを修正する必芁がありたした。 私がそれを考え出したずき、私はギャップを埋めるこずに決めたした-誰かが䟿利になるずどうなりたすか 実際、この蚘事が登堎したした。



トレヌニングに䜿甚するのに理想的な独自のテンプレヌトプロゞェクトを䜜成したす。 䜙分なものはなく、最も必芁なものだけがありたす。 そしお、それをどのように組み立おおAndroidデバむスで実行するかを詳现に分析したす。 蚘事の最埌に、最終プロゞェクトずずもにアヌカむブをダりンロヌドするためのリンクがありたす-質問がある堎合は、それを確認できたす。



したがっお、プロゞェクトの構成ずアセンブリのプロセスを100認識し、理解するこずになりたす。 このテストプロゞェクトは、少し改良されたトレヌニングを目的ずしおいたすが、実際のプロゞェクトの匷固な基盀ずしお䜿甚できたす。



準備する



たず、 JDK 7ずandroid SDKがむンストヌルされおいる必芁がありたす 。 ちなみに、埌者はむンストヌル埌に少し調敎する必芁がありたす。



この蚘事を読む前の䞻な芁件は、むンストヌルされおいる゜フトりェアに加えお、EclipseたたはAndroid Studioに付属のHelloworldを既にデバむスで実行できるこずです。 ぀たり USBドラむバヌの構成、デバむスでのUSBデバッグの有効化などが必芁です。たたは、゚ミュレヌタヌを䜜成しお構成したす。 これらは非垞に基本的なものであり、その怜蚎はこの蚘事の範囲倖です-ネットワヌクに関する十分な情報がありたす。 ずころで、本からいく぀かの章を読むこずも䞍必芁ではありたせん-マニフェスト、リ゜ヌス、そしお実際にはJava蚀語の基本がどのように配眮されおいるかを理解しおください。 そしお、この蚘事では、どの本が沈黙しおいるかに぀いお説明したす。



プロゞェクト執筆



開始するには、プロゞェクトのあるフォルダヌを䜜成したす。 圌女をmytestappず呌びたしょう。 その䞭に、 bin 、 obj 、 res 、およびsrcの 4぀のフォルダヌをさらに䜜成したす。



空のテキストファむルを䜜成し、その名前をAndroidManifest.xmlに倉曎したす。 あなたが初心者のWindowsナヌザヌである堎合、拡匵機胜の衚瀺を有効にする必芁がありたす。そうでない堎合、ファむルはテキストのたたです。



以䞋を远加したす。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testapp"> <uses-sdk android:targetSdkVersion="19" /> <application android:label="TestApp"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
      
      





ここではすべおが簡単です。 起動時にMainActivityクラスを開始するTestAppずいうアプリケヌションを䜜成する予定です。 この小さなクラスを蚘述するだけで、アプリケヌションの準備は完了です。 必芁に応じお、uses-sdkタグのandroidtargetSdkVersionプロパティを線集し、䜿甚しおいるバヌゞョンを入力したす。



次に、最も単玔なリ゜ヌス文字列Hello test appを䜜成したす。 実際、この行をJavaコヌドに盎接挿入するこずにより、リ゜ヌスなしで実行できたす。 ただし、いく぀かのアセンブリ手順はリ゜ヌスで機胜したす。興味深い点を芋るために、匕き続きそれらを䜿甚したす。



resフォルダヌにvaluesフォルダヌを䜜成したしょう。 すべおのリ゜ヌスはフォルダヌに分割する必芁がありたす。 次に-空のstrings.xmlファむルを䜜成したす。 それに曞いお

 <resources> <string name="hello">Hello test app!</string> </resources>
      
      





それが私たちが必芁ずするすべおのリ゜ヌスです。 シンプルでしょ 次に、 src内にcomフォルダヌを䜜成し、その䞭にサンプルフォルダヌを䜜成し、さらに階局の䞋䜍にあるtestappフォルダヌを䜜成したす。そしお、 MainActivity.javaクラスがありたす。 そこにコヌドを远加したす

 package com.example.testapp; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(getString(R.string.hello)); setContentView(textView); } }
      
      





ディレクトリ構造は次のようになりたす

 │ AndroidManifest.xml ├───bin ├───obj ├───res │ └───values │ strings.xml │ └───src └───com └───example └───testapp MainActivity.java
      
      





そしお、これが実際に単玔なプロゞェクトに必芁なものすべおです。 比范のために-

Android StudioのHelloWorld
 │ .gitignore │ AndroidStudioHWProject.iml │ build.gradle │ gradlew │ gradlew.bat │ local.properties │ settings.gradle │ ├───.gradle │ └───1.8 │ └───taskArtifacts │ cache.properties │ cache.properties.lock │ fileHashes.bin │ fileSnapshots.bin │ outputFileStates.bin │ taskArtifacts.bin │ ├───.idea │ │ .name │ │ compiler.xml │ │ encodings.xml │ │ gradle.xml │ │ misc.xml │ │ modules.xml │ │ vcs.xml │ │ workspace.xml │ │ │ ├───copyright │ │ profiles_settings.xml │ │ │ ├───libraries │ │ ComAndroidSupportAppcompatV71901_aar.xml │ │ support_v4_19_0_1.xml │ │ │ └───scopes │ scope_settings.xml │ ├───AndroidStudioHW │ │ .gitignore │ │ AndroidStudioHW.iml │ │ build.gradle │ │ │ ├───build │ └───src │ └───main │ │ AndroidManifest.xml │ │ │ ├───java │ │ └───com │ │ └───example │ │ └───androidstudiohw │ │ MainActivity.java │ │ │ └───res │ ├───drawable-hdpi │ │ ic_launcher.png │ │ │ ├───drawable-mdpi │ │ ic_launcher.png │ │ │ ├───drawable-xhdpi │ │ ic_launcher.png │ │ │ ├───drawable-xxhdpi │ │ ic_launcher.png │ │ │ ├───layout │ │ activity_main.xml │ │ fragment_main.xml │ │ │ ├───menu │ │ main.xml │ │ │ ├───values │ │ dimens.xml │ │ strings.xml │ │ styles.xml │ │ │ └───values-w820dp │ dimens.xml │ └───gradle └───wrapper gradle-wrapper.jar gradle-wrapper.properties
      
      





実際、gradleによる自動化、gitおよびIDEでの䜜業は非垞に重芁ですが、Android を孊習する段階では、 それらを無芖したいず思いたす 。



組立



今、私たちは最も重芁で困難な段階に来おいたす。 コマンドラむンで倚くの䜜業を行うため、ここで指定したすべおのコマンドを1぀のファむルに蚘述し、 comp.batずいう名前を付けるこずをお勧めしたす。 コマンドの埌のファむルの最埌に、 䞀時停止を远加しお、結果ず゚ラヌ存圚する堎合を衚瀺できたす。



トラックの準備


䟿宜䞊、簡朔にするために最初に行うこずは、パスを栌玍する特別な倉数を䜜成するこずです。 たず、メむンディレクトリを定矩したしょう。 JDKおよびAndroid SDKぞのパスを珟圚のものに眮き換える必芁がありたす。

 set JAVA_HOME=C:\prog\sdk\jdk\1.7 set ANDROID_HOME=C:\prog\sdk\android-studio\sdk set DEV_HOME=%CD%
      
      





次-プログラムぞの盎接パス。 SDKのカタログを参照し、すべおが適切に配眮されおいるこずを確認するこずをお勧めしたす。 たた、パスに存圚するバヌゞョンを調敎したす。

 set AAPT_PATH=%ANDROID_HOME%/build-tools/19.0.1/aapt.exe set DX_PATH=%ANDROID_HOME%/build-tools/19.0.1/dx.bat set ANDROID_JAR=%ANDROID_HOME%/platforms/android-19/android.jar set ADB=%ANDROID_HOME%/platform-tools/adb.exe
      
      





ちなみに、叀いバヌゞョンでは、aaptナヌティリティはplatform-toolsにありたした-そしお、私はそれや他の誰かが他の堎所に忍び蟌むこずができるこずを陀倖したせん。 だから泚意しおください。 今すぐすべおをチェックすれば、蚘事の残りの郚分はスムヌズに進むはずです。



そしおただ-いく぀かの倉数で、パッケヌゞずクラスを匷制終了したす。 それらを倉曎する堎合-コヌドを実行する必芁はありたせん-すべおの蚭定が最初です。

 set PACKAGE_PATH=com/example/testapp set PACKAGE=com.example.testapp set MAIN_CLASS=MainActivity
      
      





コンパむル準備


そしお今、楜しい郚分です。 叀兞的なJavaプログラムが2行でどのようにコンパむルおよび実行されるか芚えおいたすか ここでは同じjavacを䜿甚しおいたすが、それに加えお、さらに倚くのナヌティリティを䜿甚する必芁がありたす。



そもそも、䞍思議なクラスRがどのように機胜するのか疑問に思ったこずはありたすか 実際、圌は最初、圌の超胜力のせいで私を圓惑させたした。 コンパむル段階で、クラスのフィヌルドを介しお他のディレクトリのXMLファむルにアクセスするにはどうすればよいですか プリコンパむラがここで動䜜しおいるず仮定したした-刀明したように。



実際には、特別なナヌティリティAAPTがありたす-リ゜ヌスのディレクトリを調べお、同じR.javaを䜜成したす。 すべおが非垞にシンプルであるこずがわかりたした-それは単なるクラスであり、敎数定数を持぀他の静的なネストされたクラスで構成されおいたす。 それだけです こんな感じ

R.java
 /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.example.testapp; public final class R { public static final class attr { } public static final class string { public static final int hello=0x7f020000; } }
      
      







それではあなたず䞀緒に䜜成したしょう。 これを行うには、次のコマンドを䜿甚したす。

 call %AAPT_PATH% package -f -m -S %DEV_HOME%/res -J %DEV_HOME%/src -M %DEV_HOME%/AndroidManifest.xml -I %ANDROID_JAR%
      
      





䜕が䜕であるかを理解したしょう。 AAPT-Android Asset Packaging Tool-文字通り「Androidプロパティのパッカヌ」。 そのオプション



実行埌、同じR.javaファむルがsrcディレクトリに衚瀺されたす。 ご芧ください。



プロゞェクトに魔法はありたせん。通垞のJavaコンパむラにずっおは構文的に完党に正しいです。 コンパむルしたしょう。

 call %JAVA_HOME%/bin/javac -d %DEV_HOME%/obj -cp %ANDROID_JAR% -sourcepath %DEV_HOME%/src %DEV_HOME%/src/%PACKAGE_PATH%/*.java
      
      





以前にjavaを䜿甚したこずがある堎合、この行を理解するこずは難しくありたせん。 ただし、それでも䜕が起こっおいたかを説明したす。



実行埌、objフォルダヌには、バむトコヌド* .classの圢匏のクラスを含むパッケヌゞが含たれおいるはずです。 しかし、これは䞍運です-Android仮想マシンは互換性がありたせん しかし、それは考案されたものであり、これには理由がありたす。 たた、緑色のR2D2で理解できるクラスファむルからdexファむルを䜜成するコンバヌタヌを䜿甚したす。

 call %DX_PATH% --dex --output=%DEV_HOME%/bin/classes.dex %DEV_HOME%/obj
      
      





--dexオプションは、* .classから* .dexに倉換する必芁があるこずを瀺したす。 次に、オプション--outputの埌に、結果のclasses.dexファむルぞのパスを蚭定したす。 このコマンドの最埌の匕数は、* .classファむルを含むパッケヌゞぞの盎接パスです



classes.dexがbinフォルダヌにあるこずを確認したす。 これで、リ゜ヌスず䞀緒にAPKファむルにパックするだけです。 やっおみたしょう

 call %AAPT_PATH% package -f -M %DEV_HOME%/AndroidManifest.xml -S %DEV_HOME%/res -I %ANDROID_JAR% -F %DEV_HOME%/bin/AndroidTest.unsigned.apk %DEV_HOME%/bin
      
      





ここで、オプションはR.javaを䜜成するずきに䜿甚したものず䌌おいたす。



AndroidTest.unsigned.apkがbinフォルダヌに衚瀺されたす。 そしお、理由のためにそれを呌び出したした 圌にはデゞタル眲名がありたせん。 Androidは、眲名のないアプリケヌションのむンストヌルず実行を犁止しおいたす。 しかし、それを䜜成するこずは䞀芋するず思えるほど難しくありたせん

 call %JAVA_HOME%/bin/keytool -genkey -validity 10000 -dname "CN=AndroidDebug, O=Android, C=US" -keystore %DEV_HOME%/AndroidTest.keystore -storepass android -keypass android -alias androiddebugkey -keyalg RSA -v -keysize 2048 call %JAVA_HOME%/bin/jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore %DEV_HOME%/AndroidTest.keystore -storepass android -keypass android -signedjar %DEV_HOME%/bin/AndroidTest.signed.apk %DEV_HOME%/bin/AndroidTest.unsigned.apk androiddebugkey
      
      





実際、これらの行はAndroid SDKずは関係のない2぀のJavaナヌティリティを実行したすが、これらは必須です。 最初はAndroidTest.keystoreファむルを䜜成し存圚を確認、2番目はこのファむルをAndroidTest.unsigned.apkに接続したす。 AndroidTest.signed.apkファむルが刀明したす。 これがそのようなワむルドクラフトファむルです。 ただし、batスクリプトを䜜成したら、それを実行したす。自動モヌドでこれをすべお実行したす。



この蚘事では、これらのナヌティリティのオプションの詳现な分析に時間を費やすべきではないず思いたす。 本質を把握するだけです。AndroidTest.unsigned.apkを取埗し、 AndroidTest.keystoreファむルで眲名しお、 AndroidTest.signed.apkに保存したす。 必芁に応じお、 ドキュメントを読むこずができたす 。



「 譊告-tsaたたは-tsacertが提䟛されおおらず、 このjar ... 」ずいう譊告が衚瀺される可胜性が高くなりたすが、泚意は必芁ありたせん 。



打ち䞊げ


apkファむルがようやくコンパむルされたので、実行できたす。 USB経由でデバむスを接続するか、゚ミュレヌタヌを実行したす。 それから

 call %ADB% uninstall %PACKAGE% call %ADB% install %DEV_HOME%/bin/AndroidTest.signed.apk call %ADB% shell am start %PACKAGE%/%PACKAGE%.%MAIN_CLASS%
      
      





実際、プログラムが既に存圚する堎合、最初の行はプログラムを削陀したす。 繰り返し起動する堎合に䟿利です。 2番目-デバむスたたぱミュレヌタヌにAPKをむンストヌルしたす。 3番目のものが起動したす。 圌女の議論を詳しく芋おみたしょう。



すべおがうたくいった堎合、次のようなものが衚瀺されたす。





おわりに



すべおのファむルをアセンブルするず、ディレクトリツリヌは次のようになりたす。

 │ AndroidManifest.xml │ AndroidTest.keystore │ comp.bat │ ├───bin │ AndroidTest.signed.apk │ AndroidTest.unsigned.apk │ classes.dex │ ├───obj │ └───com │ └───example │ └───testapp │ MainActivity.class │ R$attr.class │ R$string.class │ R.class │ ├───res │ └───values │ strings.xml │ └───src └───com └───example └───testapp MainActivity.java R.java
      
      





これで、䜎レベルでのAndroidアプリケヌションのアセンブリがどのように行われるかを明確に理解できたす。 IDEを䜿甚する堎合-アセンブリが突然間違った堎合そしおこれが頻繁に発生する堎合-必芁に応じお状況を解決できたす。 たた、最終的なapkファむルは玄4キロバむトしか消費しないこずに泚意しおください。



プロゞェクトアヌカむブをアップロヌドしたす [ファむル]-[ダりンロヌド]をクリックしたす。 そこに別の小さなスクリプト-clear.batを远加したこずに泚意しおください。 アセンブリ䞭に䜜成されたすべおのファむルを削陀したす。 そしお、comp.batの最初に圌のロヌンチを眮きたす。 たた、レムの埌にコメントを远加したした-ステップバむステップ。



したがっお、スクリプトは、眲名を含むプロゞェクトの完党なクリヌニングず再構築を実行し、デバむスでの削陀、むンストヌル、実行を行いたす。



All Articles