PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ساخت منوی گسترده پاور (اسکرین شات، ریبوت، ریکاوری، دانلودینگ)



GenomeX
11-05-2012, 11:25
دوستانی که کاستوم رام نصب میکنند با منوی گسترده یا همون extended power menu آشنا هستند. امروز می خوام آموزش این مود را قرار بدم. البته ممکنه چنین آموزشی در موبایلستان بوده باشه ولی من با زبان ساده تر و همچنین با قابلیت اضافه کردن اسکرین شات به منوی پاور برای مبتدی ها عنوان میکنم .
با تشکر از تیم AMESTRIS


http://dl.mobilestan.net/index.php/files/get/VD05ODJ6Pp/screenshot.png

ابزار مورد نیاز:
Smali.jar و backsmali.jar برای دیکامپایلر و کامپایلر کردن فایل classes.dex
Apk manager یا apktool.jar (هرکدوم که شما باحاش راحتید)
برنامه Notepad++ برای ویرایش فایلهای xml یا smali
7-zip
فایلهای گرافیکی برای ریبوت، ریکاوری، دانلودینگ، اسکرین شات
رام دئودکس شده.
آشنایی ضمنی با ساختار فایلهای جاوا و apk در اندروید.
حوصله ، دقت و مقداری از وقت گرانبها

آموزش سه بخش خواهد داشت.

مرحله اول ویرایش framework-res.apk و تعرف المانهای گرافیکی و دستورات متنی
فایل framework-res.apk را دیکامپایلر کنید. در پوشه project به مسیر res/drawable-hdpi بروید (بسته به رزولیشن گوشی برای من که ldpi هست.) فایلهای گرافیکی خودتون رو اونجا قرار بدید. فرمت تصاویر png باشد و با رزولیشن سایر آیکونهای منوی پاور یکی.
حالا به res/values بروید. باید عناصر گرافیکی را در فریمورک تعریف کرد. فایل public.xml را با Notepad++ باز کنید.در قسمت drawable ها به آخرین خط این قسمت بروید و به این شکل فایلها را تعریف کنید (اسم آیکونهای شما با من میتواند متفاوت باشد)

<public type="drawable" name="ic_lock_reboot" id="0x01080429" />
<public type="drawable" name="ic_lock_download" id="0x0108042a" />
<public type="drawable" name="ic_lock_recovery" id="0x0108042b" />
<public type="drawable" name="ic_lock_screenshot" id="0x0108042c" />
حالا برای هر فایل باید id جدید تعریف کنید. روش پیدا کردنش با آزمون و خطا است ، البته سرچ برنامه notepad هم بهتون کمک میکنه.
نکته: بین idها فاصله نباشه. idها در اندروید به حالت hex هستند. (مثال: 49.4a,4b,4c,4d,4e,4f,50). دقت کنید که یک شناسه (id) دوبار تکرار نشود.
حالا باید لیبلی هر عملکرد را تعریف کنیم. برای اینکار این کدها را به public.xml قسمت string اضافه میکینم. ( تعریف id رو هم که گفتم قبلاً)

<public type="string" name="take_screenshot" id="0x01040510" />
<public type="string" name="reboot_recovery" id="0x01040511" />
<public type="string" name="reboot_download" id="0x01040512" />
<public type="string" name="reboot" id="0x01040513" />
در اندروید وقتی شما برای قسمتی id تعریف میکنید متناظر آن باید چیزی وجود داشته باشد، پس فایل string.xml را باز کنید و این کدها را به انتهای آن اضافه کنید. این کلمات (با رنگ قرمز مشخص شده است) همانهایی هستند که وقتی منوی پاور را فشار میدهید میبینید شما میتونید هر عبارت دیگه ای رو قرار بدید. (اگه میخواید فارسی هم باشه فایل string.xml درون پوشه values-fa را هم ویرایش کنید و این کدها را اضافه کنید. فقط عبارت ها را به فارسی ترجمه کنید-همانهایی که به رنگ قرمز هست)

<string name="take_screenshot">Screenshot</string>
<string name="reboot_recovery">Recovery</string>
<string name="reboot_download">Downloading</string>
<string name="reboot">Reboot</string>
فایل framework-res را کامپایلر کنید.
در پوشه keep فایل resources.arcs را پاک کنید .(چرا؟ چون فایل xml ویرایش شده است) همچنین پوشه drawable-hdpi یا مشابهش بسته به گوشی شما را پاک کنید (چرا؟ چون محتوای پوشه ویرایش شده)


پایان مرحله اول

