关于官方 Launcher3 导入编译的一些坑
官方的 Launcher3 是连同系统一起编译进去的,想要拿出来用Android Studio编译是可以的,但是中间有一些坑是需要注意的,这里我先记录下自己踩下去埋好的坑。
1,首先你需要一个 launcher3 项目包:
2,导入项目
下载下来是一个 Module 所以你需要先自己建一个 Project 或者在已经现成的项目里面导入 Launcher3 。
-
第一个坑
Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "f84cd2e32a90423cbd4ca67e7c1fe2447a2ddabe"
这个是我自己系统的一个坑,原因是找不到Plugin 版本,修改为你的编译版本就行。
-
第二个坑
导入后报的第一个错:
这个是因为5.1.1里,系统不认识 add-resource 这个标签:
将 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>
-
第三个坑
这个是因为 5.1.1 里面系统不能以这样的形式设置参数 :android:protectionLevel="system|signature"
更改为如下:
android:protectionLevel="signatureOrSystem"
假设你的系统现在launcher不是以com.android.launher3为命名的,那么到这里你编译就可以运行通过了,就可以看到文章最后的结果。
Over!
(自行跳过后面内容....)
- 第四个坑
这个是因为你的系统已经有一个包名为:
com.android.launcher3
这个需要你更改下系统的包名改为如下(or waht you want do ):
com.android.launcher4
之后会提示你这样:
不要担心,找不到R文件,我们改了包名,相对于的R文件包路径就需要 更改 或者 导入。
比如这个类R文件是这样:
import com.android.launcher3.R;
把他改成你修改的包名:
import com.android.launcher4.R;
涉及到了系统,所以会有多个类的R文件找不到,我们只要根据系统提示更改一下包名就可以。
还有一点很重要
如果不更改applicationId还是会提示错误,你还需要更改applicationId:**
applicationId "com.android.launcher3"
改为:
applicationId "com.android.launcher4"
- 第五个坑
你运行后发现: waht happened ?。怎么还是报错,doo't worry. 这个错是因为,系统已经有一个这样子的自定义权限了,你要做的,就是更改下自定义权限的名字就可以:
更改为:
<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" />
然后使用的时候也要对应我们更改的权限名字,总共有两个地方:
1,使用的时候
<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使用的时候
<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"/>
然后你运行:
梁静茹:梦醒时分响起....
别担心哈,这是因为,** provider** 在使用的时候,** authorities**需要全局唯一,系统默认已经把这个名字个使用了,你需要做的只是更改他的名字:
android:authorities="com.android.launcher3.settings"
改为(或者你喜欢的命名):
android:authorities="com.android.launcher3.settingss"
注意了!
注意了!
注意了!
这时候运行已经可以安装到系统里面了,但还是会报错:
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
看这个错,第一反应可定会觉得是权限命名或者没有加载权限。实际上是这样子的,你的配置是没有错的,只是漏掉了还需要更改的一个地方:
打开:com.android.launcher3.config.ProviderConfig.java
这个类只有一个静态变量:
public static final String AUTHORITY = "com.android.launcher3.settings";
你没错,就是这里,我们还需要更改成跟我们对于的** authorities**值:
public static final String AUTHORITY = "com.android.launcher3.settingss";
至此,结束。
运行: