記錄一次老Android項(xiàng)目遷移過程

前言

項(xiàng)目最早是我三年前寫的, 后來轉(zhuǎn)去別的項(xiàng)目組做新項(xiàng)目, 交接給了新同事. 大半年后公司大面積裁員, 緊急交接給我了. 由于項(xiàng)目處于將死狀態(tài)也就不管了. 后來試著跑了下, 好像沒能跑起來. 就大概看了下代碼.

印象較深的是, 原本項(xiàng)目, 數(shù)據(jù)庫(kù)就一個(gè)表, 我用sql語句寫的. 他需求多了個(gè)收藏, 然后就引用了greendao. 略感煩躁. 然后該升級(jí)的其它庫(kù)沒有做相應(yīng)升級(jí). 還停留在我第一次交接過去的狀態(tài). 所以說代碼快3年沒維護(hù). 而且他那邊迭代的版本還沒做完, 也是頭大.

開始遷移

原本工程直接修改(失敗).

在遷移前, 我先將Android Stuio升級(jí)到了3.2. 然后將原有工程copy的一份, 然后用as打開project. 修改了幾下, 實(shí)在無從下. 最重要項(xiàng)目結(jié)構(gòu)無法很好識(shí)別. 在這之前也升級(jí)過4年的老項(xiàng)目, 稍微改了下也就跑起來了. 這個(gè)怎么改都不行. 當(dāng)初我接手就已經(jīng)不能跑成功, 另一個(gè)可能3.2比之前變化較大. copy打開了幾次都不行. 這樣不行的話, 只能多費(fèi)力氣新建工程導(dǎo)入代碼了.

新建工程導(dǎo)入(成功)

首先建好空項(xiàng)目和主要的module. 那種只有幾個(gè).java文件的module. 打算最后并到主項(xiàng)目, 能省點(diǎn)事, 畢竟最主要的是先跑起來. 保持項(xiàng)目名稱包名一致. 然后從依賴性最小的moudle開始, 將原module下的libs和src目錄copy過去. 然后手動(dòng)修改build.gradle. 除了support包, 其它的庫(kù)先按原來的版本. 然后主項(xiàng)目加入該依賴, build, 修改問題, 通過. 再弄下一個(gè)module. 最后將主項(xiàng)目的代碼copy過來. 再build. 挨個(gè)修改問題.

問題記錄

  • Cannot resolve symbol 'CLIP_SAVE_FLAG'
    canvas里已經(jīng)將這些flag標(biāo)記移除了, 改用save()就可以了.

  • Program type already present: android.support.v4.app.FragmentTransitionCompat21
    這個(gè)是不同版本support包沖突
    在Terminal中輸入指令 gradlew -q app:dependencies
    可以看到fresco:0.6.1依賴了android-support-v4:23.2.1, 升級(jí)到fresco:1.11.0解決.

  • nineoldandroids
    這個(gè)好早以前支持2.x加入的, 現(xiàn)在不需要了
    import改為android自帶的.
    ViewHelper.setX(view, value)改為view.setX(value)
    ViewHelper.getX(view)改為view.getX()

  • ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot)
    這個(gè)報(bào)錯(cuò)說的很明顯, 直接去對(duì)應(yīng)adapter.
    找到

 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            mLikesLayout.setId(R.id.layout_other_like);
            parent.addView(mLikesLayout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            root = mLikesLayout;
        return new RecyclerView.ViewHolder(root) {
        };
}

改為

 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            mLikesLayout.setId(R.id.layout_other_like);
            mLikesLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            root = mLikesLayout;
        return new RecyclerView.ViewHolder(root) {
        };
}
  • 列表里一些item高度會(huì)鋪滿屏幕.
    這個(gè)是因?yàn)槟硞€(gè)版本后, recyclerview改了行為, item根節(jié)點(diǎn)android:layout_height寫match_parent會(huì)鋪滿屏幕, 好在xml按照命名規(guī)范, 列表item布局以lvi_開頭, 直接挨個(gè)檢查, 修改對(duì)應(yīng)xml根節(jié)點(diǎn)改為android:layout_height="wrap_content".

結(jié)束

到此為止, 大概大半天時(shí)間, 項(xiàng)目已經(jīng)能正常跑起來, 也順手解決了幾個(gè)bug. 像一些庫(kù), 還停留在舊版本上, 可能還存在一些bug. 升級(jí)版本改動(dòng)較大.

  • 如我封裝的http底層還是使用的apache HttpClient. 而現(xiàn)在基本okhttp一統(tǒng)天下.
  • EventBus 2.x/到3.x, 關(guān)鍵詞變更
  • butterknife 7.x到9.x, 關(guān)鍵詞變更
  • 一些國(guó)內(nèi)的sdk.
    由于一開始該項(xiàng)目倉(cāng)促, 總是追趕需求, 當(dāng)時(shí)功力也不夠. 雖然項(xiàng)目跑起來沒事, 但現(xiàn)在的眼光來看, 項(xiàng)目很啰嗦重復(fù). 想加?xùn)|西感覺也是費(fèi)勁, 所以還得后面再找點(diǎn)時(shí)間將這些重構(gòu).
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,326評(píng)論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,110評(píng)論 2 59
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,898評(píng)論 2 45
  • 我喜歡虐的故事,因?yàn)榕靶?,是從心的部分去感受才能刻骨銘心,才能銘記,才能在日后回想的時(shí)候心的部分,即使過去很久,即...
    Angel愛Bryce斌閱讀 296評(píng)論 0 1
  • 有時(shí)候覺得,酒是人與仙(神)之間的橋梁,或有限的人類追尋永恒的一種手段。人世間少歡樂,于是創(chuàng)造酒來助長(zhǎng),酒后人方能...
    duguyu閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容