हम नोटपैड में एंड्रॉइड के लिए हैलोवर्ल्ड लिखते हैं, इकट्ठा करते हैं और लॉन्च करते हैं



जब मैंने एंड्रॉइड सीखना शुरू किया, तो मैं एक आईडीई का उपयोग किए बिना - एंड्रॉइड एप्लिकेशन को मैन्युअल रूप से लिखना और संकलित करना चाहता था। हालांकि, यह कार्य आसान नहीं था और मुझे काफी समय लग गया। लेकिन जैसा कि यह निकला - यह दृष्टिकोण बहुत उपयोगी था और आईडीई को छिपाने वाली कई सूक्ष्मताओं को स्पष्ट किया।

संक्षेप में, यह लेख वर्तमान में आधुनिक JDK (7) और Android SDK (एपीआई स्तर 19) के लिए कमांड लाइन पर लेख बिल्डिंग एंड्रॉइड कार्यक्रमों का अनुवाद और संशोधन है। इसके अलावा, मैंने बहुत सरल किया और खुद से कुछ जोड़ा।

केवल एक नोटपैड का उपयोग करते हुए, हम एक बहुत छोटा शैक्षिक एंड्रॉइड एप्लिकेशन लिखेंगे। और फिर हम इसे संकलित करते हैं, इसे इकट्ठा करते हैं और इसे डिवाइस पर चलाते हैं - और यह सब कमांड लाइन के माध्यम से होता है। में रुचि रखते हैं? तो कृपया।

प्रविष्टि


मैं आश्चर्यचकित था कि एंड्रॉइड स्टूडियो में टेम्पलेट एप्लिकेशन कितना जटिल और भ्रामक है। यह बस संसाधनों के साथ ढेर है। और कुछ हद तक - कोड और स्क्रिप्ट के साथ। हालांकि यह सब करना है HelloWorld प्रदर्शित! इसके अलावा, मैंने जिन किताबों और पुस्तिकाओं को देखा, उनके माध्यम से बताया कि कैसे डायलॉग बॉक्स का उपयोग करके आईडिया या एक्लिप्स हेलोवर्ल्ड बनाया जाए - और आगे का वर्णन पहले से ही आ रहा है। और "हुड के नीचे" क्या होता है - कोई केवल अनुमान लगा सकता है।

लंबी खोज लगभग असफल रही - मुझे इस विषय पर रूसी में लेख नहीं मिले, और अंग्रेजी में पुरानी जानकारी थी और मुझे स्टैकवर्लोफ़र और प्रलेखन के साथ चलते हुए फ़ाइल के साथ कुछ संशोधित करना पड़ा। जब मुझे यह पता चला, तो मैंने इस अंतर को भरने का फैसला किया - अगर कोई काम आता है तो क्या होगा? दरअसल, यह लेख छपा।

हम अपनी खुद की टेम्पलेट परियोजना बनाएंगे, जो प्रशिक्षण के लिए उपयोग करने के लिए आदर्श है। अतिशय कुछ भी नहीं होगा, केवल सबसे जरूरी है। और फिर हम विस्तार से विश्लेषण करेंगे कि इसे कैसे इकट्ठा किया जाए और इसे अपने एंड्रॉइड डिवाइस पर चलाएं। लेख के अंत में अंतिम परियोजना के साथ संग्रह डाउनलोड करने के लिए एक लिंक होगा - यदि आपके कोई प्रश्न हैं - तो आप इसे जांच सकते हैं।

इस प्रकार, आप 100% जागरूक होंगे और अपनी परियोजना की संरचना और उसकी विधानसभा की प्रक्रिया को समझेंगे। यद्यपि यह परीक्षण परियोजना प्रशिक्षण के लिए है, थोड़ा शोधन के साथ, इसका उपयोग आपकी वास्तविक परियोजनाओं के लिए एक ठोस आधार के रूप में किया जा सकता है।

ट्रेनिंग


सबसे पहले, आपके पास जेडीके 7 और एंड्रॉइड एसडीके स्थापित होना चाहिए। बाद में, स्थापना के बाद थोड़ा समायोजित करने की आवश्यकता है।

