سلام سلام سلام
امروز داشتم برا یکی از دوستام یه برنامه اندروید اجرا میگرفتم. متاسفانه به اندروید استودیو دسترسی نداشتیم. بیابون بود! تصمیم گرفتم بصورت خط فرمان (command line
) خروجی APK رو براش تولید کنم. بعد بهم پیشنهاد داد این آموزش رو منتشر کنم.
فعلا به صورت ساده توضیح میدم ولی در ویرایش بعدی(فرصتش بیاد) جزئیات و کلی چیزای باحال بهش اضافه میکنم.
خب بسم الله.
چند تا گام باید پیش بریم:
من از Ubuntu 18.04 برا این آموزش استفاده میکنم.
اول از همه اطمینان حاصل کنین که جاوا روی سیستم تون نصب هست و SDK
روی سیستم قرار داره. مسیر SDK
من توی پوش /home/saeed/Android
هست.
خب در ادامه میخوام یه پروژه ساده رو بالا بیارم تا در نهایت فایل APK
اون رو به عنوان خروجی نشون بدیم. یه پروژه ساده که وقتی روی دستگاه اندرویدی تون نصب میشه، عبارت سلام ویرگول! رو نشون میده.
من یه پوشه به اسم HelloVirgool
تو صفحه دستکتاپم درست میکنم و بعد ساختار پوشه بندی اندروید (اندروید یه ساختار پوشه بندی مشخص داره) رو بهش اضافه میکنم.
با دستورات زیر این ساختار رو ایجاد میکنم:
mkdir -p src/com/example/hellovirgool mkdir obj mkdir bin mkdir -p res/layout mkdir -p res/values mkdir -p res/drawable
حالا بریم تو پوشه src/com/example/hellovirgool
یه فایل جاوا به اسم MainActivity.java
بسازیم. من این محتویات رو داخلش میریزم.
package com.example.hellovirgool; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
تو پوشه res/layout
هم فایل layout
رو با مقدار زیر قرار بدیم (من برا سادگی کار ازینا استفاده کردم. شما تغییرات دلخواه تون رو انجام بدین).
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="سلام ویرگول!" android:textSize="40sp" /> </RelativeLayout>
خب همه مون میدونیم فایل AndroidManifest.xml
از واجبات هست چرا که باید اکتیویتی هامون رو اینجا تعریف کنیم. کدهای زیر رو براش کپی کنین. ضمن اینکه من تو پوشه drawable
یه آیکون برای برنامه ذخیره کردم که در این فایل و در تگ application
میتونین ببینین.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hellovirgool"> <uses-sdk android:minSdkVersion="14" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="Hello Virgool" android:roundIcon="@drawable/ic_launcher" android:supportsRtl="true"> <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>
الان کدهامون آماده ست. بریم کدهامون رو Build
کنیم.
فقط برای اینکه از طولانی شدن دستورات جلوگیری کنم، اجازه بدین مسیر پروژه و مسیر SDK
رو با دستورات زیر داخل دو متغیر ذخیره کنم:
export PRJ=/home/saeed/Desktop/HelloVirgool export SDK=/home/saeed/Android/Sdk
اول از همه نیاز هست که فایل R.java
رو تولید کنیم. من این فایل رو به صورت زیر تولید میکنم. اول میرم به پوشه build-tools/29.0.2
:
cd $SDK/build-tools/29.0.2/
بعد دستور زیر رو اجرا میگیرم:
./aapt package -f -m -J $PRJ/src -M $PRJ/AndroidManifest.xml -S $PRJ/res -I $SDK/platforms/android-29/android.jar
خب حالا وقتشه که فایلهای جاوا مون رو کامپایل کنیم. برای اینکار بریم تو پوشه root پروژه (HelloVirgool
) و دستور زیر رو اجرا بگیریم:
javac -source 1.7 -target 1.7 -d obj -classpath src -sourcepath $SDK/platforms/android-29/android.jar src/com/example/hellovirgool/*.java
جاوا 1.7
استفاده کردم. شما اگه به مشکل برخوردین جاوا 1.8
یا یه نسخه دیگه رو امتحان کنین.javac
براتون پیدا نشد، دستور زیر رو تو ترمینال بزنین تا نصب بشه (فک کنم حدود ۲۰۰ مگ باید حجم داشته باشه):sudo apt-get install default-jdk
تا اینجا یه سری فایل با پسوند class
برامون تولید میشه که در پوشه obj قرار داره (یه نگاه بهش بندازین). اما اما اندروید نمیتونه اونا رو بخونه. باید اونها رو به classes.dex
تبدیل کنیم تا قابل خوندن برای اندروید باشه. پس بریم این دستور رو یه تست بگیریم ببینیم چی میشه:
اول بریم به پوشه build-tools/29.0.2
با دستور زیر:
cd $SDK/build-tools/29.0.2/
حالا دستور زیر رو اجرا بگیریم:
./dx --dex --output=$PRJ/bin/classes.dex $PRJ/obj
دیگه وقتشه که فایل APK
مون رو تولید کنیم:
./aapt package -f -m -F $PRJ/bin/hello.apk -M $PRJ/AndroidManifest.xml -S $PRJ/res -I $SDK/platforms/android-29/android.jar
cp $PRJ/bin/classes.dex .
./aapt add $PRJ/bin/hellovirgool.apk classes.dex
یه مشکل کوچیک هست فقط. باید برنامه رو امضا کنیم تا روی دستگاه نصب بشه.
اگه یه امضا دارین که میتونین با دستور زیر نسخه نهایی APK
رو استخراج کنین.
./apksigner sign --ks mykey.keystore $PRJ/bin/hellovirgool.apk
اگه امضا برای برنامه ندارین، به روش زیر یه امضا تولید کنین و برگردین دستور بالا رو تایپ کنین.
خیلی ساده ست. برای اینکه یه امضا تولید کنیم (فایل keystore
) کافیه از دستور keytool
به صورت زیر استفاده کنیم:
keytool -genkeypair -validity 365 -keystore mykey.keystore -keyalg RSA -keysize 2048
به سوالایی که میاد جواب بدین.
به راحتی فایل به نام mykey.keystore
تولید میشه.
بهترین باشین ❤️