提示:MTK-Android12-Android13-系统预装Chrome并自定义主页-导向百度主页
文章目录
- 前言-需求-场景
- 一、参考资料
- 二、难点-困难点
- 二、实现方案
-
- [服务组件PartnerBookmarksProvider 配置主页](#服务组件PartnerBookmarksProvider 配置主页)
-
- 新建-ContentProvider-PartnerHomepageProviderExample
- [配置文件AndroidManifest.xml 中配置ContentProvider-PartnerHomepageProviderExample](#配置文件AndroidManifest.xml 中配置ContentProvider-PartnerHomepageProviderExample)
- [编译脚本.mk 文件配置服务组件-PartnerHomepageProvider](#编译脚本.mk 文件配置服务组件-PartnerHomepageProvider)
- 三、知识点扩展
-
- [1、PartnerBookmarksProvider 是什么](#1、PartnerBookmarksProvider 是什么)
- [2、编译脚本-LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider 是做什么的](#2、编译脚本-LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider 是做什么的)
- [3、典型场景:一个基于 Chromium 的浏览器应用](#3、典型场景:一个基于 Chromium 的浏览器应用)
- [4、PartnerBookmarksProvider 在AOSP中的意义](#4、PartnerBookmarksProvider 在AOSP中的意义)
- 总结
前言-需求-场景
很多Android客制化产品,内置谷歌或者其它浏览器,但是会根据对应客户和产品使用场景,预设主页,打开 谷歌或者其它浏览器时候能够直接跳转到客制化主页,比如:百度、谷歌、搜狗 的主页,提升用户体验。
实际效果如下:

一、参考资料
二、难点-困难点
浏览器是以 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
主要功能与用途
-
- 出厂预装书签管理-OEM 厂商可以在设备出厂时预置一组书签;运营商(Carrier)可以定制自己版本的书签
java
<!-- 系统预置的书签配置文件示例 -->
/system/etc/partnerbookmarks/bookmarks.xml
/vendor/etc/partnerbookmarks/bookmarks.xml
-
- 合作推广与内容集成
Google 服务推广:预置 Google 相关服务链接
运营商服务:运营商的客户服务、账户管理链接
厂商生态:设备制造商的云服务、支持网站
本地化内容:针对不同地区的本地网站推荐
- 合作推广与内容集成
2、编译脚本-LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider 是做什么的
LOCAL_REQUIRED_MODULES := TrichromeLibrary BookmarkProvider PartnerBookmarksProvider 是 Android 构建系统(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服务组件 - 特别注意:在实际开发中,并不是每个项目都有配置主页的需求、并不是每个项目配置的主页或者书签一样的,所以千万不能放到公版软件里面,一定是分支实现差异化。