2013年9月9日 星期一

將「別人的」程式捷徑加入 Sony SmallApp Dock (via decompile)

之前曾發表過一篇【將應用程式捷徑加入 Sony SmallApp Dock
是自己在開發程式時能將捷徑加入 SmallApp Dock。

但有時候我自己會想,如果有一個很常用程式也能把捷徑放到 SmallApp Dock 該有多好,應該會很方便~

其實 Sony 可以考慮這個功能... 那麼在 Sony 還沒做出來之前,可以透過 decomple 和 code inject 的方式將程式捷徑放到 SmallApp Dock 喔。

首先需要的工具有 Apktool , dex2jar(主要用來 sign apk),都可以直接在 Google 搜尋到。



【Step 1 - Get apk file】
要進行 decompile 第一步一定得先取得 apk 檔案,這邊可以透過手機的軟體將 apk 備份出來,或者利用 Chrome 的 Apk downloader 直接從 Google Play 取得。

【Step 2 - Decompile】
接著就是將這個 apk 給反編譯了,中間有遇到任何問題.... 請自行上網找解決方案XD


【Step 3 - Find main activity】
將 apk 反編譯之後,開啟 AndroidManifest.xml ,這裡要找到要啟動的 Main Activity 的名字,以及要得知這個 application 的 package name。

Package name 可以在 xml 的 manifes 標籤的屬性裡找到,如:

<manifest android:versionCode="1000" android:versionName="1.0" package="tw.darkk6.example.app"
  xmlns:android="http://schemas.android.com/apk/res/android">


接著找到想要從 SmallApp Dock 啟動的 Activity , 這邊可以稍微注意想啟動的 Activity 是誰,通常會出現在 App Drawer 的都會有
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

Ticker 為例:http://pastie.org/8308441

Packege name 是 com.misc.ticker
Main Activity 是 ticker (在 activity 的 android:name ),所以完整名稱是 com.misc.ticker.ticker


【Step 4 - Code inject】
其實這裡有一點 tricky , 主要的概念是先啟動一個 SmallApp , 在裡面使用 startActivity(intent)去啟動 Main Activity,接著關閉 SmallApp 的視窗。

 當然,如果程式本身不是單純的啟動 Activity , 也是可以在這個 SmallApp 裡面做好程式要執行的動作,讓程式進入自己本身的運作後,再關閉 SmallApp 也是可以。

主要的 Java Code 在這裡:http://pastie.org/8308522

其中 pkgName 和 mainAct 要填寫的是剛剛找到的 package name 和 main activity name

不過實際上這邊要 inject 是 Dalvik bytecode 的 .smali 檔,下載 Inject Code

將解壓縮出來的 tw 資料夾放進 decompile 後的 smali/ 資料夾底下 (如果 tw 資料夾剛好存在也無妨,只要保持結構即可)


【Step 5 - 修改 AndroidManifest.xml】
最後到 AndroidManifest.xml 處新增重要的幾個宣告:
在 <manifest> 裡面 ( <application> 外) 加入
    <uses-permission android:name="com.sony.smallapp.permission.SMALLAPP" />

在 <application> 裡面加入
    <uses-library android:name="com.sony.smallapp.framework" android:required="false" />

以及
<service android:name="tw.darkk6.inject.smallapp.SmallAppEntry">
    <intent-filter>
        <action android:name="com.sony.smallapp.SmallApplication" />
        <action android:name="com.sony.smallapp.intent.action.MAIN" />
        <category android:name="com.sony.smallapp.intent.category.LAUNCHER" />
    </intent-filter>
</service>

最後 re-compile 、 re-sign 後即可~


沒有留言:

張貼留言