關(guān)于官方 Launcher3 導(dǎo)入編譯的一些坑
官方的 Launcher3 是連同系統(tǒng)一起編譯進(jìn)去的你虹,想要拿出來(lái)用Android Studio編譯是可以的,但是中間有一些坑是需要注意的蟀架,這里我先記錄下自己踩下去埋好的坑。
1,首先你需要一個(gè) launcher3 項(xiàng)目包:
2鸭限,導(dǎo)入項(xiàng)目
下載下來(lái)是一個(gè) Module 所以你需要先自己建一個(gè) Project 或者在已經(jīng)現(xiàn)成的項(xiàng)目里面導(dǎo)入 Launcher3 俯画。
-
第一個(gè)坑
Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "f84cd2e32a90423cbd4ca67e7c1fe2447a2ddabe"
這個(gè)是我自己系統(tǒng)的一個(gè)坑析桥,原因是找不到Plugin 版本,修改為你的編譯版本就行艰垂。
錯(cuò)誤-1
-
第二個(gè)坑
導(dǎo)入后報(bào)的第一個(gè)錯(cuò):錯(cuò)誤-2
這個(gè)是因?yàn)?.1.1里烹骨,系統(tǒng)不認(rèn)識(shí) add-resource 這個(gè)標(biāo)簽:
將 values/dimens.xml:<add-resource type="dimen" name="custom_cling_margin_top" /> <add-resource type="dimen" name="custom_cling_margin_right" /> <add-resource type="dimen" name="custom_cling_margin_left" />
更改為:
<dimen name="custom_cling_margin_top">0dp</dimen> <dimen name="custom_cling_margin_right">0dp</dimen> <dimen name="custom_cling_margin_left">0dp</dimen>
將 values/strings.xml :
<add-resource type="string" name="default_folder_name" />
更改為:
<string name="default_folder_name"></string>
-
第三個(gè)坑
錯(cuò)誤-3
這個(gè)是因?yàn)?5.1.1 里面系統(tǒng)不能以這樣的形式設(shè)置參數(shù) :android:protectionLevel="system|signature"
更改為如下:
android:protectionLevel="signatureOrSystem"
假設(shè)你的系統(tǒng)現(xiàn)在launcher不是以com.android.launher3為命名的,那么到這里你編譯就可以運(yùn)行通過(guò)了材泄,就可以看到文章最后的結(jié)果沮焕。
Over!
(自行跳過(guò)后面內(nèi)容....)
- 第四個(gè)坑
錯(cuò)誤-4
這個(gè)是因?yàn)槟愕南到y(tǒng)已經(jīng)有一個(gè)包名為:
com.android.launcher3
這個(gè)需要你更改下系統(tǒng)的包名改為如下(or waht you want do ):
com.android.launcher4
之后會(huì)提示你這樣:
不要擔(dān)心拉宗,找不到R文件峦树,我們改了包名,相對(duì)于的R文件包路徑就需要 更改 或者 導(dǎo)入旦事。
比如這個(gè)類R文件是這樣:
import com.android.launcher3.R;
把他改成你修改的包名:
import com.android.launcher4.R;
涉及到了系統(tǒng)魁巩,所以會(huì)有多個(gè)類的R文件找不到,我們只要根據(jù)系統(tǒng)提示更改一下包名就可以姐浮。
還有一點(diǎn)很重要
如果不更改applicationId還是會(huì)提示錯(cuò)誤谷遂,你還需要更改applicationId:**
applicationId "com.android.launcher3"
改為:
applicationId "com.android.launcher4"
- 第五個(gè)坑
你運(yùn)行后發(fā)現(xiàn): waht happened ?卖鲤。怎么還是報(bào)錯(cuò)肾扰,doo't worry. 這個(gè)錯(cuò)是因?yàn)椋?strong>系統(tǒng)已經(jīng)有一個(gè)這樣子的自定義權(quán)限了,你要做的蛋逾,就是更改下自定義權(quán)限的名字就可以:
更改為:
<permission android:name="com.android.launcher3.permission.PRELOAD_WORKSPACE" />
<permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<permission android:name="com.android.launcher3.permission.READ_SETTINGS_2" />
<permission android:name="com.android.launcher3.permission.WRITE_SETTINGS_2" />
<permission android:name="com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS_2" />
然后使用的時(shí)候也要對(duì)應(yīng)我們更改的權(quán)限名字集晚,總共有兩個(gè)地方:
1,使用的時(shí)候
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS_2"/>
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS_2"/>
<uses-permission android:name="com.android.launcher3.permission.RECEIVE_LAUNCH_BROADCASTS_2"/>
2区匣,provider使用的時(shí)候
<provider
android:name="com.android.launcher3.LauncherProvider"
android:authorities="com.android.launcher3.settings"
android:exported="true"
android:readPermission="com.android.launcher3.permission.READ_SETTINGS_2"
android:writePermission="com.android.launcher3.permission.WRITE_SETTINGS_2"/>
然后你運(yùn)行:
梁靜茹:夢(mèng)醒時(shí)分響起....
別擔(dān)心哈,這是因?yàn)椋?* provider** 在使用的時(shí)候偷拔,** authorities**需要全局唯一,系統(tǒng)默認(rèn)已經(jīng)把這個(gè)名字個(gè)使用了,你需要做的只是更改他的名字:
android:authorities="com.android.launcher3.settings"
改為(或者你喜歡的命名):
android:authorities="com.android.launcher3.settingss"
注意了莲绰!
注意了欺旧!
注意了!
這時(shí)候運(yùn)行已經(jīng)可以安裝到系統(tǒng)里面了蛤签,但還是會(huì)報(bào)錯(cuò):
java.lang.SecurityException: Permission Denial: opening
provider com.android.launcher3.LauncherProvider from
ProcessRecord{2b98e098 9053:com.android.launcher4/u0a183}
(pid=9053, uid=10183)
requirescom.android.launcher3.permission.READ_SETTINGS or
com.android.launcher3.permission.WRITE_SETTINGS
看這個(gè)錯(cuò)切端,第一反應(yīng)可定會(huì)覺(jué)得是權(quán)限命名或者沒(méi)有加載權(quán)限。實(shí)際上是這樣子的顷啼,你的配置是沒(méi)有錯(cuò)的踏枣,只是漏掉了還需要更改的一個(gè)地方:
打開:com.android.launcher3.config.ProviderConfig.java
這個(gè)類只有一個(gè)靜態(tài)變量:
public static final String AUTHORITY = "com.android.launcher3.settings";
你沒(méi)錯(cuò),就是這里钙蒙,我們還需要更改成跟我們對(duì)于的** authorities**值:
public static final String AUTHORITY = "com.android.launcher3.settingss";
至此茵瀑,結(jié)束。
運(yùn)行: