מדריך | מבנה קובץ APK
-
כל הזכויות שמורות. אין להעתיק!
כיוון שהרבה כאן שאלו על עריכת אפליקציות, וכתבתי כמה וכמה פעמים שזה עסק מורכב ודורש היכרות עם מבנה הAPK, ואין דרך אחת, החלטתי לכתוב מדריך.
אבל...
זה עסק מסובך, וארוך, אז לא היה לי כוח לכתוב לבד.
ביקשתי מצ'אט GPT, וערכתי את מה שהוא כתב לפי הידע שלי. (וזה המון עבודה. התרשימים, העריכה, הדיוק שלו, להפנות אותו לכתוב על הדברים הנצרכים)אז בואו נתחיל.
שלב ראשון - מבנה קובץ הAPK
קבצים מסומנים בכחול, תיקיות בכתוםAndroidManifest.xml: קובץ זה מכיל מידע קריטי על האפליקציה כמו שם החבילה, פעילויות (activities), הרשאות (permissions) ועוד.
META-INF/: תיקיה זו מכילה קבצים הקשורים לאימות והחתימה הדיגיטלית של האפליקציה.
MANIFEST.MF: קובץ זה מכיל רשימה של כל הקבצים ב-APK עם חתימותיהם.
CERT.RSA ו-CERT.SF: קבצים אלו מכילים את החתימה הדיגיטלית של האפליקציה.lib/: תיקיה זו מכילה ספריות קוד מקוריות (native libraries) שתומכות בארכיטקטורות שונות של מעבדים כמו ARM, x86 ועוד.
assets/: תיקיה זו מכילה קבצים נוספים שמשתמשי האפליקציה יכולים לגשת אליהם בזמן ריצה.res/: תיקיה זו מכילה את כל משאבי האפליקציה כמו קבצי תמונה, קבצי XML, פריסות (layouts) ועוד.
classes.dex: קובץ זה מכיל את הקוד הבינארי של האפליקציה בפורמט Dalvik Executable (DEX). או בקיצור - SMALI.
resources.arsc: קובץ זה מכיל מידע על המשאבים של האפליקציה בצורה מכווצת. (ועורכי הAPK מבוססי APKTOOL, מחלצים את התיקיות והקבצים שבתוכו לתוך תיקיית res)
שלב שני - תיקיות lib וassets
תיקיות אלו לא נמצאות בכל האפליקציות, בתיקיית lib יהיו ספריות קוד שבהם האפליקציה עושה שימוש.
בתיקיית assets - קבצים חיצוניים, למשל קבצי טקסט, שהאפליקציה עושה בהם שימוש.שלב שלישי - תיקית res
תיקיית res (קיצור של Resources) מכילה את כל המשאבים הסטטיים שהאפליקציה שלך משתמשת בהם. המשאבים האלו יכולים לכלול פריסות ממשק משתמש, מחרוזות, תמונות, ערכים שונים ועוד. להלן פירוט על התיקיות השונות הנמצאות בתיקיית res ועל סוגי הקבצים שהן מכילות:
שימו לב! אני מתאר כאן את תיקיית res לאחר פריקת קובץ הresources.arsc לתוכה. בMT MANAGER התיקיות השייכות אליו יהיו בתוכו, ולא בתיקיית res.
- res/layout
תיקיה זו מכילה קבצי XML המגדירים את הפריסות (layouts) של המסכים באפליקציה. כל קובץ XML מגדיר את מבנה רכיבי הממשק על המסך, בהתאם לאקטיביטי אליו הוא משוייך.
דוגמה לקובץ פריסה (activity_main.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" /> </LinearLayout>
- res/values
תיקיה זו מכילה קבצי XML המגדירים ערכים שונים כמו מחרוזות, צבעים, מימדים, סגנונות ועוד.
דוגמאות לקבצים בתיקיה res/values:
בתוך תיקיה זו, יהיו תיקיות של השפות השונות, ובתוכם קבצי הXML השונים.
values-en - אנגלית
values-ar - ערבית
values-iw - עברית.
לפעמים מוסיפים גם את האיזור
values-en-rUS - אנגלית ארה"ב
values-iw-rIL - עברית ישראלstrings.xml: מכיל מחרוזות טקסט. (קבצי השפה)
<resources> <string name="app_name">MyApp</string> <string name="hello_world">Hello, World!</string> </resources>
colors.xml: מכיל הגדרות צבעים.
<resources> <color name="primaryColor">#FF6200EE</color> <color name="secondaryColor">#FF03DAC5</color> </resources>
dimens.xml: מכיל הגדרות מימדים.
<resources> <dimen name="default_margin">16dp</dimen> <dimen name="default_text_size">14sp</dimen> </resources>
styles.xml: מכיל הגדרות סגנונות.
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/primaryColor</item> <item name="colorPrimaryDark">@color/primaryColorDark</item> <item name="colorAccent">@color/accentColor</item> </style> </resources>
- res/drawable
תיקיה זו מכילה קבצי גרפיקה כמו תמונות (PNG, JPG) וקבצי XML המגדירים צורות וציורים מורכבים.
דוגמה לקובץ צורה (shape.xml):
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FF6200EE"/> <corners android:radius="8dp"/> </shape>
-
res/mipmap
תיקיה זו מכילה אייקונים של האפליקציה בגדלים שונים עבור מכשירים שונים. בדרך כלל ישנם תת-תיקיות כמו mipmap-mdpi, mipmap-hdpi, mipmap-xhdpi, mipmap-xxhdpi ו-mipmap-xxxhdpi. -
res/anim ו-res/animator
תיקיות אלו מכילות קבצי XML המגדירים אנימציות ואנימטורים שמשתמשים בהם באפליקציה.
דוגמה לקובץ אנימציה (fade_in.xml):
<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500"/>
- res/menu
תיקיה זו מכילה קבצי XML המגדירים תפריטים (menus) שמופיעים באפליקציה, כגון תפריטי אפשרויות ותפריטי קונטקסט.
דוגמה לקובץ תפריט (menu_main.xml):
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" android:showAsAction="never" /> </menu>
- res/xml
תיקיה זו מכילה קבצי XML כלליים שניתן להשתמש בהם להגדרות שונות של האפליקציה, כמו תצורות, הגדרות אבטחה ועוד.
דוגמה לקובץ תצורה (preferences.xml):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:key="username" android:title="Username" android:summary="Enter your username" /> </PreferenceScreen>
- res/raw
תיקיה זו מכילה קבצים גולמיים (raw) שאינם מפוענחים מראש. ניתן להשתמש בקבצים אלו כקבצי נתונים שמישומים באפליקציה, כמו קבצי אודיו, וידאו, טקסט ועוד.
דוגמה לשימוש בקובץ גולמי:
<mediaPlayer> android:src="@raw/sample_audio" </mediaPlayer>
שלב רביעי - קובץ הdex
השלב המסובך ביותר, ולא הצלחתי להוציא מChatGPT הסבר נוח.
בגדול, אם נפרק אותו עם APK TOOL, או עם DEX EDITOR PLUS בMT MANAGER.
נגיע לקוד הsmali של אקטיבטי לפי הנתיב שלו.
למשל כאן מסומן הקובץ של האקטיביטי MmsApp באפליקציה שהPacakgeName הוא com.android.mms
- res/layout
-
@דודי-ענהאל למה לא?
-
-
@מיגו-להוציא כתב במדריך | מבנה קובץ APK:
ממה שראיתי למעשה באפליקציות, לפעמים שמים "קבצים גולמיים" (קבצי שמע או תמונות למשל) בתיקיית assets ולפעמים ב-res/raw
מה הגדר בזה?
תאורטית אפשר בקוד אפשר להגדיר שיהיה בכל מקום שרוצים...
דיברתי פה על המקובל.