GenomeX
11-05-2012, 11:50
مرحله دوم: ویرایش framework.jar برای عملکرد پروسه shutdown
فایل classes.dex را از فایل framework.jar خارج کنید.
فایل dex را backsmali کنید. بعد کامل شدن دیکامپایلر به پوشه com\android\internal\app بروید فایل ShutdownThread.smali را با notepad++ باز کنید.
توجه داشته باشید هرجا مقدار cache یا constad ممکن است با فایل شما فرق داشته باشد. برای اینکار مقدار جدید و قدیمی را از هم کم کنید. برای شما هم باید همینقدر متفاوت باشد.
نکته۱: مقدار قبلی با یک - و مقدار جدید با + در هر خط آمده. در فایل diff که درون فایل سورس قرار دارد اگر دودستور کاملاً مشابهه فقط با تغییر اندکی پشت سر هم بودند و از علایم بالا استفاده شده بود یعنی فقط مقادیر عوض شده اند.
نکته۲: در اندروید مقادیر به صورت hex هست. یعنی بعد 9 بلافاصله a,b,c,d,e,f می آید.
به این مثال توجه کنید.
این مقداری است که در رام من موجود بود : catch_2a
من همان خط را به catch_48 تغییر داده ام.
اختلاف این دو در اندروید 30 هست.
فرض میکنیم همین خط برای شما این مقدار را دارد catch_3e پس شما باید به catch_5c تغییر بدید. به همین سادگی.
این عبارت را بیابید:

.field private static mReboot:Z
به خط بالای آن این عبارت را بیفزایید. (بین هر دستور یک خط خالی هست)

.field public static mReboot:I
این عبارت را بیابید:

.method public static rebootOrShutdown(ZLjava/lang/String;)V
در اولین دستوری که پس از این خط با .line شروع میشود چنین عبارتی میبینید:

if-eqz p0, :cond_33
به این شکل تغییر دهید:

if-eqz p0, :cond_51
دقیقاً در همین متد چند خط پایین تر این عبارت را میبینید:

invoke-static {p1}, Landroid/os/Power;->reboot(Ljava/lang/String;)V
عبارت زیر دو خط بعد آن است:

.catch Ljava/lang/Exception; ..:try_start_1c .. :try_end_1f} :catch_2a
به این شکل تغییر بدهید:

.catch Ljava/lang/Exception; ..:try_start_1c .. :try_end_1f} :catch_48
چند خط پایین تر این عبارت را میبینید:

.line 621
invoke-static ..}, Landroid/os/Power;->shutdown()V

.line 622
return-void

.line 599
:catch_2a
move-exception v0


.line 621
invoke-static ..}, Landroid/os/Power;->shutdown()V

.line 622
return-void

.line 599
:catch_2a
move-exception v0
به این شکل تغییر دهید (تغییرات به شکل bold آمده است. شماره خطوط ممکن است با مال شما فرق داشته باشد. همینجوری Copy&Past نکنید !)

.line 621
sget v1, Lcom/android/internal/app/ShutdownThread;->mReboot:I

const/4 v2, 0x1

if-eq v1, v2, :cond_35

const/4 v2, 0x2

if-eq v1, v2, :cond_3b

const/4 v2, 0x3

if-eq v1, v2, :cond_42

invoke-static ..}, Landroid/os/Power;->shutdown()V

.line 622
return-void

:cond_35
const-string v4, "now"

invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V

return-void

:cond_3b
const-string/jumbo v4, "recovery"

invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V

return-void

:cond_42
const-string v4, "download"

invoke-static {v4}, Landroid/os/Power;->reboot(Ljava/lang/String;)V

return-void

.line 599
:catch_48
move-exception v0

چند خط پایین تر:

.line 604
.end local v0 #e:Ljava/lang/Exception;
:cond_33
new-instance v1, Landroid/os/Vibrator;
تغییر میکند به:

.line 604
.end local v0 #e:Ljava/lang/Exception;
:cond_51
new-instance v1, Landroid/os/Vibrator;

این قسمت تا انتهای این متد:

.line 606
.local v1, vibrator:Landroid/os/Vibrator;
const-wide/16 v2, 0x1f4

:try_start_3a
invoke-virtual {v1, v2, v3}, Landroid/os/Vibrator;->vibrate(J)V
:try_end_3d
.catch Ljava/lang/Exception; ..:try_start_3a .. :try_end_3d} :catch_45

.line 614
:goto_3d
const-wide/16 v2, 0x1f4

:try_start_3f
invoke-static {v2, v3}, Ljava/lang/Thread;->sleep(J)V
:try_end_42

.catch Ljava/lang/InterruptedException; ..:try_start_3f .. :try_end_42} :catch_43

goto :goto_1f

.line 615
:catch_43
move-exception v2

goto :goto_1f

.line 607
:catch_45
move-exception v0

.line 609
.restart local v0 #e:Ljava/lang/Exception;
const-string v2, "ShutdownThread"

const-string v2, "Failed to vibrate during shutdown."

