標籤:ctf 通知 loader 啟動圖 html load ast 判斷 extern
主要工作:
- 添加app productFlavor,同一套代碼可以編譯出外掛程式和app
- 用Activity承載LauncherFragment
- 解決包依賴問題
- 許可權申請(帳號許可權、cde許可權)
- 處理包名變更引起的問題
- 添加app升級功能
- 相關UI、體驗設計
使用Activity承載入口Fragment
- 添加入口Activity
- 把LauncherFragment的view設定為Activity的contentView(比add fragment的方式view層級低&避免Fragment的回收重建問題)
- 手動調用LauncherFragment的生命週期函數
- 實現之前宿主Activity的介面,並提供關鍵實現
解決包依賴問題
外掛程式引用了launcher的一些類和功能,外掛程式不用把那些類編譯進dex,只需要編譯通過,所以有很多jar都是provided的方式。
作為獨立app,需要把那些jar編譯到dex裡邊。
遇到了兩個問題:
- jar類衝突
- 改為compile方式之後,遇到了jar類衝突的問題。之前的jar設定不合理,多個jar會含有相同的一些類,如果都compile進去,就衝突了。
- 解決辦法:解壓jar,把多餘的類刪掉,重新打包jar(Java Jar包壓縮、解壓使用指南 https://www.cnblogs.com/javastack/p/8761248.html)。
- 方法數超過64K(已經有混淆和去資源冗餘了)
- 之前很多jar並沒有編譯到dex裡邊,改為compile方式之後,方法數就超標了
- 處理方法:
- 清理代碼(刪除老舊不用的功能代碼和相關jar)
- 減去對fresco的依賴(外掛程式化的情況下,freso是不編譯進dex的。app話fresco會引入大量的代碼和so,我們沒有大部分功能使用的ImageLoader,可以去掉fresco。fresco還會引入so,作為系統app,必須把so放到system/lib,現在已經有系統應用把so放到system/lib了,如果我們也用fresco,那麼必須考慮so的版本問題,代價高,容易出錯)。
許可權申請(帳號許可權、cde許可權)
之前宿主有申請帳號的許可權,作為app運行之後,必須自己申請帳號等許可權,申請加入白名單等
處理包名變更引起的問題
宿主統一修改了外掛程式的包名,在外掛程式裡邊,所有的標準api擷取的包名都是宿主的。改為app之後,這些ap擷取的包名就是外掛程式自己的包名了。
包名變動涉及:定向廣播、廣告sdk對包名的判斷、其他子功能對包名的判斷
app升級功能
外掛程式的升級是宿主統一管理的,app話之後,需要自己考慮升級功能。升級方式有兩種:
- 使用市集的靜默升級功能
- 自己添加升級邏輯&UI。使用通過升級sdk,能夠快速完成升級邏輯。
相關UI、體驗設計
- Logo
- 啟動圖
- 大背景圖&loading背景圖
- 多案頭外掛程式情況下,左鍵、上鍵、右鍵都有對應的功能,例如切案頭、呼出通知欄。app的情況下,就能重新定義這些按鍵了。
外掛程式項目app化說明