copy file systemui.apk vào thư mục place-apk-here-for-modding
4. chỉnh sửa:
chạy file script.bat để bắt đầu, enter để vào menu
chọn 9 để decompile file systemui.apk. nó hỏi thì nhấn y và enter để vào ngay thư mục systemui.apk
chuẩn bị 1 ảnh dạng png. dạng như icon ấy nhé. copy vào res/drawable-xhdpi
ta bắt đầu chỉnh sửa từ layout nhé: vào res/layout/
mở status_bar.xml bằng notepad++
mình sẽ hướng dẫn làm shortcut của app qslide (app riêng trên snake 1.4 - rom mình sử dụng để viết tut) vào bên trái của thanh status bar nhé (các app khác làm tương tự)
tại status_bar.xml tìm dòng này
code:
Mã:
<com.android.systemui.statusbar.statusbariconview
thêm vào bên dưới dòng đấy code này
code:
Mã:
<imageview android:paddingleft="4.0dip" android:paddingright="4.0dip" android:id="@id/qslide_button" android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/ic_notify_qslide" android:layout_torightof="@id/moreicon" systemui:glow/>
lưu ý những phần sau nhé:
+ android:id="@id/qslide_button": qslide_button các bạn có thể đặt tùy ý, nhưng phải nhớ
+ android:src="@drawable/ic_notify_qslide": đây là đường dẫn ảnh. tức là cái ảnh ban nãy ta copy vào res/drawable-xhdpi. ic_notify_qslide đây là tên ảnh, phải giống nhé.
+ android:layout_torightof="@id/moreicon": cái này là căn bên trái phần có id là moreicon, thêm vào chỗ nào thì lấy đổi phần moreicon thành id của thẻ ngay phía trước chỗ các bạn thêm code.
save file status_bar.xml sau khi đã chỉnh sửa
tiếp theo vào res/values mở file ids.xml thêm vào dưới cùng trước </resources>
đoạn code sau
code:
Mã:
<item type="id" name="qslide_button">false</item>
phần này name="qslide_button": qslide_button là tên id các bạn đã đặt ở trên nhé.
lưu file lại
quay ra màn hình script.bat, chọn 11 để compile file apk lại
chờ một lát, đến lúc gặp thông báo này thì nhấn y rồi enter để tiếp tục nhé
lại chờ tiếp, đến khi gặp thông báo này thì cứ để đó
ta trở ra thư mục chính của apk-multi-tool-experimental-release sẽ thấy có một thư mục keep xuất hiện
vào thư mục keep xoá file resources.arsc, vào tiếp keep/res/layout xoá file status_bar.xml
sau đó quay trở lại màn hình script.bat nhấn enter để tiếp tục. đợi một lúc nó sẽ compile song.
tiếp theo, ta xoá thư mục systemui.apk trong thư mục projects và xoá file systemui.apk trong thư mục place-apk-here-for-modding đi. vào thư mục place-apk-here-for-signing sẽ thấy có 1 file systemsystemui.apk, đổi tên nó thành systemui.apk rồi copy nó vào thư mục place-apk-here-for-modding
ta quay trở lại màn hình script.bat nhấn 9 để nó decompile cái file systemui.apk mới
đợi nó decompile ra.
vào projects/systemui.apk/res/layout mở file status_bar.xml
ta để ý phần
code:
Mã:
<imageview android:id="@id/qslide_button" android:paddingleft="4.0dip" android:paddingright="4.0dip" android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/ic_notify_qslide" android:layout_torightof="@id/moreicon" systemui:glow/>
mới thêm bên trên. nhớ lấy cái qslide_button nhé.
ta vào projects/systemui.apk/res/values mở file public.xml bằn notepad++, tìm kiếm với từ khóa qslide_button.
ta thấy có thêm dòng này
code:
Mã:
<public type="id" name="qslide_button" id="0x7f0d0115" />
để ý phần 0x7f0d0115. nhớ lấy vì tiếp theo sẽ cần dùng.
ta vào theo đường dẫn sau (tùy từng thiết bị, từng bản rom nó có thể ở đường dẫn khác) : projects/systemui.apk/smali/com/android/systemui/statusbar/phone
mở file phonestatusbar.smali ( hoặc statusbarservice.smali , cái này là tùy vào rom và thiết bị, các bạn phải tự tìm)
công việc ở đây là thêm 1 method xử lý rồi hook nó vào makestatusbarview
bước 1: tạo method xử lý vào phonestatusbar.smali. method này là kiểu direct , nên cứ add nó vào bên dưới method cùng kiểu là đc, ví dụ là ngay dưới method createdebugbutton
tìm kiếm đoạn sau
Mã:
.method private createdebugbutton()v
nó có thể khác ở file của các bạn, nên các bạn có thể search với từ khóa
ta kéo xuống đến khi gặp đoạn này
Mã:
return-void
.end method
thì dừng lại. thêm đoạn code sau xuống ngay bên dưới .end method
code:
Mã:
.method private myshortcut()v
.locals 2
.prologue
.line 29
sget-object v0, lcom/android/systemui/statusbar/phone/phonestatusbar;->mexpandedview:lcom/android/systemui/statusbar/phone/expandedview;
const v1, 0x7f0d0115
invoke-virtual {v0, v1}, lcom/android/systemui/statusbar/phone/expandedview;->findviewbyid(i)landroid/view/view;
move-result-object v0
check-cast v0, landroid/view/view;
new-instance v1, lcom/android/systemui/statusbar/phone/phonestatusbar$55;
invoke-direct {v1, p0}, lcom/android/systemui/statusbar/phone/phonestatusbar$55;-><init>(lcom/android/systemui/statusbar/phone/phonestatusbar;)v
invoke-virtual {v0, v1}, landroid/view/view;->setonclicklistener(landroid/view/view$onclicklistener;)v
.line 142
return-void
.end method
khi dex2jar ra trong java sẽ có như sau
Mã:
private void myshortcut()
{
((view)mexpandedview.findviewbyid(2131558677)).setonclicklistener(new view.onclicklistener()
{
public void onclick(view paramanonymousview)
{
phonestatusbar.this.clicktoshortcut();
}
});
}
ta phân tích code trên
tên method, cái này tuỳ theo ý các bạn nhé
đây chính là id ban nãy mình bảo các bạn nhớ lấy. các các bạn thay vào nhé.
Mã:
lcom/android/systemui/statusbar/phone/phonestatusbar
code:
Mã:
lcom/android/systemui/statusbar/phone/expandedview
đây là đường dẫn 2 file phonestatusbar và file expandedview (file này giống tên ở các bản rom) các bạn tự tìm và thay vào nhé.
Mã:
lcom/android/systemui/statusbar/phone/phonestatusbar$55
cần để ý kỹ phần này nhé. phonestatus$55 là một file smali.
tạm hiểu thế này
để ý sẽ thấy trong method này có 1 cái phần mở rộng ra trong smali gọi là innerclass.
toàn bộ phần bên trong onclicklistener nó sẽ tách thành 1 cái file khác mình đặt tên nó là 55 và tên file của nó sẽ là phonestatus$55 (hoặc statusbarservice$55)
$55 ở đây là số thứ tự nhé, các bạn xem trong thư mục chứa phonestatusbar.smali (statusbarservice.smali) nó gọi đến statusbarservice$ bao nhiêu thì thêm vào. file này mình có để bên dưới nhé. copy vào thư mục cùng với phonestatusbar.smali (statusbarservice.smali).
ta có code trong file phonestatusbar$55.smali như sau
code:
Mã:
.class lcom/android/systemui/statusbar/phone/phonestatusbar$55;
.super ljava/lang/object;
.source "phonestatusbar.java"
# interfaces
.implements landroid/view/view$onclicklistener;
# annotations
.annotation system ldalvik/annotation/enclosingmethod;
value = lcom/android/systemui/statusbar/phone/phonestatusbar;->myshortcut()v
.end annotation
.annotation system ldalvik/annotation/innerclass;
accessflags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic this$0:lcom/android/systemui/statusbar/phone/phonestatusbar;
# direct methods
.method constructor <init>(lcom/android/systemui/statusbar/phone/phonestatusbar;)v
.locals 0
.parameter
.prologue
.line 3288
iput-object p1, p0, lcom/android/systemui/statusbar/phone/phonestatusbar$55;->this$0:lcom/android/systemui/statusbar/phone/phonestatusbar;
invoke-direct/range {p0 .. p0}, ljava/lang/object;-><init>()v
return-void
.end method
# virtual methods
.method public onclick(landroid/view/view;)v
.locals 1
.parameter "v"
.prologue
.line 2210
iget-object v0, p0, lcom/android/systemui/statusbar/phone/phonestatusbar$55;->this$0:lcom/android/systemui/statusbar/phone/phonestatusbar;
invoke-virtual {v0}, lcom/android/systemui/statusbar/phone/phonestatusbar;->clicktoshortcut()v
.line 2216
return-void
.end method
ta phân tích tiếp code này
+
code:
nếu là statusbarservice thì đặt là statusbarservice.java
+
code:
: tên method bên trên.
+
code:
: tên method xử lý khi click vào shortcut. ta sẽ đề cập ở phần sau.
các dòng khác thì mình đã giải thích ở trên, tự thay vào nhé.
bước 2: tạo method xử lý khi click vào shortcut.
thêm vào bên dưới method myshortcut đoạn code sau
code:
Mã:
.method clicktoshortcut()v
.locals 5
.prologue
.line 2257
invoke-virtual {p0}, lcom/android/systemui/statusbar/phone/phonestatusbar;->animatecollapse()v
const-string v2, "com.sphinxvn.snakeqslide"
.line 27
.local v2, packagename:ljava/lang/string;
const-string v0, "com.sphinxvn.snakeqslide.mainactivity"
.line 29
.local v0, activityname:ljava/lang/string;
new-instance v3, landroid/content/componentname;
invoke-direct {v3, v2, v0}, landroid/content/componentname;-><init>(ljava/lang/string;ljava/lang/string;)v
.line 31
.local v3, tolaunch:landroid/content/componentname;
new-instance v1, landroid/content/intent;
const-string v4, "android.intent.action.main"
invoke-direct {v1, v4}, landroid/content/intent;-><init>(ljava/lang/string;)v
.line 33
.local v1, intent:landroid/content/intent;
const-string v4, "android.intent.category.launcher"
invoke-virtual {v1, v4}, landroid/content/intent;->addcategory(ljava/lang/string;)landroid/content/intent;
.line 35
invoke-virtual {v1, v3}, landroid/content/intent;->setcomponent(landroid/content/componentname;)landroid/content/intent;
.line 37
const/high16 v4, 0x1000
invoke-virtual {v1, v4}, landroid/content/intent;->setflags(i)landroid/content/intent;
.line 39
iget-object v0, p0, lcom/android/systemui/statusbar/phone/phonestatusbar;->mcontext:landroid/content/context;
invoke-virtual {v0, v1}, landroid/content/context;->startactivity(landroid/content/intent;)v
.line 2269
return-void
.end method
khi dex2jar trong java sẽ có như sau
code:
Mã:
void clicktoshortcut()
{
animatecollapse();
componentname localcomponentname = new componentname("com.sphinxvn.snakeqslide", "com.sphinxvn.snakeqslide.mainactivity");
intent localintent = new intent("android.intent.action.main");
localintent.addcategory("android.intent.category.launcher");
localintent.setcomponent(localcomponentname);
localintent.setflags(268435456);
this.mcontext.startactivity(localintent);
}
phân tích code:
+
code:
tên cái method xử lý khi click ta đề cập ban nãy.[/color]
+
code:
Mã:
com.sphinxvn.snakeqslide
code:
Mã:
com.sphinxvn.snakeqslide.mainactivity
để ý kỹ cái này. làm sao để có nó? các bạn decompile app mà các bạn muốn đưa lên status ra. sẽ có 1 file androidmanifest.xml
ví dụ: của mình là app snakeqslide.apk có file androidmanifest.xml như sau
code:
Mã:
<?xml version="1.0" encoding="utf-8"?>
<manifest android:shareduserid="android.uid.system" android:versioncode="1" package="com.sphinxvn.snakeqslide" android:versionname="1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<uses-sdk android:minsdkversion="8" android:targetsdkversion="17"
/>
<application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" android:debuggable="true"
>
<activity android:label="@string/app_name_1" android:name="com.sphinxvn.snakeqslide.mainactivity"
>
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<receiver android:name="snakeqslidewidget">
<intent-filter>
<action android:name="android.appwidget.action.appwidget_update" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_internet" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_video" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_memo" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_calendar" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_calculator" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/snake_qslide_widget_info"
/>
</receiver>
</application>
</manifest>
để ý phần này
code:
Mã:
<manifest android:shareduserid="android.uid.system" android:versioncode="1" package="com.sphinxvn.snakeqslide" android:versionname="1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
>
ta lấy đoạn
code:
Mã:
com.sphinxvn.snakeqslide
thay cho
code:
Mã:
com.sphinxvn.snakeqslide
ở trên method
tiếp đến là activity (hành động), trong một ứng dụng có rất nhiều activity, những activity này được khai báo ở file androidmanifest.xml
ví dụ
code:
Mã:
<activity android:label="@string/app_name_1" android:name="com.sphinxvn.snakeqslide.mainactivity"
>
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<receiver android:name="snakeqslidewidget">
<intent-filter>
<action android:name="android.appwidget.action.appwidget_update" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_internet" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_video" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_memo" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_calendar" />
<action android:name="com.sphinxvn.snakeqslide.action_widget_calculator" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/snake_qslide_widget_info"
/>
</receiver>
ở đây có rất nhiều activity các bạn có thể gọi bất kỳ cái nào cũng đc, mình gọi app thì lấy đoạn này
code:
Mã:
com.sphinxvn.snakeqslide.mainactivity
thay cho
code:
Mã:
com.sphinxvn.snakeqslide.mainactivity
ở method trên.
cái này tùy vào file nhé. thay vào những phần mình đã nói.
tiếp theo ta hook method vào makestatusbarview
trong phonestatusbar.smali ta tìm dòng này
code:
Mã:
invoke-direct {p0}, lcom/android/systemui/statusbar/phone/phonestatusbar;->createdebugbutton()v
thêm vào bên trên đoạn hook myshortcut() như sau
code:
Mã:
invoke-direct {p0}, lcom/android/systemui/statusbar/phone/phonestatusbar;->myshortcut()v
khi dex2jar trong java ta sẽ thấy thế này
code:
Mã:
myshortcut();
createdebugbutton();
file phonestatusbar$55.smali:https://docs.google.com/file/d/0b1e9xrtuknzbsmwxrwvzufywr2c/edit?usp=sharing
ok đến đây ta save file lại.
tiếp theo là compile project file apk.
tại màn hình script.bat ta chọn 11 để bắt đầu compile.
như phần hướng dẫn ở trên đến đoạn hỏi y/n thì chọn y, đợi 1 lúc sẽ có 1 thông báo.
để đấy, ta quay ra thư mục keep (đã nói ở phần trên) xoá file classes.dex sau đó quay lại script.bat nhấn enter để tiếp tục.
xong ta sẽ có file systemsystemui.apk trong place-apk-here-for-signing
đổi tên thành systemui.apk copy vào system/app set 644 reboot và tận hưởng thôi.
lưu ý: sau khi chỉnh sửa xong, nên dex2jar file apk ra file jar để so sánh code java
tut được viết bởi @kmasc.team đến từ tinhte.vn
View more random threads:
Introducing the Rattan Pagoda Lantern—an exquisite fusion of traditional craftsmanship and modern design that adds warmth and sophistication to any setting. Crafted from natural rattan materials,...
Illuminate Your Space with...