invoke-static {v4, v2, v0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I

goto :goto_3d
.end method
تغییر میکند به:

.line 606
.local v1, vibrator:Landroid/os/Vibrator;
const-wide/16 v2, 0x1f4

:try_start_58
invoke-virtual {v1, v2, v3}, Landroid/os/Vibrator;->vibrate(J)V
:try_end_5b
.catch Ljava/lang/Exception; ..:try_start_58 .. :try_end_5b} :catch_63

.line 614
:goto_5b
const-wide/16 v2, 0x1f4

:try_start_5d
invoke-static {v2, v3}, Ljava/lang/Thread;->sleep(J)V
:try_end_60
.catch Ljava/lang/InterruptedException; ..:try_start_5d .. :try_end_60} :catch_61

goto :goto_1f

.line 615
:catch_61
move-exception v2

goto :goto_1f

.line 607
:catch_63
move-exception v0

.line 609
.restart local v0 #e:Ljava/lang/Exception;
const-string v2, "ShutdownThread"

const-string v2, "Failed to vibrate during shutdown."

invoke-static {v4, v2, v0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I

goto :goto_5b
.end method

کار تمام است فایل را smali کنید. (قبلش فایل dex قدیمی را پاک کنید تا مشکلی پیش نیاید.)
به کمک 7-zip فایل clsssea.dex جدید را به فایل framework.jar اضافه کنید (جایگزین فایل dex اصلی میشود)


پایان بخش دوم

GenomeX
11-05-2012, 12:01
مرحله سوم: ویرایش فایل android.policy.jar برای عملکرد هر دستور
فایل classes.dex را بیرون بکشید و دیکامپایلر کنید.
به مسیر com\android\internal\policy\impl بروید و فایل GlobalActions.smali را با notepad++ ویرایش کنید.
توجه:من برای این مثال فقط اسکرین شات، ریبوت، ریکاوری را بیان میکنم. حالتهای دیگر با مراجعه به سورس کدهای اینجانب)
این متد را بیابید:

.method private prepareMenuItem()V
چند خط پایینتر این خط را پیدا میکنید که نشان میدهد تعداد دستورات منوی پاور 4 عدد است.

const/4 v0, 0x4
شما به این شکل تغییر دهید(یعنی 7 عدد)

const/4 v0, 0x7
شما در همین متد این خط را بیابید (برای حالت airplan mod)

iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;

aput-object v2, v0, v1
بلافاصله بعد آن این دستور است (برای shutdown)

new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$4;
بین این دو دستور ، دستورات زیر را اضافه کنید:

const/4 v1, 0x3

new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$11;

const v3, 0x108042c

const v4, 0x1040510

invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$11;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

aput-object v2, v0, v1

const/4 v1, 0x4

new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$8;

const v3, 0x1080429

const v4, 0x1040513

invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$8;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

aput-object v2, v0, v1

const/4 v1, 0x5

new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$9;

const v3, 0x108042b

const v4, 0x1040511

invoke-direct {v2, p0, v3, v4}, Lcom/android/internal/policy/impl/GlobalActions$9;-><init>(Lcom/android/internal/policy/impl/GlobalActions;II)V

aput-object v2, v0, v1

const/4 v1, 0x6


این کدها به ترتیب اسکرین شات، ریبوت، ریکاوری را اضافه میکنند. در سورس کدهایی که برای شما قرار دادم حالتهای مختلف را عنوان کردم اگر مایل به اضافه کردن ریبوت، ریکاوری، دانلود هستید باید کدها را جا به جا کنید. همچنین اگر هر چهار حالت را بخواهید (اسکرین شات، ریبوت، ریکاوری،دانلودینگ) باید یک حالت پیشفرض مثلاً کلید silent mod را حذف کنید. بدیهی است که کدها تغییر میکند. با کمی کلنجار رفتن میتوانید آنها را بیابید.
اعدادی که به رنگ قرمز هستند بستگی به id دارند که در فایل public.xml برای آن کار تعریف کردید.
const v3 برای شناسه بخش drawable
Const v4 برای شناسه بخش strings
توجه کنید که شناسه ها در فایل public.xml به این شکل است: 0x0108452a
ولی اینجا باید به این شکل باشد: 0x108452a
از همان فایل کد سورسها این چهار فایل را در همین پوشه کپی کنید هر کدام از آنها بخشی از پروسه را بر عهده دارند:

GlobalActions$8.smali >>> Reboot
GlobalActions$9.smali >>> Recovery
GlobalActions$10.smali >>> Downloading
GlobalActions$11.smali >>> Screenshot
یعنی در فایل GlobalActions.smali که ویرایش کردید برای new-instance v2, Lcom/android/internal/policy/impl/GlobalActions$11; نشان میدهد که باید شناسه های مربوط به اسکرین شات را وارد کنید و به همین ترتیب الا آخر.
فایل را کامپایلر کنید وفایل کلاس جدید را به فایل android.policy.jar اضافه کنید.


