MTK-Android12-Android13-系统预装Chrome并自定义主页-导向百度主页

提示:MTK-Android12-Android13-系统预装Chrome并自定义主页-导向百度主页

文章目录


前言-需求-场景

很多Android客制化产品,内置谷歌或者其它浏览器,但是会根据对应客户和产品使用场景,预设主页,打开 谷歌或者其它浏览器时候能够直接跳转到客制化主页,比如:百度、谷歌、搜狗 的主页,提升用户体验。

实际效果如下:

一、参考资料

Android系统预装Chrome并自定义主页

二、难点-困难点

浏览器是以 APK形式预制到系统的,在无源码情况下是无法设置浏览器应用的主页的,那么如何实现?

Android系统提供了实现方案,按照安卓体系规则走就可以了,这里需要两步:

  • PartnerBookmarksProvider 服务组件的使用,配置主页、扩展自己的主页功能
  • 尽管使用了PartnerBookmarksProvider组件,必须对内置编译的浏览器apk,在编译脚本中配置服务组件,也就是使用到服务组件

二、实现方案

服务组件PartnerBookmarksProvider 配置主页

新建-ContentProvider-PartnerHomepageProviderExample

java 复制代码
package com.android.providers.partnerbookmarks;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
 
 
public class PartnerHomepageProviderExample extends ContentProvider {
    private static String HOMEPAGE_URI = "https://www.baidu.com/";  
 
    private static final int URI_MATCH_HOMEPAGE = 0;
    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        URI_MATCHER.addURI("com.android.partnerbrowsercustomizations", "homepage",
                URI_MATCH_HOMEPAGE);
    }
 
    @Override
    public boolean onCreate() {
        return true;
    }
 
    @Override
    public String getType(Uri uri) {
        switch (URI_MATCHER.match(uri)) {
            case URI_MATCH_HOMEPAGE:
                return "vnd.android.cursor.item/partnerhomepage";
            default:
                return null;
        }
    }
 
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        switch (URI_MATCHER.match(uri)) {
            case URI_MATCH_HOMEPAGE:
                MatrixCursor cursor = new MatrixCursor(new String[] { "homepage" }, 1);
                cursor.addRow(new Object[] { HOMEPAGE_URI });
                return cursor;
            default:
                return null;
        }
    }
 
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        throw new UnsupportedOperationException();
    }
 
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        throw new UnsupportedOperationException();
    }
 
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        throw new UnsupportedOperationException();
    }
 
}

配置文件AndroidManifest.xml 中配置ContentProvider-PartnerHomepageProviderExample

java 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.providers.partnerbookmarks">

    <!-- We add an application tag here just to indicate the authorities -->
    <application>
        <provider android:name="PartnerBookmarksProvider"
            android:authorities="com.android.partnerbookmarks"
            android:exported="true" />
        <provider android:name="PartnerHomepageProviderExample"
            android:authorities="com.android.partnerbrowsercustomizations"
            android:exported="true"/>
    </application>
</manifest>

编译脚本.mk 文件配置服务组件-PartnerHomepageProvider

java 复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := ChromeFise
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRODUCT_MODULE := true
##LOCAL_PROPRIETARY_MODULE := true
LOCAL_ENFORCE_USES_LIBRARIES := false
LOCAL_DEX_PREOPT := false
LOCAL_OVERRIDES_PACKAGES := Browser Browser2 MtkBrowser MtkBrowserAutoTests BrowserSanityTest
LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider
include $(BUILD_PREBUILT)

当然 也可以参考别人的配置,其实就是一样的:

java 复制代码
```java
###############################################################################
# Chrome
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Chrome
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_OVERRIDES_PACKAGES := Browser Browser2 MtkBrowser MtkBrowserAutoTests BrowserSanityTest
LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider
LOCAL_MULTILIB := both
LOCAL_MODULE_CLASS := APPS
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := TrichromeLibrary
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MULTILIB := both
LOCAL_MODULE_CLASS := APPS
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
复制代码
这里最重要的核心配置如下:

```java
LOCAL_OVERRIDES_PACKAGES := Browser Browser2 MtkBrowser MtkBrowserAutoTests BrowserSanityTest

三、知识点扩展

1、PartnerBookmarksProvider 是什么

核心定义

  • 位置:packages/providers/PartnerBookmarksProvider/
  • 类型:ContentProvider 实现
  • 权限:com.android.providers.partnerbookmarks.permission.READ_PARTNER_BOOKMARKS

主要功能与用途

    1. 出厂预装书签管理-OEM 厂商可以在设备出厂时预置一组书签;运营商(Carrier)可以定制自己版本的书签
java 复制代码
<!-- 系统预置的书签配置文件示例 -->
/system/etc/partnerbookmarks/bookmarks.xml
/vendor/etc/partnerbookmarks/bookmarks.xml
    1. 合作推广与内容集成
      Google 服务推广:预置 Google 相关服务链接
      运营商服务:运营商的客户服务、账户管理链接
      厂商生态:设备制造商的云服务、支持网站
      本地化内容:针对不同地区的本地网站推荐

