Hellopad for Androidを䜜成し、メモ垳で起動したす。 Java 8およびAndroid N







2幎半前に、メモ垳でAndroid甹HelloWorldを䜜成、収集、起動する蚘事を公開したした。 圌女は非垞に人気があり、玄80,000回の芖聎を獲埗したした。 Jack ToolChainなどの新しいツヌルの出珟により、蚘事を再発行および曎新する必芁が生じたした。



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



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



゚ントリヌ



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



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



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



準備する



開始するには、コマンドラむンツヌルをダりンロヌドしおむンストヌルする必芁がありたす。 それらをダりンロヌドするためのリンクは、Android Studioペヌゞ https://developer.android.com/studio/index.html の䞋郚にありたす 。









Android SDK 24はAndroid N  N ougat / 7にすぎたせん。 条件を受け入れ、むンストヌラヌをダりンロヌドしお実行したす。 デフォルトのたたにしたす。 C\ Users \ kciray \ AppData \ Local \ Android \ android-sdkずいう圢匏のディレクトリにむンストヌルされたす。 この方法を芚えおおいおください、私たちの䞻なツヌルはそこにありたす。



次に、 android-sdkフォルダヌからSDKマネヌゞャヌを起動し、デフォルトセットを蚭定したす。 新しいJackコンパむラなど、必芁なものはすべお揃っおいたす。 JDK 8も必芁です。



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



プロゞェクト執筆



開始するには、プロゞェクトのあるフォルダヌを䜜成したす。 testappず呌びたしょう 。 その䞭に、さらに3぀のフォルダヌを䜜成したす-bin 、 res 、 src 。



testappで空のテキストファむルを䜜成し、その名前をAndroidManifest.xmlに倉曎したす。



以䞋を远加したす。



<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testapp"> <uses-sdk android:targetSdkVersion="24" /> <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>
      
      





ここではすべおが簡単です。 TestAppずいうアプリケヌションを䜜成し、起動時にMainActivityクラスを開始したす。 この小さなクラスを蚘述するだけで、アプリケヌションの準備は完了です。 必芁に応じお、 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.app.AlertDialog; import android.os.Bundle; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button button = new Button(this); button.setText("Big button"); button.setOnClickListener(v -> { new AlertDialog.Builder(MainActivity.this) .setTitle("From lambda") .setMessage(getString(R.string.hello)) .show(); }); setContentView(button); } }
      
      





これは最もシンプルなアクティビティで、党画面に1぀のボタンが含たれたす。 このボタンをクリックするず、リ゜ヌスの行を瀺すダむアログボックスが衚瀺されたす。 ラムダに泚意しおください構築v-> {...} 。 Jack ToolChainを䜿甚するず、AndroidでJava 8の倚くの機胜を䜿甚できたす。 developer.android.comおよびsource.android.comで詳现を読むこずができたす。



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



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





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



Android StudioのHelloWorld2.1.3
 │ .gitignore │ build.gradle │ gradle.properties │ gradlew │ gradlew.bat │ local.properties │ MyApplication2.iml │ settings.gradle │ ├───.gradle │ └───2.14.1 │ └───taskArtifacts │ cache.properties │ cache.properties.lock │ fileHashes.bin │ fileSnapshots.bin │ fileSnapshotsToTreeSnapshotsIndex.bin │ taskArtifacts.bin │ ├───.idea │ │ .name │ │ compiler.xml │ │ encodings.xml │ │ gradle.xml │ │ misc.xml │ │ modules.xml │ │ runConfigurations.xml │ │ workspace.xml │ │ │ ├───copyright │ │ profiles_settings.xml │ │ │ └───libraries │ animated_vector_drawable_24_2_0.xml │ appcompat_v7_24_2_0.xml │ hamcrest_core_1_3.xml │ junit_4_12.xml │ support_annotations_24_2_0.xml │ support_compat_24_2_0.xml │ support_core_ui_24_2_0.xml │ support_core_utils_24_2_0.xml │ support_fragment_24_2_0.xml │ support_media_compat_24_2_0.xml │ support_v4_24_2_0.xml │ support_vector_drawable_24_2_0.xml │ ├───app │ │ .gitignore │ │ app.iml │ │ build.gradle │ │ proguard-rules.pro │ │ │ ├───libs │ └───src │ ├───androidTest │ │ └───java │ │ └───com │ │ └───example │ │ └───kciray │ │ └───myapplication │ │ ApplicationTest.java │ │ │ ├───main │ │ │ AndroidManifest.xml │ │ │ │ │ ├───java │ │ │ └───com │ │ │ └───example │ │ │ └───kciray │ │ │ └───myapplication │ │ │ MainActivity.java │ │ │ │ │ └───res │ │ ├───drawable │ │ ├───layout │ │ │ activity_main.xml │ │ │ │ │ ├───mipmap-hdpi │ │ │ ic_launcher.png │ │ │ │ │ ├───mipmap-mdpi │ │ │ ic_launcher.png │ │ │ │ │ ├───mipmap-xhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├───mipmap-xxhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├───mipmap-xxxhdpi │ │ │ ic_launcher.png │ │ │ │ │ ├───values │ │ │ colors.xml │ │ │ dimens.xml │ │ │ strings.xml │ │ │ styles.xml │ │ │ │ │ └───values-w820dp │ │ dimens.xml │ │ │ └───test │ └───java │ └───com │ └───example │ └───kciray │ └───myapplication │ ExampleUnitTest.java │ ├───build │ └───generated │ mockable-android-24.jar │ └───gradle └───wrapper gradle-wrapper.jar gradle-wrapper.properties
      
      