इस लेख को पढ़ने से पहले मुख्य आवश्यकता यह है कि इंस्टॉल किए गए सॉफ़्टवेयर के अलावा, आपको पहले से ही अपने डिवाइस पर चलने वाले Helloworld को चलाने में सक्षम होना चाहिए जो एक्लिप्स या एंड्रॉइड स्टूडियो के साथ आता है। यानी आपके पास USB ड्राइवर कॉन्फ़िगर होना चाहिए, आपके डिवाइस पर USB डिबगिंग सक्षम होना चाहिए, आदि ... या एक एमुलेटर बनाया और कॉन्फ़िगर किया गया है। ये बहुत प्राथमिक चीजें हैं, और उनका विचार इस लेख के दायरे से परे है - नेटवर्क पर पर्याप्त जानकारी है। वैसे, किताबों के एक-दो अध्यायों को पढ़ना भी अतिश्योक्तिपूर्ण नहीं होगा - कम से कम यह समझना चाहिए कि जावा भाषा की अभिव्यक्तियों, संसाधनों और वास्तव में मूल बातें कैसे व्यवस्थित की जाती हैं। और इस लेख में मैं वर्णन करूंगा कि कौन सी किताबें किस बारे में चुप हैं।

प्रोजेक्ट लेखन


आरंभ करने के लिए, कुछ फ़ोल्डर बनाएं जहां आपका प्रोजेक्ट होगा। चलो उसे मायस्टैप कहते हैं। इसमें 4 और फोल्डर बनाएं - बिन , ओबज , रेस और src

एक खाली पाठ फ़ाइल बनाएं और उसका नाम AndroidManifest.xml पर बदलें। यदि आप एक नौसिखिया विंडोज उपयोगकर्ता हैं, तो आपको एक्सटेंशन के प्रदर्शन को सक्षम करने की आवश्यकता है , अन्यथा फ़ाइल अभी भी पाठ होगी।

इसमें निम्नलिखित जोड़ें:
<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> 

यहां सब कुछ सरल है। हम TestApp नामक एक एप्लिकेशन बनाने का इरादा रखते हैं, जो स्टार्टअप पर MainActivity class शुरू करता है। यह केवल इस छोटे वर्ग को लिखने के लिए बना हुआ है - और आवेदन तैयार है। यदि आवश्यक हो - एंड्रॉइड को संपादित करें: उपयोग-एसडीके टैग में targetSdkVersion गुण - आपके पास जो संस्करण है उसे डालें।

अगला - सबसे सरल संसाधन बनाएं - स्ट्रिंग हैलो टेस्ट ऐप । वास्तव में, हम इस लाइन को सीधे जावा कोड में डालकर बिना संसाधन के कर सकते हैं। लेकिन कुछ विधानसभा चरण संसाधनों के साथ काम करते हैं, और दिलचस्प बिंदुओं को देखने के लिए, हम अभी भी उनके साथ काम करेंगे।

मान फ़ोल्डर को res फ़ोल्डर में बनाते हैं। सभी संसाधनों को फ़ोल्डर्स में विभाजित किया जाना चाहिए। अगला - इसमें एक खाली स्ट्रिंग बनाएँ। xml फ़ाइल। और उसमें लिखें
 <resources> <string name="hello">Hello test app!</string> </resources> 

हमें जो भी संसाधन चाहिए। सरल, सही? अगला, src के अंदर कॉम फ़ोल्डर बनाएं, इसमें उदाहरण फ़ोल्डर, फिर पदानुक्रम में और भी कम परीक्षण- फ़ोल्डर - और हमारी 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 

और यह वास्तव में वह सब है जो हमें एक साधारण परियोजना के लिए आवश्यक था। तुलना के लिए -
एंड्रॉइड स्टूडियो से हैलोवर्ल्ड
 .gitignoreAndroidStudioHWProject.imlbuild.gradlegradlewgradlew.batlocal.propertiessettings.gradle │ ├───.gradle │ └───1.8 │ └───taskArtifactscache.propertiescache.properties.lockfileHashes.binfileSnapshots.binoutputFileStates.bintaskArtifacts.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 │ │ │ └───scopesscope_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-w820dpdimens.xml │ └───gradle └───wrapper gradle-wrapper.jar gradle-wrapper.properties 

वास्तव में, ग्रेडिंग के माध्यम से स्वचालन, गिट और आईडीई के साथ काम करना बहुत महत्वपूर्ण चीजें हैं, लेकिन एंड्रॉइड सीखने के चरण में मैं वास्तव में उन्हें अनदेखा करना चाहूंगा

सभा


अब हम सबसे महत्वपूर्ण और कठिन अवस्था में आते हैं। हम कमांड लाइन के साथ बहुत काम करेंगे, इसलिए मेरा सुझाव है कि आप यहां दिए गए सभी कमांड को एक फाइल में लिखें और इसे 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% 

अगला - सीधे कार्यक्रमों के लिए पथ। मेरा सुझाव है कि आप अपने एसडीके के कैटलॉग ब्राउज़ करें और सुनिश्चित करें कि सब कुछ जगह में है। रास्तों में मौजूद संस्करणों को भी समायोजित करें।
 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 उपयोगिता प्लेटफ़ॉर्म-टूल्स में स्थित थी - और मैं इसे बाहर नहीं करता कि यह और / या अन्य कहीं और चुपके कर सकते हैं। इसलिए सावधान रहें। यदि आप अभी सब कुछ जांचते हैं, तो बाकी लेख को आसानी से जाना चाहिए।

और फिर भी - कुछ चरों में हम अपने संकुल और वर्गों को मार देंगे। यदि आप उन्हें बदलने के लिए जाते हैं - तो आपको कोड के आसपास चलने की ज़रूरत नहीं है - सभी सेटिंग्स पहले हैं।
 set PACKAGE_PATH=com/example/testapp set PACKAGE=com.example.testapp set MAIN_CLASS=MainActivity 

संकलन की तैयारी

और अब मज़ेदार हिस्से के लिए। याद रखें कि क्लासिक जावा प्रोग्राम 2 लाइनों में कैसे संकलित और चलते हैं? यहां हम एक ही जेवैक का उपयोग करते हैं, हालांकि, इसके अलावा, हमें कई और उपयोगिताओं का उपयोग करना होगा।

शुरू करने के लिए, मैं पूछूँगा - क्या आपने कभी सोचा है कि रहस्यमय श्रेणी 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 - एंड्रॉइड एसेट पैकेजिंग टूल - शाब्दिक रूप से "एंड्रॉइड संपत्ति का पैकर।" इसके विकल्प:

इसके निष्पादन के बाद, वही R.java फ़ाइल src डायरेक्टरी में दिखाई देनी चाहिए। इसे देखें।

अब हमारी परियोजना में कोई जादू नहीं है और नियमित रूप से जावा कंपाइलर के लिए यह पूरी तरह से सही है। इसका संकलन करते हैं।
 call %JAVA_HOME%/bin/javac -d %DEV_HOME%/obj -cp %ANDROID_JAR% -sourcepath %DEV_HOME%/src %DEV_HOME%/src/%PACKAGE_PATH%/*.java 

यदि आपने पहले जावा के साथ काम किया है, तो इस लाइन को समझना आपके लिए मुश्किल नहीं है। हालाँकि, मैं फिर भी समझाऊंगा कि क्या हो रहा था:

निष्पादन के बाद, ओब्ज फोल्डर में बायटेकोड (* .class) के रूप में हमारी कक्षाओं के साथ पैकेज होना चाहिए। लेकिन यह दुर्भाग्य है - एंड्रॉइड वर्चुअल मशीन इसके साथ संगत नहीं है! लेकिन इसकी कल्पना की गई थी और इसके कारण हैं। और हम एक कनवर्टर का उपयोग करते हैं जो वर्ग फ़ाइलों से एक डीएक्स फ़ाइल बनाता है जो हमारे ग्रीन आर 2 डी 2 के लिए समझ में आता है।
 call %DX_PATH% --dex --output=%DEV_HOME%/bin/classes.dex %DEV_HOME%/obj 

--Dex विकल्प बताता है कि हमें * .class से * .dex में बदलने की आवश्यकता है। फिर विकल्प --output के बाद हम परिणामी classes.dex फ़ाइल में पथ सेट करते हैं। और इस कमांड में अंतिम तर्क सीधे * .class फ़ाइलों वाले संकुल का पथ है

सुनिश्चित करें कि हमारे classes.dex बिन फ़ोल्डर में है। अब आपको बस इतना करना है कि संसाधनों के साथ इसे एक एपीके फ़ाइल में पैक करना है। चलो इसे करते हैं:
 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 अब बिन फ़ोल्डर में दिखाई देनी चाहिए। और हमने इसे एक कारण के लिए बुलाया! उसके पास डिजिटल हस्ताक्षर नहीं है। एंड्रॉइड एक हस्ताक्षर के बिना अनुप्रयोगों को स्थापित करने और चलाने पर प्रतिबंध लगाता है। लेकिन इसे बनाना इतना मुश्किल नहीं है क्योंकि यह पहली नज़र में लग सकता है
 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 

दरअसल, ये लाइनें 2 जावा उपयोगिताओं को चलाती हैं जिनका एंड्रॉइड एसडीके से कोई लेना-देना नहीं है - लेकिन वे आवश्यक हैं। पहला AndroidTest.keystore फ़ाइल (इसकी उपस्थिति के लिए जाँच) बनाता है, और दूसरा इस फ़ाइल को AndroidTest.unsigned.apk से जोड़ता है। यह AndroidTest.signed.apk फ़ाइल को चालू करता है। यहाँ इस तरह की एक जंगली शिल्प फ़ाइल है। लेकिन एक बार जब आप बैट स्क्रिप्ट बना लेते हैं, तो उसे चलाएं - और यह सब स्वचालित मोड में होगा।

मुझे लगता है कि आपको इस लेख में इन उपयोगिताओं के लिए विकल्पों के विस्तृत विश्लेषण पर समय नहीं बिताना चाहिए। आपको बस बिंदु को पकड़ने की ज़रूरत है - वे AndroidTest.unsigned.apk लेते हैं, इसे AndroidTest.keystore फ़ाइल के साथ साइन इन करते हैं और इसे AndroidTest.signed.apk में सहेजते हैं। आप चाहें तो डॉक्यूमेंटेशन पढ़ सकते हैं।

आपको सबसे अधिक चेतावनी " चेतावनी: नहीं -tsa या -tsacert प्रदान की जाती है और यह जार ... " है, लेकिन ध्यान न दें।

लांच

अब जब हमने आखिरकार अपनी एपीके फाइल संकलित कर ली है, तो हम इसे चला सकते हैं। अपने डिवाइस को usb के माध्यम से कनेक्ट करें, या एमुलेटर चलाएं। और फिर करते हैं
 call %ADB% uninstall %PACKAGE% call %ADB% install %DEV_HOME%/bin/AndroidTest.signed.apk call %ADB% shell am start %PACKAGE%/%PACKAGE%.%MAIN_CLASS% 

दरअसल, पहली पंक्ति प्रोग्राम को हटा देती है, अगर यह पहले से ही हो। बार-बार लॉन्च के लिए काम आता है। दूसरा - आपके डिवाइस या एमुलेटर पर एपीके इंस्टॉल करता है। तीसरा लॉन्च हुआ। आइए उसके तर्कों पर एक नज़र डालें:

यदि सब कुछ ठीक रहा, तो आप कुछ इस तरह देखेंगे:


निष्कर्ष


सभी फ़ाइलों को इकट्ठा करने के बाद, डायरेक्टरी ट्री को कुछ इस तरह देखना चाहिए।
 │ 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 

अब आप स्पष्ट रूप से देख और समझ सकते हैं कि निचले स्तर पर एंड्रॉइड एप्लिकेशन की असेंबली कैसे होती है। जब आप आईडीई का उपयोग करते हैं - यदि असेंबली अचानक गलत हो जाती है (और यह अक्सर होता है) - आप स्थिति को हल कर सकते हैं जैसा कि इसे करना चाहिए। यह भी ध्यान दें कि अंतिम एपीके फ़ाइल केवल 4 किलोबाइट के बारे में है

मैं प्रोजेक्ट आर्काइव (फाइल-डाउनलोड पर क्लिक करें) अपलोड करता हूं । कृपया ध्यान दें कि मैंने वहां एक और छोटी स्क्रिप्ट जोड़ी है - clear.bat। यह असेंबली के दौरान बनाई गई सभी फ़ाइलों को हटा देता है। और comp.bat की शुरुआत में अपनी शुरुआत की। रेम के बाद टिप्पणी भी जोड़ा - कदम से कदम।

इस प्रकार, स्क्रिप्ट हस्ताक्षर सहित परियोजना की पूरी सफाई और पुनर्निर्माण करता है, साथ ही इसे डिवाइस पर हटा रहा है, इंस्टॉल कर रहा है और चला रहा है।

Source: https://habr.com/ru/post/In210584/


All Articles