2、编译脚本-LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider 是做什么的

LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProviderAndroid 构建系统(Android.mk 或 Android.bp)中的一个重要声明,用于定义模块间的构建依赖关系。

详细解析

1. LOCAL_REQUIRED_MODULES 的含义
java 复制代码
# 语法
LOCAL_REQUIRED_MODULES := module1 module2 module3 ...

# 作用:
# 1. 构建顺序:确保列出的模块在当前模块之前构建
# 2. 安装依赖:这些模块会被包含在系统镜像中
# 3. 运行时依赖:这些模块是当前模块运行所必需的
2. 具体模块分析

TrichromeLibrary

java 复制代码
# Chrome/Chromium 的共享库模块
# 作用:让多个Chrome应用共享同一个WebView库,减少磁盘占用
  • 用途:Chrome 的多进程架构支持
  • 必要性:如果当前模块是基于WebView或Chromium的浏览器,需要此库

BookmarkProvider

java 复制代码
# AOSP 中的系统书签提供者
# 路径:packages/providers/BookmarkProvider/
  • 用途:管理系统书签的ContentProvider
  • 功能:存储、查询、同步用户的书签数据
  • 接口:content://browser/bookmarks

PartnerBookmarksProvider

java 复制代码
# 合作伙伴书签提供者
# 路径:packages/providers/PartnerBookmarksProvider/
  • 用途:管理厂商/运营商预装书签
  • 功能:提供预置书签的读取接口
  • 接口:content://com.android.partnerbookmarks/bookmarks

实际应用场景

场景1:定制浏览器应用
java 复制代码
# 某个厂商定制浏览器的 Android.mk 片段
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := VendorBrowser
LOCAL_SRC_FILES := $(call all-java-files-under, src)

# 依赖这些模块
LOCAL_REQUIRED_MODULES := \
    TrichromeLibrary \
    BookmarkProvider \
    PartnerBookmarksProvider

# 可能还有这些依赖
LOCAL_STATIC_JAVA_LIBRARIES := \
    android-support-v4 \
    chrome-verifier

include $(BUILD_PACKAGE)
场景2:系统镜像构建配置
java 复制代码
# 在设备配置文件 device.mk 中
PRODUCT_PACKAGES += \
    TrichromeLibrary \
    BookmarkProvider \
    PartnerBookmarksProvider \
    VendorBrowser  # 这个应用依赖上面的模块

构建系统的工作流程

步骤1:依赖解析
java 复制代码
# 构建系统看到 LOCAL_REQUIRED_MODULES 后会:
1. 检查 TrichromeLibrary 是否存在
2. 检查 BookmarkProvider 是否存在  
3. 检查 PartnerBookmarksProvider 是否存在
4. 确保这些模块在构建顺序中优先
步骤2:构建顺序保证
java 复制代码
# 构建顺序示例
[1] Building: TrichromeLibrary
[2] Building: BookmarkProvider  
[3] Building: PartnerBookmarksProvider
[4] Building: VendorBrowser  # 当前模块
步骤3:安装包生成
java 复制代码
# 在最终的 system.img 中会包含:
/system/app/TrichromeLibrary/TrichromeLibrary.apk
/system/priv-app/BookmarkProvider/BookmarkProvider.apk
/system/priv-app/PartnerBookmarksProvider/PartnerBookmarksProvider.apk
/system/app/VendorBrowser/VendorBrowser.apk

3、典型场景:一个基于 Chromium 的浏览器应用

  • TrichromeLibrary:Chromium 的共享库支持
  • BookmarkProvider:用户书签的存储和管理
  • PartnerBookmarksProvider:厂商预置书签的访问

4、PartnerBookmarksProvider 在AOSP中的意义

OEM/运营商定制化需求

  • 允许手机制造商(如 Samsung、小米)和运营商(如 Verizon、AT&T)预置自己的书签
  • 这些书签会出现在系统浏览器、启动器的快捷方式等位置
  • 无需修改系统源码,通过配置文件即可实现

商业化支持

  • 运营商可以通过预置书签推广自己的服务
  • OEM 厂商可以预置合作伙伴网站的快捷方式
  • 产生收入来源(预装费用)

用户体验一致性

  • 提供标准化的书签管理接口
  • 确保预装书签与用户添加的书签行为一致
  • 支持同步、备份等标准书签功能

总结

  • 作为一个自己知识点储备中第一次接触一个需求:需要定制主页,懵逼了! 但是网上有大量资料,问题是资料并不是自己想要的。因为整个流程、思想没搞清楚,细节知识点不太明白。
  • 这里面其实就是分两步:配置 PartnerBookmarksProvider 组件;内置内置浏览器apk时候比如Chrome浏览器,需要在编译脚本中配置依赖的 PartnerBookmarksProvider 服务组件
  • 特别注意:在实际开发中,并不是每个项目都有配置主页的需求、并不是每个项目配置的主页或者书签一样的,所以千万不能放到公版软件里面,一定是分支实现差异化。