前言
項(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).