launcher源码修改 2
替换报名
1、将包名package=”com.android.launcher”换成自己的定义的包名,如:
2、并将文件移植到com.xuhun.android.launcher包文件夹中:
3、报错Error:(1780, 59) 错误: 程序包com.android.launcher.R不存在
将com.android.launcher.R替换成com.xuhun.android.launcher.R;或者直接删除”com.android.launcher.”
4、在设备(手机)中应用ID还是com.android.launcher。
在cmd.exe中adb shell -> pm -p com.android.launcher查询
需要修改build.gradle(Module:app)中的
applicationId “com.xuhun.android.launcher”
再pm -p com.android.launcher查询:
5、报错Error:(11) No resource identifier found for attribute ‘defaultScreen’ in package ‘com.android.launcher’
需要修改布局文件中xmlns:launcher=”http://schemas.android.com/apk/res/com.android.launcher”替换成xmlns:launcher=”http://schemas.android.com/apk/res/com.xuhun.android.launcher”或
xmlns:launcher=”http://schemas.android.com/apk/res-auto”
重建工程Project
默认布局
1、布局文件xml
default_workspace.xml
<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
<search
launcher:screen="1"
launcher:x="0"
launcher:y="0" />
<favorite
launcher:packageName="com.android.contacts"
launcher:className="com.android.contacts.DialtactsActivity"
launcher:screen="1"
launcher:x="0"
launcher:y="3" />
<favorite
launcher:packageName="com.android.contacts"
launcher:className="com.android.contacts.DialtactsContactsEntryActivity"
launcher:screen="1"
launcher:x="1"
launcher:y="3" />
<favorite
launcher:packageName="com.android.browser"
launcher:className="com.android.browser.BrowserActivity"
launcher:screen="1"
launcher:x="2"
launcher:y="3" />
<favorite
launcher:packageName="com.google.android.apps.maps"
launcher:className="com.google.android.maps.MapsActivity"
launcher:screen="1"
launcher:x="3"
launcher:y="3" />
<favorite
launcher:packageName="com.android.mms"
launcher:className="com.android.mms.ui.ConversationList"
launcher:screen="1"
launcher:x="0"
launcher:y="2" />
<favorite
launcher:packageName="com.android.vending"
launcher:className="com.android.vending.AssetBrowserActivity"
launcher:screen="1"
launcher:x="3"
launcher:y="2" />
</favorites>
xml布局读取
LauncherProvider.java的内部类DatabaseHelper中
/**
* Loads the default set of favorite packages from an xml file.
*
* @param db The database to write the values into
*/
private int loadFavorites(SQLiteDatabase db) {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ContentValues values = new ContentValues();
PackageManager packageManager = mContext.getPackageManager();
int i = 0;
try {
XmlResourceParser parser = mContext.getResources().getXml(R.xml.default_workspace);
AttributeSet attrs = Xml.asAttributeSet(parser);
XmlUtils.beginDocument(parser, TAG_FAVORITES);
final int depth = parser.getDepth();
int type;
while (((type = parser.next()) != XmlPullParser.END_TAG ||
parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
if (type != XmlPullParser.START_TAG) {
continue;
}
boolean added = false;
final String name = parser.getName();
TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);
values.clear();
values.put(LauncherSettings.Favorites.CONTAINER,
LauncherSettings.Favorites.CONTAINER_DESKTOP);
values.put(LauncherSettings.Favorites.SCREEN,
a.getString(R.styleable.Favorite_screen));
values.put(LauncherSettings.Favorites.CELLX,
a.getString(R.styleable.Favorite_x));
values.put(LauncherSettings.Favorites.CELLY,
a.getString(R.styleable.Favorite_y));
if (TAG_FAVORITE.equals(name)) {
added = addShortcut(db, values, a, packageManager, intent);
} else if (TAG_SEARCH.equals(name)) {
added = addSearchWidget(db, values);
} else if (TAG_CLOCK.equals(name)) {
added = addClockWidget(db, values);
}
if (added) i++;
a.recycle();
}
} catch (XmlPullParserException e) {
LogHelper.errorLog(" Got exception parsing favorites.", e);
} catch (IOException e) {
LogHelper.errorLog(" Got exception parsing favorites.", e);
}
return i;
}
XmlUtils.beginDocument报错,可用源码中方法替换:
修改主屏DEFAULT_SCREN
修改Launcher.java中DEFAULT_SCREN
default_workspace.xml中修改Apk图标位置:
launcher:screen=”0”//第几屏
launcher:x=”3”
launcher:y=”3”
Launcher3 中默认布局
文件:
布局读取InvariantDeviceProfile