Kết quả 1 đến 4 của 4
  1. #1
    dinhgiang.linh Guest

    Thêm shortcut một ứng dụng vào status bar, quick setting

    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


    Mã:
    .method private
    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


    Mã:
    myshortcut
    tên method, cái này tuỳ theo ý các bạn nhé



    Mã:
    0x7f0d0115
    đâ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:


    Mã:
    phonestatusbar.java
    nếu là statusbarservice thì đặt là statusbarservice.java
    +
    code:


    Mã:
    myshortcut
    : tên method bên trên.
    +
    code:


    Mã:
    clicktoshortcut
    : 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:


    Mã:
    clicktoshortcut
    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

  2. #2
    anhlamgame Guest
    xem khúc trên còn hiểu hiểu, xuống gần cuối muốn điên o_o

  3. #3
    Duy@123 Guest
    Trích dẫn Gửi bởi huynh_quan2909
    xem khúc trên còn hiểu hiểu, xuống gần cuối muốn điên o_o
    em cũng mò mẫm theo mà chưa thành công, loàng ngoằng phết cụ ạ

  4. #4
    ketoananz Guest
    em đang hì hục về cái qside,mà mò mãi ko xong.oải kinh

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •