PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [تخصصی] بررسی و آشنایی با ساختار apk



M_J_Nazari
03-02-2012, 03:20
این مطالب طبق تجربه ی شخصی نوشته شده است، به مرور زمان اصلاح و کامل خواهد شد.

این مطلب هنوز کامل نیست.

تیم آمستریس
------------------------------------------------------------------------------

آیا میتوانیم هر فایلی را که خواستیم به فایل apk اضافه کنیم؟

اضافه کردن فایل ها در اندروید، ساختار زنجیره واری دارد.

در فایل های Apk تمامی فایل ها و مشخصات دارای کد هستند، این کدها با ساختار هگزادسیمال کد بندی شده اند ( ساختار 16 تایی).

برای توضیح سئوال بالا یه مثال میزنم:
فرض کنید می خواهید یک فایل گرافیک png را به فایل apk اضافه کنید.
ابتدا باید فایل png مورد نظر را برای رزولوشن صفحه ی موبایل یا وسیله ی مورد نظرتان طراحی کنید.

HDPI
MDPI
X-HDPI
LDPI
سپس فایل مورد نظر را درون فولدر drawable-xxxx کپی بزنید.
xxxx - مشخصات dpi وسیله ی مورد نظر شماست.

پس از کپی فایل درون فولدر drawable ، باید آنرا در ساختار کلی فایل Apk معرفی کنید. به این منظور باید آنرا درون فایل public.xml معرفی کنید.


xxxxx.apk\res\values\public.xml
فایل public.xml نشان دهنده ی تمام عناصر درون Apk میباشد، که هر یک دارای کد مخصوصی میباشد. در سیستم عامل اندروید، فایل ها بوسیله ی کدهای معرفی شده در public.xml ردیابی میشوند، نام ها تاثیری ندارند.

در فایل public.xml، معمولا ساختار زیر تعریف میشوند:
چندتا نمونه را ببینید: فایل Contacts.apk



<public type="attr" name="mimeType" id="0x7f010000" />

<public type="drawable" name="btn_create" id="0x7f02000c" />

<public type="layout" name="act_display_groups" id="0x7f030000" />

<public type="anim" name="quickcontact" id="0x7f040000" />
<public type="xml" name="searchable" id="0x7f050000" />
<public type="array" name="dialog_items" id="0x7f060000" />
<public type="id" name="left" id="0x7f070000" />
<public type="color" name="textColorIconOverlay" id="0x7f080000" />
<public type="dimen" name="linked_contact_icon_size" id="0x7f090000" />
<public type="string" name="config_import_vcard_type" id="0x7f0b0000" />
<public type="bool" name="config_allow_import_from_sdcard" id="0x7f0a0000" />
<public type="integer" name="config_export_file_min_index" id="0x7f0c0000" />
<public type="plurals" name="groupDescrip" id="0x7f0d0000" />
<public type="style" name="DialtactsTheme" id="0x7f0e0000" />
<public type="menu" name="edit" id="0x7f0f0000" />در کدهای بالا، تمامی نوع های فایلی که برای Contacts.apk مشخص شده بود رو گذاشتم، تا به بررسی اونا بپردازیم.

همونطور که میبینیم نوع فایل ها با public type معرفی میشوند.
که از نوشته های بالا میبینیم که نوع فایل هایی که در این نرم افزار استفاده شده است به شرح زیر است:

attr : بیشتر برای کد بندی پارامترهای معرفی شده بکار میرود. مشخصات این فایل ها از آدرس زیر قابل ردیابی است:

\res\values\attrs.xmldrawable : برای کدبندی فایل های گرافیکی بکار میرود. فایل های گرافیکی درون فولدر های
drawable و مقادیر تعریف شده در فایل
\res\values\drawables.xml قرار دارند.

array : مثل مقادیر Attr اطلاع زیادی ازش ندارم. آدرس فایل های تعریف شده درون فایل زیر میباشند.

\res\values\arrays.xmlid :برای کد بندی مشخصات بکار رفته در نرم افزار استفاده میشوند.

color: مربوط به رنگ های تعریف شده در فایل زیر میباشند:

\res\values\colors.xmldimen : برای کد بندی اندازه هایی که در فایل زیر تعریف شده اند بکار میرود.

\res\values\dimens.xmllayout : برای کدبندی لایه ها و ساختار اینترفیس نرم افزار بکار میرود. برای معرفی فایل های درون فولدرهای Layout بکار میرود.
فولدر های Layout میتوانند بسته به اندازه های رزولوشن از یک تا چندین فولدر باشند. بستگی به قابلیت های نرم افزار دارد. ترتیب قرار گیری فایل های گرافیکی نرم افزار در این فولدر ها مشخص میشود.
مثلا برای استتس بار ، ترتیب قرار گیری Toggles .

\res\layoutanim : کد بندی انیمیشن هایی که برای نرم افزار تعریف میشوند (بیشتر برای ترانزیشن های صفحات بکار میرود.) فایل های تعریف شده درون فولدر anim هستند.


xml : فایل های xml که درون فولدر xml تعریف میشوند. فایل ها در فولدر xml هستند.

string : برای کد بندی استرینگ ها بکار میرود، استرینگ چیست؟
استرینگ ها برای تعریف نام ها بیشتر کاربرد دارند، مثلا نام نرم افزار، نام منو ها، نام دکمه ها و هر متغییر دیگه ای که همراه با نام باشد، شما هر نوشته و یا متنی را که در نرم افزار میبینید در فایل استرینگ تعریف میشود.

استرینگ ها در فایل زیر نوشته میشوند.

res/values/strings.xmlدر این مورد بیشتر توضیح خواهم داد.

bool: برای کد بندی bool های تعریف شده در نرم افزار بکار میرود، شما میتوانید لیست bool ها را از فایل زیر ببینید:

res/values/bools.xmlinteger : برای تعریف مقادیر و داده های تعریف شده در فایل های xml بکار میرود.
لیست اینتیجر ها را از فایل زیر میتوانید ببینید:

res/values/integers.xmlplurals : برای کد بندی پلورلز بکار میرود، اطلاع دقیق ندارم. لیست پلورلز در فایل زیر است:

res/values/plurals.xmlstyle : برای کد بندی استایل های طراحی شده (تم) در نرم افزار بکار میرود.
تنظیمات استایل ها در فایل زیر گنجانده شده است:

res/values/styles.xml--------------------------------------------------
فایل ها به چه ترتیبی کد بندی میشوند؟
همونطور هم که در اول این تاپیک گفتم، فایل ها به ترتیب هگزادسیمال کدبندی میشوند:

هگزادسیمال چیست؟
کد بندی 16 تایی است، که به ترتیب از حروف زیر تشکیل میشود:


0 >1 >2 > 3> 4> 5> 6> 7> 8> 9> a> b> c >d >e >fترتیب کد بندی در public.xml چگونه هست؟

به id های تعریف شده در هر public type دقت کنید:

<public type="attr" name="mimeType" id="0x7f010000" />مقدار id = 0x7f010000 تعریف شده برای نوع attr میباشد.

معمولا چهار یا پنج نوشته ی اول، ثابت هستند.
نوع public type از حرف ششم شروع شده و برای public type بعدی به مقدار بالاتر ارتقا مییابد.

به حروف ششم پابلیک تایپ های تعریف شده دقت کنید:


<public type="attr" name="mimeType" id="0x7f010000" />
<public type="drawable" name="btn_create" id="0x7f020000" />
<public type="layout" name="act_display_groups" id="0x7f030000" />
<public type="anim" name="quickcontact" id="0x7f040000" />
<public type="xml" name="searchable" id="0x7f050000" />
<public type="array" name="dialog_items" id="0x7f060000" />
<public type="id" name="left" id="0x7f070000" />
<public type="color" name="textColorIconOverlay" id="0x7f080000" />
<public type="dimen" name="linked_contact_icon_size" id="0x7f090000" />
<public type="bool" name="config_allow_import_from_sdcard" id="0x7f0a0000" />
<public type="string" name="config_import_vcard_type" id="0x7f0b0000" />
<public type="integer" name="config_export_file_min_index" id="0x7f0c0000" />
<public type="plurals" name="groupDescrip" id="0x7f0d0000" />
<public type="style" name="DialtactsTheme" id="0x7f0e0000" />
<public type="menu" name="edit" id="0x7f0f0000" />و ......

