主要介绍将Android 8.0 源码工程里面的Launcher3导入到Android studio中,可以单独编译,方便开发调试阅读。
修改protos目录下launcher_dump.proto
将原来
option java_package = "com.android.launcher3.model";
修改成
option java_package = "com.android.launcher3.model.nano";
此处修改为了保证BgDataModel.java中引用的import com.android.launcher3.model.nano.LauncherDumpProto;能够找到LauncherDumpProto类。
我目前还不明白的是为什么系统里面的编译使用原来的为什么却可以import 这个类。
修改build.gradle
修改这个文件的过程有点曲折,下面我来详细说明一下。
我们导入Android O AOSP版本的Launcher3直接导入studio会发现当前工程里面引用的com.android.support包的版本是
final String SUPPORT_LIBS_VERSION = '26.0.0-SNAPSHOT'
dependencies {
compile "com.android.support:support-v4:${SUPPORT_LIBS_VERSION}"
compile "com.android.support:recyclerview-v7:${SUPPORT_LIBS_VERSION}"
compile "com.android.support:palette-v7:${SUPPORT_LIBS_VERSION}"
androidTestCompile "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}"
}
起初我用的Android studio版本的是2.2,用该版本的studio我使用无法找到'26.0.0-SNAPSHOT'这个版本的jar包版本,但是我找到了另外一个版本“26.0.0_alpha1”(有点小happy),总算让我的工程找到了可以编译的jar包了。
于是我将SUPPORT_LIBS_VERSION修改成了
final String SUPPORT_LIBS_VERSION = '26.0.0-alpha1'
另外如果还编译不过,可能就是“com.android.tools.build:gradle”的版本和“gradle-wrapper.properties”里面的“distributionUrl=https://services.gradle.org/distributions/gradle-xx.xx-all.zip”的对应即可。
目前我用的是
com.android.tools.build:gradle:2.2.0
gradle-wrapper.properties文件中
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
其他的也是可以的。
ok,编译出来的apk,安装到Adnroid O的机器上,结果发现Launcher3的新特性一个没有出现。而工程里的Launcher3却是带新特性的,这就其他了,代码都一样。除了集成的jar版本不同。
附上正常版本显示界面:查看代码:
SettingsActivity.java
if (!BuildCompat.isAtLeastO()) {
getPreferenceScreen().removePreference(
findPreference(SessionCommitReceiver.ADD_ICON_PREFERENCE_KEY));
getPreferenceScreen().removePreference(iconBadgingPref);
} else {
// Listen to system notification badge settings while this UI is active.
mIconBadgingObserver = new IconBadgingObserver(iconBadgingPref, resolver);
resolver.registerContentObserver(
Settings.Secure.getUriFor(NOTIFICATION_BADGING),
false, mIconBadgingObserver);
mIconBadgingObserver.onChange(true);
}
Preference iconShapeOverride = findPreference(IconShapeOverride.KEY_PREFERENCE);
if (iconShapeOverride != null) {
if (IconShapeOverride.isSupported(getActivity())) {
IconShapeOverride.handlePreferenceUi((ListPreference) iconShapeOverride);
} else {
getPreferenceScreen().removePreference(iconShapeOverride);
}
}
这2个选项一个是应用图标的通知标记,另外一个是图标的形状。都是通过BuildCompat.isAtLeastO()这个方法来判断的。
查看BuildCompat.isAtLeastO()方法实现:
/**
* Check if the device is running on the Android O release or newer.
*
* @return {@code true} if O APIs are available for use
*/
public static boolean isAtLeastO() {
return !"REL".equals(VERSION.CODENAME)
&& ("O".equals(VERSION.CODENAME) || VERSION.CODENAME.startsWith("OMR"));
}
什么情况,这个方法的判断是根据VERSION.CODENAME来的,正常判断都是VERSION.SDK_INT啊
目前原因我们studio编译出来的Launcher3版本 不显示新特性的原因就是此方法返回了false,相当于判断当前系统不是O啊,悲催。
因此,需要寻找新的com.android.support版本。
当天刚好Android studio 3.0版本发布,于是升级了到了3.0 版本,升级成功后,通过Moudles里面发现,都已经存在27.0.0版本了,还有26.1.0版本,之前用的都是非正式版本,于是把26.0.0-alpha1 修改成了26.1.0,
final String SUPPORT_LIBS_VERSION = '26.1.0'
gradle sync后自动在build.gradle文件中生成了以下两段:
buildscript {
repositories {
mavenCentral()
jcenter()
///新增
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
}
}
repositories {
mavenCentral()
jcenter()
///新增
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
使用正式版本26.1.0或者27.0.0版本后,相应的Launcher3新特性也出来了。
新版本的isAtLeastO()方法实现直接就是判断VERSION.SDK_INT。
public static boolean isAtLeastO() {
return VERSION.SDK_INT >= 26;
}
总结
上面废话比较多,言简意赅一下:
1.修改launcher_dump.proto
2.修改com.android.support版本为26.1.0或者27.0.0 ,应该还有其他正式版本也可以。
另外,如果发现不对的地方,可以与我联系,一起学习讨论。
以上部分只针对8.0 Launcher3代码,现在已经出来最新的8.1 源码了,8.1 源码导入到android studio并没有这么复杂。我已经将8.1 的代码更新到github上去了。 所以可以忽略本文了。☺
github : https://github.com/LeongAndroid/Launcher3