پایان آموزش
برای سورس کدها و توضیحات اضافه به پست بعدی توجه کنید.

GenomeX
11-05-2012, 12:27
بخش تکمیلی:
اگر اسکرین شات را اضافه کردید:
باید فایل Cmshot.apk را به پوشه system/app اضافه کنید. (این برنامه همان برنامه اسکرین شات رام سیانوژن است ولی الان در اختیار شماست. )
Permissions: rw-r--r--
فایل screenshot را به پوشه bin اضافه کنید
Permissions: rwxr-xr-x

راهنمایی برای مبتدیان:
راهنمایی کامپایلر فایلهای dex :
Apktool.zip را دانلود کنید. (نسخه 1.4.1( برای نسخه های بستنی حصیری نیاز به 1.4.3 دارید ولی جینجربرید همین جواب میده. در صورتی که تونستم نسخه 1.4.2 و 1.4.3 را هم قرار میدم.
یک پوشه به نام مثلاً edit بسازید محتوای فایلهای ضمیمه را در این پوشه کپی کنید فایل dex را نیز در این پوشه قرار دهید.
در جای خالی داخل پوشه همزمان با اینکه کلید shift را نگه داشته اید راست کلیک کنید و گزینه open commend window here را انتخاب کنید.
کد زیر برای دیکامپایلر فایل dex

java -jar baksmali.jar -x classes.dex -o classes
کد زیر نیز برای کامپایلر کردن آن:

java -jar smali.jar classes -o classes.dex

کار با apk manager هم توضیح نمیخواد فقط من نسخه ادیت شده اش رو مجهز به آخرین api و فایلهای اسمالی و بکاسمالی هست رو قرار میدم به گفته هکر توانایی کامپایلر فریمورکها اندروید چهار را نیز داد از ضمیمه به نام Wanam_Apk_Manager_ICS.zip دانلود بفرمایید.

راهنمایی استفاده از سورس کد:
در سورسهای بنده فایلها به جای اینکه smali یا xml باشه به فرمت diff هست.این فایل نشان دهنده تغییرات هست و نباید در پوشه ای جایگزین فایل smali یا xml بشوند، این فایل را با notepad ++ باز کنید.
خطوط اضافه شده با یک علامت "+" و به رنگ آبی کم رنگ هستند.
خطوط حذف شده با علامت "-" و به رنگ سبز زیتونی هستند. (اگر بلافاصله پس از یک خط با علامت - خطی با علامت+ آمده مفهومش این است که فقط محتوای خط مثلاً فقط اعداد تغییر کرده است.)
آغاز و پایان هر متد به رنگ سبز هست.
خطوطی که نیاز به تغییر ندارند به رنگ سیاه هستند.
فایلهای smali یا xml که به همین فرمت وجود داشته باشند را باید بدون تغییر و ویرایش به فایل dex کامپایلر شده اضافه نمود.

سورس و سایر موارد:

extenden-menue-source-code (http://dl.mobilestan.net/index.php/files/get/LWD85nHJpR/extended-power-menu-sourceby-adib-17.zip)

apktool1.4.1 (dl.mobilestan.net/index.php/files/get/FDPprZAmXQ/apktool1.4.1.zip)

apk-manager-ics (http://dl.mobilestan.net/index.php/files/get/gZAQhq2GM2/wanam-apk-manager-ics.zip)

پروژه بعدی: حالت شات دان 4گانه ( Four ways shoutdown method )

follow me in xda-developers and google+ and F.B

ahmad4u
13-05-2012, 01:26
لطفا اسکرین شات هم قرار دهید

GenomeX
13-05-2012, 08:53
لطفا اسکرین شات هم قرار دهید

اگه منظور اسکرین شات از مود هست که پست اول قرار گرفته.
برای آموزش اگه منظورتون هست سعی میکنم یک فایل پاورپوینت یا فلش براش درست کنم (البته به این زودیها قول نمیدم چون سرم شلوغه)

mohammadina
18-03-2013, 14:45
سلام..
میدونم که این پست جاش اینجا نیست بخاطره همین پوزش میخوام..
میخواستم بدونم این گوشی چینی های اندرویدی(iphone 4s) خودشون روت شده هستن یا نه؟ (چون اندرویدشون کپی و اپدیت هم نمیشه به احتمال زیاد روت شدس البته این نظره منه)
اگه روت نیست لطفا اموزش روت رو واسم بذارید..
و اگه روت هستش بهم بگید چه جوری میشه تصویر موقع روشن شدنشو عوض کرد..
سپاس..