با معرفی هر گونه type جدید، باید مقدار فوق را یک درجه بالاتر تعریف کنیم.


تمامی فایل ها از 0000 شروع میشوند و تا آخرین مقدار همان TYPE فایل ادامه میابند.

حالا این شرایط تعریف نوع PUBLIC TYPE بود، حالا در اینجا نحوه ی اضافه کردن فایل های دیگر از یک نوع خاص public type را یاد میگیریم:


بالفرض ما میخواهیم ، 3 تا فایل جدید به drawable ها اضافه کنیم:
3 تا فایل اضافه شونده باید به آخرین مقدار تعریف شده در drawable ها اضافه شود.

در اینجا فرض میکنیم، که آخرین فایل تعریف شده با همان id اولیه است.

برای مثال میخواهیم 3 فایل جدید به نام های زیر رو که برای رزولوشن hdpi ساخته ایم را به public.xml اضافه کنیم:


amestris_01.png
amestris_02.png
amestris_03.png
میدانیم که id تعریف شده برای drawables مقدار زیر است:

<public type="drawable" name="btn_create" id="0x7f020000" />برای افزودن فایل های بعدی به طریق زیر عمل میکنیم:


<public type="drawable" name="btn_create" id="0x7f020000" />
<public type="drawable" name="amestris_01" id="0x7f020001" />
<public type="drawable" name="amestris_02" id="0x7f020002" />
<public type="drawable" name="amestris_02" id="0x7f020003" />همین روند ادامه خواهد داشت.....

حالا بالفرض میخواهیم ، یک استرینگ جدید تعریف کینم:

برای اینکار ابتدا فایل strings.xml را باز میکنیم، و سپس استرینگ جدیدی را به همان ساختاری که تعریف شده را تعریف میکنیم:

بالفرض میخواهیم برای string با نام amestris عبارت Amestris Team را اضافه کنیم.

در فایل strings.xml باز شده، مقدار زیر را اضافه میکنیم:


<string name="amestris">Amestris Team</string>
این عبارت نشان میدهد که هر جا string به نام amestris تعریف شود، عبارت Amestris Team نشان داده خواهد شد.

حالا باید این استرینگ تعریف شده را به public.xml اضفه کنیم.
به این منظور فایل public.xml را باز میکنیم و در قسمت strings اینگونه عمل میکنیم:

میدانیم که آی دی استرینگ ها اینگونه هست:

<public type="string" name="config_import_vcard_type" id="0x7f0b0000" />حالا ما استرینگ آمستریس را اضافه میکنیم:


<public type="string" name="config_import_vcard_type" id="0x7f0b0000" />
<public type="string" name="amestris" id="0x7f0b0001" />فایل را ذخیره میکنیم.



تیم آمستریس

