سعید حسنی
سعید حسنی
خواندن ۴ دقیقه·۴ سال پیش

تولید فایل APK بدون اندروید استودیو و هیچ IDE دیگه ای!

توسعه اندروید وقتی دستت خالیه!
توسعه اندروید وقتی دستت خالیه!

سلام سلام سلام

امروز داشتم برا یکی از دوستام یه برنامه اندروید اجرا میگرفتم. متاسفانه به اندروید استودیو دسترسی نداشتیم. بیابون بود! تصمیم گرفتم بصورت خط فرمان (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=&quot1.0&quot encoding=&quotutf-8&quot?> <RelativeLayout xmlns:android=&quothttp://schemas.android.com/apk/res/android&quot xmlns:tools=&quothttp://schemas.android.com/tools&quot android:layout_width=&quotmatch_parent&quot android:layout_height=&quotmatch_parent&quot tools:context=&quot.MainActivity&quot> <TextView android:layout_width=&quotwrap_content&quot android:layout_height=&quotwrap_content&quot android:layout_centerInParent=&quottrue&quot android:text=&quotسلام ویرگول!&quot android:textSize=&quot40sp&quot /> </RelativeLayout>

خب همه مون میدونیم فایل AndroidManifest.xml از واجبات هست چرا که باید اکتیویتی هامون رو اینجا تعریف کنیم. کدهای زیر رو براش کپی کنین. ضمن اینکه من تو پوشه drawable یه آیکون برای برنامه ذخیره کردم که در این فایل و در تگ application میتونین ببینین.

<?xml version=&quot1.0&quot encoding=&quotutf-8&quot?> <manifest xmlns:android=&quothttp://schemas.android.com/apk/res/android&quot package=&quotcom.example.hellovirgool&quot> <uses-sdk android:minSdkVersion=&quot14&quot /> <application android:allowBackup=&quottrue&quot android:icon=&quot@drawable/ic_launcher&quot android:label=&quotHello Virgool&quot android:roundIcon=&quot@drawable/ic_launcher&quot android:supportsRtl=&quottrue&quot> <activity android:name=&quot.MainActivity&quot> <intent-filter> <action android:name=&quotandroid.intent.action.MAIN&quot /> <category android:name=&quotandroid.intent.category.LAUNCHER&quot /> </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

به سوالایی که میاد جواب بدین.

  • سوال اول: یه رمز برا خودت انتخاب کن
  • سوال دوم: رمزی که انتخاب کردی رو دوباره وارد کن
  • سوال سوم: نام و نام خانوادگی تو وارد کن، به انگلیسی :(
  • سوال چهارم: مثلا بنویس Unit
  • سوال پنج: مثلا بنویس Virgool
  • سوال ششم: اسم شهرت رو وارد کن، مثلا من مینویسم Birjand
  • سوال هفتم: نام استانت رو وارد کن. مثلا من مینویسم South-Khorasan
  • سوال هشتم: تایپ کن IR
  • در آخر تایپ کن yes و کلید Enter رو بزن.

به راحتی فایل به نام mykey.keystore تولید میشه.


بهترین باشین ❤️

اندرویدideبرنامه نویسیاندروید استودیوeclipse
یه برنامه نویس خوشحال ツ تلگرامم: TheCoderLife
شاید از این پست‌ها خوشتان بیاید