Launcher3導(dǎo)入Android Studio

主要介紹將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版本不同。

附上正常版本顯示界面:
launcher settings界面

查看代碼:
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上去了。 所以可以忽略本文了。?

github : https://github.com/LeongAndroid/Launcher3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容