mplove
03-02-2012, 09:14
سلام.ممنون از اموزش های بسیار خوبتون.
اینجا (http://forum.mobilestan.net/showpost.php?p=2636045&postcount=90)رو نگاه کنید من خیلی ساده تونستم ایکون این برنامه ها رو به تم خودم اضافه کنم.
اول برنامه ها رو دیکامپایل کردم بعد اسم پکیجشون رو نگاه کردم بعد تو xml ها یه فایلی همنام همون اسم پکیج درست کردم بعد محتویاتش رو مثل برنامه های دیگه کردم فقط اسم برنامه مربوط رو معرفی کردم بعد کامپایل کردم اینجوریapk manager تو public یه I'd واسه برنامه درست می کنه.امیدوارم کمک کوچکی کرده باشه
اینجا (http://forum.mobilestan.net/showpost.php?p=2636939&postcount=91)رو هم نگاه کنید چرا با این کار مشکل بعضی از تم های سیانوژن برطرف می شه؟و چجوری می شه هم پیش نمایش داشت و هم تم بتونه انتخاب بشه؟:ax:

M_J_Nazari
03-02-2012, 14:49
سلام.ممنون از اموزش های بسیار خوبتون.
اینجا (http://forum.mobilestan.net/showpost.php?p=2636045&postcount=90)رو نگاه کنید من خیلی ساده تونستم ایکون این برنامه ها رو به تم خودم اضافه کنم.
اول برنامه ها رو دیکامپایل کردم بعد اسم پکیجشون رو نگاه کردم بعد تو xml ها یه فایلی همنام همون اسم پکیج درست کردم بعد محتویاتش رو مثل برنامه های دیگه کردم فقط اسم برنامه مربوط رو معرفی کردم بعد کامپایل کردم اینجوریapk manager تو public یه I'd واسه برنامه درست می کنه.امیدوارم کمک کوچکی کرده باشه
اینجا (http://forum.mobilestan.net/showpost.php?p=2636939&postcount=91)رو هم نگاه کنید چرا با این کار مشکل بعضی از تم های سیانوژن برطرف می شه؟و چجوری می شه هم پیش نمایش داشت و هم تم بتونه انتخاب بشه؟:ax:

سلام
ساختار Apkmanager خیلی متفاوت هست، توی Apkmanager شما هر فایلی رو که اضافه کنید، نرم افزار بصورت اتوماتیک اونو به public.xml اضافه میکنه.

توی آموزش های با apkmanager ، قابلیت هاش رو به طور کامل توضیح میدم.
ولی شما برای api های بالاتر از 10 دیگه نمیتونید از Apkmanager استفاده کنید، مگه اینکه فایل apktools آپدیت بشه.


شما در دیکامپایل با Apktools باید ساختار Api level رو معرفی کنید.


برای جواب سئوالتون، هم باید گفت که بخاطر اینکه احتمالا تم هایی که استفاده کردید مربوط به نسخه های قدیمی بوده، باید چک کنید که برای کدوم نسخه sdk و api طراحی شده.

اون رفع باگ فقط اصلاح آدرس هست نه چیز دیگه ای.

در مورد پیش نمایش اطلاعی ندارم ، کلا با بیس های سیانوژن حال نمیکنم.

ای کاش سئوالت رو توی بخش پرسش و پاسخ میپرسیدی. چون اینجا جاش نبود.


با تشکر



--ویرایش:
برای رفع مشکل نشون دادن تم ، میتونی تم هایی که درست هستند رو با این نسخه ای که شما داری چک کنی، ببینی کدوم خاصیت و مقدار تعریف نشده و یا فرق داره!

M_J_Nazari
03-02-2012, 16:42
فرض میکنیم آی دی public type برای drawables اولیه این مقدار هست
id="0x7f010000

برای تعریف های آی دی های بعدی از این public type داریم:

id="0x7f010001
id="0x7f010002
id="0x7f010003
id="0x7f010004
id="0x7f010005
id="0x7f010006
id="0x7f010007
id="0x7f010008
id="0x7f010009
id="0x7f01000a
id="0x7f01000b
id="0x7f01000c
id="0x7f01000d
id="0x7f01000e
id="0x7f01000f
id="0x7f010010
id="0x7f010011
id="0x7f010012
id="0x7f010013
id="0x7f010014
id="0x7f010015
.
.
id="0x7f01001e
id="0x7f01001f
id="0x7f010020
id="0x7f010021
id="0x7f010022
.
.
id="0x7f01002e
id="0x7f01002f
id="0x7f010030
id="0x7f010031
.
.
id="0x7f01003f.
id="0x7f010040
.
.
id="0x7f01004f
id="0x7f010050
.
id="0x7f01005f
.
.
.
id="0x7f0100ff
id="0x7f010100
id="0x7f010101
id="0x7f010102
id="0x7f010103
.
.
.
id="0x7f010fff
id="0x7f011000
..

...
.....

به همین روال تکرار خواهد شد.