Launcher3导入Android Studio

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

附上正常版本显示界面:
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个选项一个是应用图标的通知标记,另外一个是图标的形状。都是通过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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容