主要介紹將Android 8.0 源碼工程里面的Launcher3導(dǎo)入到Android studio中,可以單獨(dú)編譯,方便開發(fā)調(diào)試閱讀。
修改protos目錄下launcher_dump.proto
將原來(lái)
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類。
我目前還不明白的是為什么系統(tǒng)里面的編譯使用原來(lái)的為什么卻可以import 這個(gè)類。
修改build.gradle
修改這個(gè)文件的過(guò)程有點(diǎn)曲折,下面我來(lái)詳細(xì)說(shuō)明一下。
我們導(dǎo)入Android O AOSP版本的Launcher3直接導(dǎo)入studio會(huì)發(fā)現(xiàn)當(dāng)前工程里面引用的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我使用無(wú)法找到'26.0.0-SNAPSHOT'這個(gè)版本的jar包版本,但是我找到了另外一個(gè)版本“26.0.0_alpha1”(有點(diǎn)小happy),總算讓我的工程找到了可以編譯的jar包了。
于是我將SUPPORT_LIBS_VERSION修改成了
final String SUPPORT_LIBS_VERSION = '26.0.0-alpha1'
另外如果還編譯不過(guò),可能就是“com.android.tools.build:gradle”的版本和“gradle-wrapper.properties”里面的“distributionUrl=https://services.gradle.org/distributions/gradle-xx.xx-all.zip”的對(duì)應(yīng)即可。
目前我用的是
com.android.tools.build:gradle:2.2.0
gradle-wrapper.properties文件中
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
其他的也是可以的。
ok,編譯出來(lái)的apk,安裝到Adnroid O的機(jī)器上,結(jié)果發(fā)現(xiàn)Launcher3的新特性一個(gè)沒(méi)有出現(xiàn)。而工程里的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個(gè)選項(xiàng)一個(gè)是應(yīng)用圖標(biāo)的通知標(biāo)記,另外一個(gè)是圖標(biāo)的形狀。都是通過(guò)BuildCompat.isAtLeastO()這個(gè)方法來(lái)判斷的。
查看BuildCompat.isAtLeastO()方法實(shí)現(xiàn):
/**
* 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"));
}
什么情況,這個(gè)方法的判斷是根據(jù)VERSION.CODENAME來(lái)的,正常判斷都是VERSION.SDK_INT啊
目前原因我們studio編譯出來(lái)的Launcher3版本 不顯示新特性的原因就是此方法返回了false,相當(dāng)于判斷當(dāng)前系統(tǒng)不是O啊,悲催。
因此,需要尋找新的com.android.support版本。
當(dāng)天剛好Android studio 3.0版本發(fā)布,于是升級(jí)了到了3.0 版本,升級(jí)成功后,通過(guò)Moudles里面發(fā)現(xiàn),都已經(jīng)存在27.0.0版本了,還有26.1.0版本,之前用的都是非正式版本,于是把26.0.0-alpha1 修改成了26.1.0,
final String SUPPORT_LIBS_VERSION = '26.1.0'
gradle sync后自動(dòng)在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版本后,相應(yīng)的Launcher3新特性也出來(lái)了。
新版本的isAtLeastO()方法實(shí)現(xiàn)直接就是判斷VERSION.SDK_INT。
public static boolean isAtLeastO() {
return VERSION.SDK_INT >= 26;
}
總結(jié)
上面廢話比較多,言簡(jiǎn)意賅一下:
1.修改launcher_dump.proto
2.修改com.android.support版本為26.1.0或者27.0.0 ,應(yīng)該還有其他正式版本也可以。
另外,如果發(fā)現(xiàn)不對(duì)的地方,可以與我聯(lián)系,一起學(xué)習(xí)討論。
以上部分只針對(duì)8.0 Launcher3代碼,現(xiàn)在已經(jīng)出來(lái)最新的8.1 源碼了,8.1 源碼導(dǎo)入到android studio并沒(méi)有這么復(fù)雜。我已經(jīng)將8.1 的代碼更新到github上去了。 所以可以忽略本文了。?