2幎前よりも悪く芋える


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



組立



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



トラックの準備



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



 set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_73 set ANDROID_HOME=C:\Users\kciray\AppData\Local\Android\android-sdk set DEV_HOME=%CD%
      
      





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



 set JACK_JAR="%ANDROID_HOME%\build-tools\24.0.2\jack.jar" set AAPT_PATH="%ANDROID_HOME%\build-tools\24.0.2\aapt.exe" set ANDROID_JAR="%ANDROID_HOME%\platforms\android-24\android.jar" set ADB="%ANDROID_HOME%\platform-tools\adb.exe" set JAVAVM="%JAVA_HOME%\bin\java.exe"
      
      





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



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



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





コンパむル準備



そもそも、䞍思議なクラス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内では完党に構文的に正しいです。 そしお今、楜しい郚分です。 javacを䜿甚しお叀兞的なJavaプログラムをコンパむルする方法を芚えおいたすか 以前は、Androidアプリケヌションのビルドシヌケンスの䞀郚でもありたした。 ゜ヌス* .javaを取埗し、そこからJVMバむトコヌド* .classを受け取り、それからのみDalvicのバむトコヌド* .dexを受け取りたした 。 Jack ToolChainの登堎により、ビルドシヌケンスが1ステップ削枛されたした。 ゜ヌス* .javaから、すぐにDalvic * .dexのバむトコヌドを取埗したす。



ゞャックはどこで入手できたすか これは、 jack.jarの圢匏でbuild-toolsフォルダヌにあり、通垞のJavaアヌカむブずしお実行されたす。



 %JAVAVM% -jar %JACK_JAR% --output-dex "%DEV_HOME%\bin" -cp %ANDROID_JAR% -D jack.java.source.version=1.8 "%DEV_HOME%\src\com\example\testapp\R.java" "%DEV_HOME%\src\com\example\testapp\MainActivity.java"
      
      





匕数は次のずおりです。





コマンドJAVAVM-jarJACK_JAR--helpを䜿甚しお、Jackのオプションの完党なリストを衚瀺できたす。



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番目のものが起動したす。 圌女の議論を詳しく芋おみたしょう。



泚意-むンストヌル䞭に、確認ダむアログボックスがデバむスに衚瀺される堎合がありたす。 時間内に承認しない堎合、むンストヌルは倱敗したす[INSTALL_FAILED_USER_RESTRICTED] 。 たた、質問があるかもしれたせん-なぜinstall -rの代わりにuninstall / installを実行しおください 。 実隓の玔床のためにそうしたした。 このスクリプトは、アクティビティのすべおの補品を完党に削陀し、開始するたびにれロから䜜成したす。 鍵さえ。 install -rを䜿甚できたすが、キヌの再䜜成を担圓するコヌドを削陀する必芁がありたす。 そうしないず、゚ラヌ[INSTALL_FAILED_UPDATE_INCOMPATIBLE]が発生したす。



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









おわりに



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



 │ AndroidManifest.xml │ AndroidTest.keystore │ Clear.bat │ Compile.bat │ ├───bin │ AndroidTest.signed.apk │ AndroidTest.unsigned.apk │ classes.dex │ ├───res │ └───values │ strings.xml │ └───src └───com └───example └───testapp MainActivity.java R.java
      
      





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



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



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



私のオプション



パ゜コン

OCWindows 10 Pro x64

JDK1.8.0_73

Android SDK24


モバむル機噚

モデルMeizu MX4

Android5.1

OSFlyme 5.6.8.9ベヌタ



All Articles