Launcher 总结:
1、launcher的布局太居中,要想两边拉伸
<\packages\apps\Launcher2\res\values\dimens.xml>
<dimen name=" apps_customize_pageLayoutPaddingLeft">40dp</dimen>
<dimen name=" apps_customize_pageLayoutPaddingRight">40dp</dimen>
apps tab栏的宽度( Launcher2 icon 数目、大小)
\packages\apps\Launcher2\res\layout-sw720dp\workspace.xml>
launcher:cellCountX="10"
launcher:cellCountY="6"
2、或者不想改数目:
<\packages\apps\Launcher2\src\com\Android\launcher2\AppsCustomizeTabHost.Java>
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mTabs.getLayoutParams().width = contentWidth + 108;
3、workspace、AppsCustomize的cell大小:
<\packages\apps\Launcher2\res\values-sw600dp\dimens.xml>
<dimen name="workspace_cell_width">110dip</dimen>
<dimen name="workspace_cell_height">110dip</dimen>
<dimen name="apps_customize_cell_width">110dp</dimen>
<dimen name="apps_customize_cell_height">110dp</dimen>
4、里面icon的大小:
<\packages\apps\Launcher2\res\values-sw600dp\dimens.xml>
<dimen name="app_icon_size">80dp</dimen>
5、workspace没有拖动,第二页第一个icon出现在第一页的最右边:
加大workspace的宽度,或间距:
workspace的paddingLeft、paddingRight:
<\packages\apps\Launcher2\res\values-sw600dp-land\dimens.xml>
<dimen name="workspace_left_padding">50dip</dimen>
<dimen name="workspace_right_padding">50dip</dimen>
workspace两屏间距:
<dimen name="workspace_page_spacing">100dp</dimen>
修改workspace的字体大小:
如果没有就添加:
<\packages\apps\Launcher2\res\values-sw480dp\styles.xml>
<style name="WorkspaceIcon.Landscape">
<item name="android:textSize">13sp</item>
</style>
6、加wallpaper:
1.<\packages\apps\Launcher2\res\values-sw600dp\wallpapers.xml>
加wallpaper的名字
2.<\packages\apps\Launcher2\res\drawable-nodpi>
加如wallpaper
7、gallery的widget默认添加到workspace上:
<\packages\apps\Launcher2\res\xml\default_workspace.xml>
<!-- Middle screen [2] -->
<appwidget
launcher:packageName="com.android.gallery3d"
launcher:className="com.android.gallery3d.gadget.PhotoAppWidgetProvider"
launcher:screen="2"
launcher:x="1"
launcher:y="0"
launcher:spanX="3"
launcher:spanY="3" />
<\packages\apps\Gallery2\src\com\android\gallery3d\gadget\PhotoAppWidgetProvider.java>
@Override
public void onUpdate(Context context,
for (int id : appWidgetIds) {
if(id == 2){
helper.setWidget(id,WidgetDatabaseHelper.TYPE_SHUFFLE, null);
}
}
8、在桌面上添加网页的快捷方式:
<\packages\apps\Launcher2\res\xml\default_workspace.xml>
<shortcut
launcher:title="@string/application_name"
launcher:icon="@drawable/ic_no_applications"
launcher:uri="http://www.aaa.com"
launcher:screen="0"
launcher:x="0"
launcher:y="3" />
9、在桌面上默认放文件夹:
<\packages\apps\Launcher2\res\xml\default_workspace.xml>
<folder
launcher:screen="2"
launcher:x="2"
launcher:y="2"
launcher:title = "@string/application_name" >
<favorite
launcher:className="com.android.deskclock.DeskClock"
launcher:packageName="com.android.deskclock"
launcher:Container="1"
launcher:x="0"
launcher:y="0" />
<favorite
launcher:className="com.android.calculator2.Calculator"
launcher:packageName="com.android.calculator2"
launcher:container="1"
launcher:x="0"
launcher:y="0" />
</folder>
10、桌面上添加快捷方式,点击播放视频:
<\packages\apps\Launcher2\res\xml-sw720dp\default_workspace.xml>
<shortcut launcher:title="@string/application_name"
launcher:icon="@drawable/ic_launcher_application"
launcher:uri="file:///mnt/sdcard/external_sdcard/1...playermenu;end"
launcher:screen="2"
launcher:x="1"
launcher:y="1" />
11、安装apk,显示隐藏的google play:
1.写google显示的apk:
GooglePlayShow的activity:
ComponentName componentname = new ComponentName("com.android.vending", "com.android.vending.AssetBrowserActivity");
packagemanager.setComponentEnabledSetting(componentname, 1, 1);
componentname = new ComponentName("com.example.googleplayshow", "com.example.googleplayshow.MainActivity");
packagemanager.setComponentEnabledSetting(componentname, 2, 1);
2.<\packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java>
} else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
if (!replacing) {
if(packageName.equals("com.example.googleplayshow")){
context.startActivity(new Intent().setComponent(new ComponentName("com.example.googleplayshow", "com.example.googleplayshow.MainActivity")).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
op = PackageUpdatedTask.OP_ADD;
} else {
op = PackageUpdatedTask.OP_UPDATE;
}
}
隐藏google search:
<\packages\apps\Launcher2\src\com\android\launcher2\Launcher.java>
private void setupViews() {
mSearchDropTargetBar = (SearchDropTargetBar) mDragLayer.findViewById(R.id.qsb_bar);
mSearchDropTargetBar.hideSearchBar(false);
void showWorkspace(boolean animated, Runnable onCompleteRunnable) {
//mSearchDropTargetBar.showSearchBar(wasInSpringLoadedMode);
12、widget中隐藏google play:
<\packages\apps\Launcher2\src\com\android\launcher2\AppsCustomizePagedView.java>
updatePackages里面添加:
if(!widget.provider.getPackageName().equals("com.android.vending") && !widget.provider.getPackageName().equals("com.android.vending.MarketWidgetProvider")){
mWidgets.add(widget);
}
13、clock的widget下部分显示不全,向上调
<\packages\amlogic\Launcher2\res\values\dimens.xml>
<dimen name="app_widget_preview_padding_top">10dp</dimen>
修改widget的text的size:
<\packages\amlogic\Launcher2\res\layout\apps_customize_widget.xml>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_name"
android:textSize="20sp" />
14、launcher中隐藏一个app:
需要该app的packageName,例如要隐藏settings:
<\packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java>
private void loadAllAppsByBatch() {
apps = packageManager.queryIntentActivities(mainIntent, 0);
ResolveInfo removeApp = null;
for(ResolveInfo info:apps){
if(info.activityInfo.packageName.equals("com.android.settings")){
removeApp = info;
}
}
if(removeApp != null){
apps.remove(removeApp);
}
15、launcher中隐藏多个app: 红色为改动部分
<\packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java>
private void loadAllAppsByBatch() {
final PackageManager packageManager = mContext.getPackageManager();
List<ResolveInfo> apps = new ArrayList<ResolveInfo>();
List<ResolveInfo> allApps = null;
int N = Integer.MAX_VALUE;
int startIndex;
int i=0;
int batchSize = -1;
while (i < N && !mStopped) {
if (i == 0) {
mAllAppsList.clear();
final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;
allApps = packageManager.queryIntentActivities(mainIntent, 0);
for(ResolveInfo info : allApps){
if(info.activityInfo != null
&& !info.activityInfo.packageName.equalsIgnoreCase("com.android.email")
&& !info.activityInfo.packageName.equalsIgnoreCase("com.android.providers.downloads.ui")
&& !info.activityInfo.packageName.equalsIgnoreCase("com.adobe.flashplayer")){
apps.add(info);
}
}
settings 问题总结:
1.入口,设置分屏显示
frameworks\base\core\res\res\values\bools.xml 下的 preferences_prefer_dual_pane 为true.
<bool name="preferences_prefer_dual_pane">true</bool>
2.top level headers--这里可以去掉左边的headers
<settings.java>
private void updateHeaderList(List<Header> target) {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
target.remove(header);
}
3.默认字体:
public void readFontSizePreference(ListPreference pref) {
ActivityManagerNative.getDefault().getConfiguration()
系统的Configuration是从ActivityManagerService设置的:
<\frameworks\base\services\java\com\android\server\am\ActivityManagerService.java>
mConfiguration.setToDefaults();
fontScale = Float.parseFloat(SystemProperties.get("ro.fontScale","1"));
4.settings的theme:
<\packages\apps\Settings\AndroidManifest.xml>
<application android:label="@string/settings_label"
android:icon="@mipmap/ic_launcher_settings"
android:taskAffinity=""
android:theme="@android :style/Theme.Holo"
android:uiOptions="splitActionBarWhenNarrow"
android:hardwareAccelerated="true">
<\frameworks\base\core\res\res\values\themes.xml>
<style name="Theme.Holo">
字体颜色
<item name="textColorPrimary">@android :color/primary_text_holo_dark</item>
加亮框的颜色:
<item name="activatedBackgroundIndicator">@android :drawable/activated_background_holo_dark</item>
触摸框的颜色:
<item name="listChoiceBackgroundIndicator">@android :drawable/list_selector_holo_dark</item>
左边背景:
<item name="windowBackground">@android :drawable/screen_background_selector_dark</item>
右边的背景:
<item name="detailsElementBackground">@android :drawable/panel_bg_holo_dark</item>
title的背景:
<item name="actionBarStyle">@android :style/Widget.Holo.ActionBar</item>
5.设置--》开发者选项--修改后台进程限制
frameworks/base/services/java/com/android/server$ vi ./am/ActivityManagerService.java
大概839行 把int mProcessLimitOverride = -1;改成4(不得超过4个进程)
标准限制 对应 -1
不允许后台进程 对应 0
不得超过1个进程 对应 1
不得超过2个进程 对应 2
不得超过3个进程 对应 3
6. 默认不要锁屏,设置-安全--屏幕锁定 (无)
overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<bool name="def_lockscreen_disabled">true</bool>
7. 位置服务--- 默认Google的位置服务为勾选
overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<string name="def_location_providers_allowed" translatable="false">gps</string>
改成
<string name="def_location_providers_allowed" translatable="false">gps,network</string>
常用修改
一. 修改默认(Settting.apk 中选项默认值一般存在于 frameworks\base\packages\SettingsProvider\res\values\defaults.xml)
1. 默认勾选 未知来源
<bool name="def_install_non_market_apps">false</bool>
2. 默认铃声, 通知, 闹钟 音乐
可以在system.prop 分别配置
ro.config.ringtone=Playa.ogg (默认铃声设置,文件在/system/media/audio/ringtones 把喜欢的铃声放这里,比如123.MP3放入ringtones文件夹中,这里代码改为ro.config.ringtone=123.mp3)
ro.config.notification_sound=regulus.ogg (默认提示音,文件在/system/media/audio/notifications 修改方法同上)
ro.config.alarm_alert=Alarm_Beep_03.ogg (默认闹铃,文件在/system/media/audio/alarms 修改方法同上)
3. 壁纸不跟随滑动
packages/apps/Launcher2/./src/com/android/launcher2/Workspace.java 大概 875行
private float wallpaperOffsetForCurrentScroll()
修改 wallpaperOffsetForCurrentScroll 的返回值。 改成 return 0.5f;
二.隐藏或删除某项
1.去掉设置中Wifi选项
device/amlogic/xxxref/xxxref.mk 文件中
# Device specific system feature description
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/tablet_core_hardware.xml:system/etc/permissions/tablet_core_hardware.xml \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \ (删除)
2.去掉设置中蓝牙选项
参考 wifi。
在 tablet_core_hardware.xml 删除 <feature name="android.hardware.bluetooth" /> 这一行
3. HDMI 部分
1)去掉HDMI选项 在system.prop中 加入 ro.hdmi.autoswitch=false
2)去掉480p 选项 在prop中设置 ro.hdmi480p.enable=false
4. 去掉 powerwidget 中 某一项
以去掉 gps 为例
在 packages\apps\Settings\res\layout\widget.xml 下, 移除
<ImageView
android:layout_width="1dip"
android:layout_height="match_parent"
android:background="@drawable/appwidget_settings_divider_holo"
android:contentDescription="@null"
/>
<LinearLayout
android:id="@+id/btn_bluetooth"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
android:paddingTop="12dp"
android:background="@drawable/appwidget_button_center"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<ImageView
android:id="@+id/img_bluetooth"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:scaleType="center"
android:contentDescription="@null"
/>
<ImageView
android:id="@+id/ind_bluetooth"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:contentDescription="@null"
/>
</LinearLayout>
然后 com.android.settings.widget.SettingsAppWidgetProvider.java
注释 views.setOnClickPendingIntent(R.id.btn_gps, getLaunchPendingIntent(context, BUTTON_GPS)); 这一行。
5. 去掉 Setting widget 中 某一项
以去掉 "网络共享与便携式热点" 为例
根据"网络共享与便携式热点" 这个关键词 在 values-zh_rCN 中搜索 到的 key值, 然后在AndroidManifest.xml 搜索这个 key值。 找到对于的Activity 配置
移除 <category android:name="com.android.settings.SHORTCUT" /> 这一行。
6. 修改浏览器默认浏览器模式
packages\apps\Browser\res\xml-sw600dp\advanced_preferences.xml
<ListPreference
android:key="user_agent"
android:title="@string/pref_development_uastring"
android:entries="@array/pref_development_ua_choices"
android:entryValues="@array/pref_development_ua_values"
android:defaultValue="3"/>
修改 android:defaultValue="3" 具体的值参考一下选项
<string-array name="pref_development_ua_choices" translatable="false">
<item>Android</item>
<item>Desktop</item>
<item>iPhone</item>
<item>iPad</item>
<item>Froyo-N1</item>
<item>Honeycomb-Xoom</item>
</string-array>
<!-- Do not tranlsate. Development option -->
<string-array name="pref_development_ua_values" translatable="false">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
7. workspace 预置 文件夹
范例
folder 放到最前面。launcher:container 的值是folder的数据库中的id。一般从1开始。
<folder
launcher:screen="2"
launcher:x="1"
launcher:y="1"
launcher:title ="@string/application_name" >
<favorite
launcher:className="com.android.settings"
launcher:packageName="com.android.settings.Settings"
launcher:container="2"
launcher:x="0"
launcher:y="0" />
<favorite
launcher:className="com.fb.FileBrower"
launcher:packageName="com.fb.FileBrower.FileBrower"
launcher:container="2"
launcher:x="0"
launcher:y="0" />
</folder>
widget 范例
<appwidget
launcher:packageName="com.android.calendar"
launcher:className="com.android.calendar.widget.CalendarAppWidgetProvider"
launcher:screen="1"
launcher:x="0"
launcher:y="0"
launcher:spanX="2"
launcher:spanY="3" />
快捷方式范例
<favorite
launcher:packageName="com.android.settings"
launcher:className="com.android.settings.Settings"
launcher:screen="2"
launcher:x="1"
launcher:y="3" />
网页快捷方式
<shortcut
launcher:title="@string/custom_google"
launcher:icon="@drawable/favicon_google"
launcher:uri="http://www.google.com/"
launcher:screen="3"
launcher:x="4"
launcher:y="1"/>
8. 系统自带LatinIME 高级设置--按键音量设置 修改默认值
java/res/values/keypress-volumes.xml
<string-array name="keypress_volumes" translatable="false">
<!-- Build.HARDWARE,volume -->
<item>amlogic,0.3</item> //加入这行。 把0.3改成自己的默认值。0.3代表30%
<item>herring,0.5</item>
<item>tuna,0.5</item>
<item>stingray,0.4</item>
9.lockscreen坐标数字时钟被遮住
请调整红色的数字:
<\frameworks\base\core\res\res\layout-sw600dp\keyguard_screen_tab_unlock_land.xml>
<!-- left side: status and music -->
<RelativeLayout
android:layout_height="match_parent"
android:layout_weight="0.5"
<!-- right side -->
<RelativeLayout
android:layout_height="match_parent"
android:layout_weight="0.5"
10.在4.1上修改默认字体大小:
比如改成大:
<frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<fraction name="def_font_scale">115%</fraction>
11.没有蓝牙的平台,去掉窗口小部件-设置快捷方式-拉到桌面显示的“蓝牙”选项
<\packages\apps\Settings\src\com\android\settings\OutputSettingsBroadcastReceiver.java>
public void onReceive(Context context, Intent intent)
{
// boot completed
if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED))
{
if(!context.getPackageManager().hasSystemFeature(context.getPackageManager().FEATURE_BLUETOOTH)){
ComponentName componentname = new ComponentName("com.android.settings", "com.android.settings.Settings$BluetoothSettingsActivity");
context.getPackageManager().setComponentEnabledSetting(componentname, 2, 1);
}
}
11. 修改 浏览器的默认标签
分别在一下资源文件中添加自定义的标签
packages\apps\Browser\res\values\strings.xml
<string-array name="bookmarks" translatable="false">
<item>Google</item>
<item>http://www.google.com/</item>
<item>Picasa</item>
<item>http://picasaweb.google.com/</item>
<item>Yahoo!</item>
<item>http://www.yahoo.com/</item>
<item>MSN</item>
<item>http://www.msn.com/</item>
<item>Twitter</item>
<item>http://twitter.com/</item>
<item>Facebook</item>
<item>http://www.facebook.com/</item>
<item>Wikipedia</item>
<item>http://www.wikipedia.org/</item>
<item>eBay</item>
<item>http://www.ebay.com/</item>
<item>CNN</item>
<item>http://www.cnn.com/</item>
<item>NY Times</item>
<item>http://www.nytimes.com/</item>
<item>ESPN</item>
<item>http://espn.com/</item>
<item>Amazon</item>
<item>http://www.amazon.com/</item>
<item>Weather Channel</item>
<item>http://www.weather.com/</item>
<item>BBC</item>
<item>http://www.bbc.co.uk/</item>
</string-array>
packages\apps\Browser\res\values\bookmarks_icons.xml ,
注意:这里每个网站对应一个缩略图和一个favicon
<array name="bookmark_preloads">
<item>@raw/favicon_google</item>
<item>@raw/thumb_google</item>
<item>@raw/favicon_picasa</item>
<item>@raw/thumb_picasa</item>
<item>@raw/favicon_yahoo</item>
<item>@raw/thumb_yahoo</item>
<item>@raw/favicon_msn</item>
<item>@raw/thumb_msn</item>
<item>@raw/favicon_twitter</item>
<item>@raw/thumb_twitter</item>
<item>@raw/favicon_facebook</item>
<item>@raw/thumb_facebook</item>
<item>@raw/favicon_wikipedia</item>
<item>@raw/thumb_wikipedia</item>
<item>@raw/favicon_ebay</item>
<item>@raw/thumb_ebay</item>
<item>@raw/favicon_cnn</item>
<item>@raw/thumb_cnn</item>
<item>@raw/favicon_nytimes</item>
<item>@raw/thumb_nytimes</item>
<item>@raw/favicon_espn</item>
<item>@raw/thumb_espn</item>
<item>@raw/favicon_amazon</item>
<item>@raw/thumb_amazon</item>
<item>@raw/favicon_weatherchannel</item>
<item>@raw/thumb_weatherchannel</item>
<item>@raw/favicon_bbc</item>
<item>@raw/thumb_bbc</item>
</array>
对应的图片在 packages\apps\Browser\res\raw
12. 锁屏界面, 解锁组件增加图标
已增加 VideoPlayer 为例,
在frameworks/base/core/res/res/drawable-hdpi 下面
添加一个对应的png图标
下面红色为增加的部分。
frameworks/core/res/res/values-sw600dp-land/arrays.xml
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_camera</item>
- <item>@null</item>
+ <item>@drawable/ic_lockscreen_videoplayer</item>
</array>
<array name="lockscreen_target_descriptions_with_camera">
frameworks/base/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_camera</item>
- <item>@null</item>
+ <item>@drawable/ic_lockscreen_videoplayer</item>
</array>
<array name="lockscreen_target_descriptions_with_camera">
frameworks/base/res/res/values/public.xml b/core/res/res/values/public.xml
index ac0a457..be4257e 100755
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
<java-symbol type="drawable" name="ic_lockscreen_unlock_phantom" />
<java-symbol type="drawable" name="ic_media_route_on_holo_dark" />
<java-symbol type="drawable" name="ic_media_route_disabled_holo_dark" />
<java-symbol type="drawable" name="ic_lockscreen_videoplayer" />
<java-symbol type="layout" name="action_bar_home" />
<java-symbol type="layout" name="action_bar_title_item" />
<java-symbol type="layout" name="action_menu_item_layout" />
frameworks/base/policy/src/com/android/internal/policy/impl/LockScreen.java
case com.android.internal.R.drawable.ic_lockscreen_camera:
launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA));
mCallback.pokeWakelock();
break;
case com.android.internal.R.drawable.ic_lockscreen_videoplayer:
launchActivity(new Intent().setClassName("com.farcore.videoplayer", "com.farcore.videoplayer.FileList"));
mCallback.pokeWakelock();
break;
注意: 在 frameworks/base/core/res/ 中执行mm 。然后在frameworks/base/policy 中执行mm。看看能否编译过。不行的话,在 在根目录下 执行make update-api
13. 休眠策略
修改默认的休眠策略,请参考
frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<integer name="def_wifi_sleep_policy">0</integer>
<!-- 0 == Never, 1 == Only when plugged in,2 == Always. -->
14. Launcher 半透明
4.0, 4.1 下载附件中的patch集合--- translucent.zip
如果是 4.2.2系统 , 还需修改
Launcher/src/com/android/launcher2/Launcher.java
mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg);
mBlackBackgroundDrawable = new ColorDrawable(Color.BLACK); // 修改为 mBlackBackgroundDrawable = new ColorDrawable(0x7f000000);
packages\amlogic\Launcher2\src\com\android\launcher2\Launcher.java
mStateAnimation.addListener(new AnimatorListenerAdapter() {
boolean animationCancelled = false;
@Override
public void onAnimationStart(Animator animation) {
dispatchOnLauncherTransitionEnd(fromView, animated, false); //add
dispatchOnLauncherTransitionEnd(toView, animated, false); //add
updateWallpaperVisibility(false); //true 改成false
// Prepare the position
toView.setTranslationX(0.0f);
toView.setTranslationY(0.0f);
toView.setVisibility(View.VISIBLE);
toView.bringToFront();
}
15. APK 预装时无法找到lib库的问题
(1) 如果log报错是找不到lib库首先可以修改lib的路径
jb4.1\frameworks\base\core\java\android\app\NativeActivity.java
public static final String SYSTEM_LIB_PATH = "/system/lib";
if (libraryFile.exists()) {
path = libraryFile.getPath();
}else{
File systemLibraryFile = new File(SYSTEM_LIB_PATH,System.mapLibraryName(libname));
if (systemLibraryFile.exists()) {
path = systemLibraryFile.getPath();
}
}
(2)apk本身会检测检测/data/data/lib路径是否存在资源文件时方法1不适用,用第二种方法:
在项目上的mk文件 /device/amlogic/g18refg/8ref.mk 中,加上 preinstallation
PRODUCT_PACKAGES += \
lights.amlogic \
FileBrowser \
AppInstaller \
VideoPlayer \
HdmiSwitch \
Update \
fw_env \
preinstallation
将网页底部的附件 Preinstallation.zip拷贝到packages\amlogic下面解压 将需要预装安装的apk拷贝到preinstallation目录下面,编辑里面的preinstall.sh文件内容如下:
#!/system/xbin/busybox sh
echo "do preinstall applications"
# com.mxtech.videoplayer.ad apk包名
if [ ! -e /data/data/com.mxtech.videoplayer.ad/ ]; then
pm install /system/preinstall/com.mxtech.videoplayer.ad.50.apk
fi
if [ ! -e /data/data/org.xbmc.xbmc/ ]; then
pm install /system/preinstall/xbmc-20130414-e2c3799-Frodo-armeabi-v7a.apk
fi
。。。。。。
然后在device\amlogic\common\init\tablet\init.amlogic.rc 中,启动预安装脚本的服务.
MX:
service preinstall /system/bin/preinstall.sh
class main
user root
group root
oneshot
console
disabled
M3:
service preinstall /system/bin/preinstall.sh
user root
group root
disabled
oneshot
在init.amlogic.rc最后一行加上
start preinstall
16. 去掉 hotspot
把红色的部分删掉
device\amlogic\gXXXX\overlay\frameworks\base\core\res\res\values\config.xml
<string-array translatable="false" name="config_tether_wifi_regexs">
<item>"wlap0"</item>
<item>"wl0.1"</item>
<item>"wlan0"</item>
</string-array>
<integer-array translatable="false" name="config_tether_upstream_types">
<item>0</item>
<item>9</item>
</integer-array>
17.桌面上添加快捷方式,点击播放视频:
<\packages\apps\Launcher2\res\xml-sw720dp\default_workspace.xml>
<shortcut
launcher:title="@string/application_name"
launcher:icon="@drawable/ic_launcher_application" launcher:uri="file:///mnt/sdcard/external_sdcard/1...playermenu;end"
launcher:screen="2" launcher:x="1" launcher:y="1" />
添加网页的快捷方式:
<\packages\apps\Launcher2\res\xml-sw720dp\default_workspace.xml>
<shortcut
launcher:title="@string/application_name"
launcher:icon="@drawable/ic_no_applications"
launcher:uri="http://www.aaa.com"
launcher:screen="0"
launcher:x="0"
launcher:y="3" />
18.去掉camera的全景icon:
4.1:
<\packages\apps\Camera\res\layout-sw600dp-land\mode_picker.xml>
<com.android.camera.ui.RotateImageView android:id="@+id/mode_panorama"
android:contentDescription="@string/accessibility_switch_to_panorama"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
android:scaleType="center"
android:background="@drawable/bg_pressed"
android:src="@drawable/ic_switch_pan_holo_light" />
4.2:
<\packages\apps\Camera\src\com\android\camera\CameraActivity.java>
加上红色加亮的地方:
public void init() {
for (int i = 0; i < mDrawables.length; i++) {
if ((i == LIGHTCYCLE_MODULE_INDEX && !LightCycleHelper.hasLightCycleCapture(this))||i == PANORAMA_MODULE_INDEX) {
continue; // not enabled, so don't add to UI
}
drawids[ix++] = DRAW_IDS[i];
}
<\packages\apps\Camera\src\com\android\camera\CameraActivity.java>
public void init() {
int[] drawids = new int[LightCycleHelper.hasLightCycleCapture(this)
? DRAW_IDS.length -1 : DRAW_IDS.length - 2];
19.锁屏左边clock太大显示不全:
<\frameworks\base\core\res\res\layout-sw600dp\keyguard_screen_status_land.xml>
<TextView android:id="@+id/timeDisplayBackground"
android:textSize="@dimen/keyguard_pattern_unlock_clock_font_size"
<TextView android:id="@+id/timeDisplayForeground"
android:textSize="@dimen/keyguard_pattern_unlock_clock_font_size"
//dimens.xml里的keyguard_pattern_unlock_clock_font_size调小
可以把clock调成居中显示,不要靠右,造成右边显示不全
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right">
//改成center
20. 去掉settings的battery里面的mobile network signal显示
加上红色语句:
<\packages\apps\Settings\src\com\android\settings\fuelgauge\BatteryHistoryChart.java>
if (!com.android.settings.Utils.isWifiOnly(getContext())) {
mHavePhoneSignal = true;
}
mHavePhoneSignal = false;
21. 去掉待机的CRT动画
把自己项目overlay中的
frameworks/base/core/res/res/values/config.xml
<bool name="config_animateScreenLights">false</bool> 删掉 就可以了
22. 添加格式化内部sdcard
jb4.1\packages\amlogic\Settings\src\com\android\settings\deviceinfo\StorageVolumePreferenceCategory.java
public StorageVolumePreferenceCategory(Context context, Resources resources, StorageVolume storageVolume, StorageManager storageManager, boolean isPrimary) {
// Cannot format emulated storage
mAllowFormat = mStorageVolume != null && !mStorageVolume.isEmulated()&&mStorageVolume.isRemovable();
// For now we are disabling reformatting secondary external storage
// until some interoperability problems with MTP are fixed
//if (!isPrimary) mAllowFormat = false;
+ if(mStorageVolume != null && mStorageVolume.getPath().equals("/storage/sdcard0")){
+ mAllowFormat = true;
+ }
23. 4.2 LockScreen 任何方向都可以解锁, 修改成只有向右才能解锁
4.2 Lockscreen 对应的java 文件不再是 Lockscreen, 而是KeyguardSelectorView.java
frameworks/base/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
<array name="lockscreen_targets_unlock_only">
<item>@*android:drawable/ic_lockscreen_unlock</item>
+ <item>@null</item>
+ <item>@null</item>
+ <item>@null</item>
</array>
<array name="lockscreen_target_descriptions_unlock_only">
<item>@*android:string/description_target_unlock</item>
+ <item>@null</item>
+ <item>@null</item>
+ <item>@null</item>
</array>
24.android 4.2改launcher里面的icon横排的数目:
<\packages\apps\Launcher2\res\values-sw720dp\config.xml>
<integer name="cell_count_x">7</integer>
如果改成7,hotseat里面第8个icon不见了,可以往第8个槽里面放进去,但是重启后,icon又不见了,可以这样修改:
<\packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java>
final ItemInfo occupied[][][] =
new ItemInfo[Launcher.SCREEN_COUNT + 1][mCellCountX + 2][mCellCountY + 1]; //原来这里是+1
25. 4.2 LockScreen 解锁界面四个方向添加一个setting入口
frameworks\base\core\res\res\values/arrays.xml
<array name="lockscreen_targets_with_camera">
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_camera</item>
<item>@drawable/ic_lockscreen_settings</item>
</array>
在 frameworks\base\core\res\res\drawable 增加 ic_lockscreen_settings.xml 文件 并添加 ic_lockscreen_settings_normal.phg ic_lockscreen_settings_activated.png 资源文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="true"
android:state_active="false"
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_settings_normal" />
<item
android:state_enabled="true"
android:state_active="true"
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_settings_activated" />
<item
android:state_enabled="true"
android:state_active="false"
android:state_focused="true"
android:drawable="@drawable/ic_lockscreen_settings_activated" />
</selector>
frameworks\base\policy\src\com\android\internal\policy\impl\LockScreen.java
public void onTrigger(View v, int target) {
final int resId = mGlowPadView.getResourceIdForTarget(target);
switch (resId) {
case com.android.internal.R.drawable.ic_lockscreen_settings: //启动setting 应用
launchActivity(new Intent().setComponent(new ComponentName("com.android.settings","com.android.settings.Settings")));
mCallback.pokeWakelock();
break;
26. 4.2 上隐藏 Wifi Display
去掉项目overlay/frameworks/base/core/res/res/config.xml 中的config_enableWifiDisplay
27. 默认音量修改
frameworks/base/media/java/android/media/AudioService.java
private final int[] MAX_STREAM_VOLUME = new int[] {
5, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
7, // STREAM_RING
15, // STREAM_MUSIC
7, // STREAM_ALARM
7, // STREAM_NOTIFICATION
15, // STREAM_BLUETOOTH_SCO
7, // STREAM_SYSTEM_ENFORCED
15, // STREAM_DTMF
15 // STREAM_TTS
};
frameworks/base/media/java/android/media/AudioManager.java
/** @hide Default volume index values for audio streams */
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
4, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
5, // STREAM_RING
11, // STREAM_MUSIC
6, // STREAM_ALARM
5, // STREAM_NOTIFICATION
7, // STREAM_BLUETOOTH_SCO
7, // STREAM_SYSTEM_ENFORCED
11, // STREAM_DTMF
11 // STREAM_TTS
};
28.widget中隐藏google play:
<\packages\apps\Launcher2\src\com\android\launcher2\AppsCustomizePagedView.java>
updatePackages里面添加:
if(!widget.provider.getPackageName().equals("com.android.vending") && !widget.provider.getPackageName().equals("com.android.vending.MarketWidgetProvider")){
mWidgets.add(widget);
}
29.去掉设置-->显示-->亮度里的“自动调整亮度”选项
<\packages\apps\Settings\res\layout\preference_dialog_brightness.xml>
<CheckBox android:id="@+id/automatic_mode"
加上
android:visibility="invisible"
30.设置-位置信息访问权限默认关闭
<\frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<string name="def_location_providers_allowed" translatable="false"></string>
这里不要填写gps或者network,清空
31.设置-安全-验证应用默认不勾允
<\frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<bool name="def_package_verifier_enable">false</bool>
32.设置-声音-触摸提示音与锁屏提示音默认不勾允状态
<\frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<integer name="def_lockscreen_sounds_enabled">0</integer>
<bool name="def_sound_effects_enabled">false</bool>
33.设置-以太网菜单请移动“更多”菜单下
请用附件ethernet.patch,开关是ro.ethernet.more,设置为true,ethernet移到more里面
在settings的Git下打这个patch
34.窗口小部件“指针时钟”显示不全
把clock的widget向上调,下面的值改小:
<\packages\amlogic\Launcher2\res\values\dimens.xml>
<dimen name="app_widget_preview_padding_top">10dp</dimen>
35.去掉settings的more里面的网络共享与便携式热点
ro.tether.denied=true
36.平台主界面底部工具栏上的图标全部居中显示,从左至右的图标依次为:vol-、back、home、窗口切换、vol+
1.在prop里面将ro.statusbar.volume设置为true
2.<\frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml>
将
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/sub"
……
/>
这段放到
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
……
/>
这段之前
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/add"
……
/>
这段放到
<com.android.systemui.statusbar.policy.KeyButtonView
android:id="@+id/recent_apps"
……
/>
这段之后
注意这个文件有两处需要调换上面的
37.主界面模拟时钟改成数字时钟
default_workspace.xml里面加上:
<appwidget
launcher:packageName="com.android.deskclock"
launcher:className="com.android.alarmclock.DigitalAppWidgetProvider"
38、settings中的developer options的开关打开,debug关掉:
<\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java>
private void loadSecureSettings(SQLiteDatabase db) {
loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
loadSetting(stmt, Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 1);
39、改桌面icon行、列数:
<\packages\apps\Launcher2\res\layout-sw***dp\workspace.xml>
launcher:cellCountX="10"
launcher:cellCountY="6"
40、more里面morebile data项默认不选:
1.<\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java>
private void loadSecureSettings(SQLiteDatabase db) {
SQLiteStatement stmt = null;
try {
stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
+ " VALUES(?,?);");
添加:
loadIntegerSetting(stmt, Settings.Secure.MOBILE_DATA,
R.integer.def_mobile_data);
2.<\frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<integer name="def_mobile_data">0</integer>
41.secure的unknown的设置默认打开:
<\frameworks\base\packages\SettingsProvider\res\values\defaults.xml>
<bool name="def_install_non_market_apps">true</bool>
42、修改app list的背景:
<\packages\apps\Launcher2\res\layout\apps_customize_pane.xml>
<com.android.launcher2.AppsCustomizeTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res/c...droid.launcher"
android:background="@drawable/wallpaper_03">
43、bluetooth tethering的checkbox去掉:
overlay里面的
<\frameworks\base\core\res\res\values\config.xml>
<string-array translatable="false" name="config_tether_bluetooth_regexs">
<item>"bt-pan"</item>
</string-array>
去掉<item>"bt-pan"</item>
44. Google play 不是内置, 而是安装,导致出问题的解决办法
frameworks/baseservices/java/com/android/server/pm/PackageManagerService.java
@@ -4594,6 +4594,9 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
}
+ if (pkg.packageName.equals("com.android.vending")){
+ allowed = true;
+ }
if (!allowed && (bp.protectionLevel
& PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
// For development permissions, a development permission
45.以太网设置问题
以太网在settings.db中的条目是"eth_on", 默认值由系统属性 ro.ethernet.default_on 决定,
ro.ethernet.default_on=false 默认关闭
ro.ethernet.default_on=true默认打开
不定义该属性默认关闭
46.开机不停震动
手机开机,马达一直震动,应该是uboot正常启动后,没有设置震动关闭
解决:在震动200ms后关闭马达
u-boot/property/normal_mode.c
void normal_mode(void)
{
//MMU_Init(CONFIG_MMU_TABLE_ADDR);
vibrator_hw_init();
set_vibrator(1);
udelay(200*1000);
set_vibrator(0);
...
}
47.关机震动时间设置
frameworks/base/core/java/com/android/internal/app/ShutdownThread.java中
private static final int SHUTDOWN_VIBRATE_MS = 500; //默认震动0.5秒,修改这个参数
48.设置系统默认音量
修改文件:frameworks/base/media/java/android/media/AudioManager.java
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
4, // STREAM_VOICE_CALL
7, // STREAM_SYSTEM
5, // STREAM_RING
11, // STREAM_MUSIC
6, // STREAM_ALARM
5, // STREAM_NOTIFICATION
7, // STREAM_BLUETOOTH_SCO
11, // STREAM_FM
11, // STREAM_DTMF
11, // STREAM_TTS
7 // STREAM_SYSTEM_ENFORCED
};
根据需要进行修改即可。
注意:如果在3rdparty里面有同名文件最好一起修改。
49.如何调节音量档位
需要根据自己的情况来调整index to volume的算法。
相关实现的模块是 AudioPolicy。基类 AudioPolicyManagerBase 文件位于
framework/base/services/audioflinger/AudioPolicyManagerBase.cpp
实现类 AudioPolicyManagerALSA,位于
external/sprd/alsa/alsa_sound/AudioPolicyManagerALSA.cpp
函数 computeVolume:
这个方法平台目前没有用子类实现,所以走的是基类方法。如果客户需要修改,建议在子类中重载这
个方法。
再讲下基类方法:
1 通过 index 算出一个百分比;
2 通过这个百分比经过一个对数转换换成音量的百分比;
3 特殊情况的一些转换;
修改建议是子类的方法应该调用基类的方法并且做微调。
比如对 1,将 index 到百分比的对应关系略微修改。
比如对 3,可以把基类方法处理的结果在根据需要调整。
50.电池相关
若手机界面的电池进度条显示不够准确,请根据实际测试值调整kernel\drivers\ power\charge.c 的voltage_capacity_table表格中的值 15%对应的是低电告警电压,而0%是自动关机电压。
电池的报警电压调整:frameworks\base\core\res\res\values\config.xml,
config_lowBatteryWarningLevel:15----->百分比,可以动态调整该数值来调整低电电压。
过压保护的逻辑在:
Kernel\drivers\power\sprd_power.c里
charge_handler()函数中有个battery_data->over_voltage用于电压保护逻辑。
这个数值的来源是Kernel\arch\arm\mach-sc8810\include\mach\chg_drvapi.h
#define OVP_OVER_VOL 6500
51.修改系统默认时间:
修改\idh.code\kernel\drivers\rtc\ rtc-sprd.c
static int __init sprd_rtc_init(void)
{
......
sec_2011_to_1970 = mktime(2011, 1, 1, 0, 0, 0);
return 0;
}
mktime函数的参数即是修改点。
同时还要同步修改闹钟时间,否则闹钟会有问题。
packages\apps\DeskClock\src\com\android\deskclock\Alarms.java
private static void alarm_flag_setup(final long alarmTimeInMillis) {
Calendar c = Calendar.getInstance();
c.set(2011, 0, 1, 0, 0, 0);//注意这里月份是0代表1月
......
52.如何设置版本号
定义 android 版本号的地方在 build/tools/buildinfo.sh 内,可以修改此文件。
ro.build.display.id=$BUILD_DISPLAY_ID 改为 ro.build.display.id= $BUILD_D ISPLAY_ID_CUSTOM, 然 后 在customize/custom_cfg/proj_name/res/boardconfig.mk
下 定 义 宏BUILD_DISPLAY_ID_CUSTOM 就可以为自己的项目定义版本号.
显示硬件版本在设置->关于手机->硬件版本里看到:
packages/apps/Settings/res/xml/device_info_settings.xml
<Preference android:key="hardware_number"
style="?android:preferenceInformationStyle"
android:title="@string/hard_version"
android:summary="1.1.0"/>
53.无接近传感器,如何在开始通话后关闭屏幕
在 Phone 应用的 phoneApp 这个类中。找到下边这段代码:
mProximityWakeLock =
pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG);
然后注释掉。这个是获取了接近传感器的 WakeLock。然后在 updatePokeLock 这个方法中。将
//pokeLockSetting |= LocalPowerManager.POKE_LOCK_MEDIUM_TIMEOUT;
改为
pokeLockSetting |= LocalPowerManager.POKE_LOCK_SHORT_TIMEOUT;
将updateWakeState 方法中
setScreenTimeout(ScreenTimeoutDuration.DEFAULT);
改为
setScreenTimeout(ScreenTimeoutDuration.SHORT);
这个是将默认延时时间设置为SHORT(5秒)。如果需要改为其他时间需要去改 setScreenTimeout
这个方法。
54.ms,mms,contact 容量限制
[适用版本]2.3.5
1.只要在容量允许的情况下,sms,mms 接收条数是没有限制的,但是每个会话的条数是有限
制的,默认情况下,每个会话的短信限存 200 条,彩信限存 20 条,但是能调整到 5000 条。
MmsConfig.java 代码中做了如下限制:
private static int mDefaultSMSMessagesPerThread = 200;// default value
private static int mMinMessageCountPerThread = 2; // default value
private static int mMaxMessageCountPerThread = 5000; // default value
private static int mDefaultMMSMessagesPerThread = 20; // default value
2.contact 的记录总数目前没有限制。
55.单摄像头进入时间较长如何解决
在customize/customer_cfg/project.../kernel/camera/camera_cfg.c中main_sensor_infor_tab和sub_sensor_infor_tab里会放很多sensor的结构体;camera启动初始化时,底层驱动会匹配相关的菜单,删除没有的sensor,能加快启动
56.客户定制开/关机铃声
开机:替换 3rdparty/anim/poweranim/special/bin/startupsound
关机:替换 3rdparty/anim/poweranim/special/bin/shutdownsound
注:这里的startupsound/shutdownsound可以是mp3或者ogg格式的,替换时不需要扩展名
57.背光亮度,静音等默认值修改
修改\frameworks\base\packages\SettingsProvider\res\values\defaults.xml中的默认值即可。
58.浏览器如何修改内置的“搜索引擎”
修改packages\apps\browser\res\values\donoottranslate-search_engines,xml文件,中
“search_engines”的string-arry中的item项即可。如下事例为内置了 139/百度/google 三个搜索引
擎。
<item>search139</item>
<item>baidu</item>
</string-array>
<item>google</item>
<string-array name="search_engines" translatable="false">
注意:如果支持多种语言,其他文件下的同名文件donoottranslate-search_engines,xml也需要
修改。
59.关机充电动画修改
关机充电动画的资源路径是:
external/sprd/charge/res/images/(展讯平台)
将这个目录下的 png 图片文件修改客户需要的文件就可以了。
60.如何设置默认动态壁纸
找到 /frameworks/base/core/res/res/values/config.xml 文件中
<string name="default_wallpaper_component">@null</string>
为设置默认壁纸的代码如若想要更换成为动态壁纸。只需将“@null”更改为动态壁纸的路径即可,例如:将默认壁纸更改为“线性光幕效果”的动态壁纸,则更改成如下代码:
<string name="default_wallpaper_component">com.android.wallpaper/com.android.wallpaper.nexus.NexusWallpaper</string>
com.android.wallpaper 在 AndroidManifest 文件中的 packagename
com.android.wallpaper.nexus.NexusWallpaper 在 AndroidManifest 文件中的 service name
需要注意的是:静态的图片壁纸和 live wallpaper 是两个系统,加载的时候是完全两套机制,静态图片
通过 launcher 里面的一个 xml 文件配置来管理系统默认静态壁纸,live wallpaper 则是通过 intent 机制向系统搜寻所有匹配 Activity,所以,这里的默认值为 null,而不是那个系统默认静态壁纸的地址,系统是读 config.xml 文件的设置,若为 null 才继续查找静态壁纸配置内容. 没有效果的话,恢复下出厂设置即可。
61.如何设置系统默认壁纸
如果只需要修改动态壁纸,替换 frameworks/base/core/res/res/drawable/default_wallpaper.jpg即可,或者在源码中修改对应 default_wallpaper地址。
62.关机菜单中如何添加重启选项
/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java" 文件添加如下修改部分即可:
mItems = Lists.newArrayList(
// silent mode
mSilentModeToggle,
// next: airplane mode
mAirplaneModeOn,
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_power_off) {
public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.shutdown(mContext, true);
}
public boolean showDuringKeyguard() {
return true;
}
public boolean showBeforeProvisioning() {
return true;
}
},
// add for reboot
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off, //替换成相应的图
R.string.global_action_power_off) { //替换成相应的提示文字
public void onPress() {
ShutdownThread.reboot(mContext, null, true);
}
public boolean showDuringKeyguard() {
return true;
}
public boolean showBeforeProvisioning() {
return true;
}
});
//end add
63.如何修改系统默认输入法
下面将以“谷歌拼音输入法”为例,进行解释和说明。
第一步 修改/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 添加如下代码:
<string name="config_default_input_method"
translatable="false">com.android.inputmethod.pinyin/.PinyinIME</string>
com.android.inputmethod.pinyin 在 AndroidManifest 文件中的 packagename
.PinyinIME 在 AndroidManifest 文件中的service name
第二步:修改
/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
在 private void loadSecureSettings(SQLiteDatabase db) 方法中,添加如下代码:
loadStringSetting( stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
R.string.config_default_input_method );
64.如何在桌面预置应用程序图标
桌面预制的图标:是在 launcher2 的 default_workspace.xml中配置的,文件路径:
Launcher2\res\xml\default_workspace.xml
65.添加搜索引擎
以添加139搜索引擎为例
a) 在packages/apps/Browser/res/values/all_search_engines.xml
<string-array name="search139" translatable="false">
<item>139</item>
<item></item>
<item>http://s.139.com/favicon.ico</item>
<item>http://s.139.com/search.do?q={searchTerms}&category=downloadable|web|browseable&tid=2123,2124,2125,2126&fr=portalcustom2</item>
<item>UTF-8</item>
<item></item>
</string-array>
这6个<item>从上到下依次表示显示标签,关键字,搜索图标,搜索引擎地址,编码方式,搜索提示地址。
b) 在packages/apps/Browser/res/values/donottranslate-search_engines.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="search_engines" translatable="false">
<item>search139</item>
<item>baidu</item>
<item>google</item>
<item>yahoo</item>
<item>bing</item>
</string-array>
</resources>
在这边将139搜索引擎添加进来。
这边添加的搜索引擎是将1中的添加的搜索引擎变成设置中选择搜索引擎的选项。
66.修改 idle 界面搜索引擎的链接地址
packages/apps/quicksearchbox/res/values/strings.xml 下修改:
www.google.com为www.google.com.hk
67.Linux下ADB安装后增加设备权限:
/etc/udev/rules.d/51-Android.rules
SUBSYSTEM=="usb", SYSFS{"huawei"}=="12d1", MODE="0666" //华为设备号
SUBSYSTEM=="usb", SYSFS{"Samsung"}=="04e8", MODE="0666" //三星设备号
68.隐藏editText的软键盘
在相应的配置文件中加入红色部分如下:
<EditText
android:layout_width="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true" />
全志一些具体工作
dmesg
grep remotect1
===================================================全志新建一个自己的工程和编译============================================================
1.在自己Android目录中:
注意:执行完上述步骤之后,检查一下你工程目录中的package.sh文件,确定你要在lichee\tools\pack\chips\sun8iw3p1\configs\android中使用的名字。
2.在lichee\tools\pack\chips\sun8iw3p1\configs\android中复制一份相同的目录,修改成自己的名字(名字要与上述注意事项的名字相同)。
3.编译(以A23为例子)
1)在lichee下:./build.sh config-->s0.un8iw3p1-->0. Android-->选择你自己的项目名(如不是第一次编译,直接./build.sh)
2)在android中:执行source build/envsetup.sh -->lunch-->选择你自己的项目名-->extract-bsp,然后make
===============================================主要配置和修改============================================================
主要配置sys_config.fex:Y:\a20\lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20\sys_config.fex
本来A20开发板上自带CSI接口模组gt2005. 但需要将其替换成ov2643.
1.修改: android/device/softwinner/wing-evb-v20/init.sun7i.rc
使其在初始化时insmod ov2643 的driver.
#sam modify it for ov2643
#insmod /system/vendor/modules/gt2005.ko
insmod /system/vendor/modules/ov2643.ko
2. 修改
lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20\sys_config.fex
[csi0_para]
csi_used = 1
csi_dev_qty = 1
csi_stby_mode = 0
csi_mname = "ov2643"
csi_if = 0
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_vol_iovdd =
csi_vol_dvdd =
csi_vol_avdd =
csi_vflip = 0
csi_hflip = 1
csi_flash_pol = 0
csi_facing = 0
csi_twi_id = 1
csi_twi_addr = 0x60
csi_pck = port:PE00<3>
csi_ck = port:PE01<3>
csi_hsync = port:PE02<3>
csi_vsync = port:PE03<3>
csi_d0 = port:PE04<3>
csi_d1 = port:PE05<3>
csi_d2 = port:PE06<3>
csi_d3 = port:PE07<3>
csi_d4 = port:PE08<3>
csi_d5 = port:PE09<3>
csi_d6 = port:PE10<3>
csi_d7 = port:PE11<3>
csi_reset =port:PH13<1><0>
csi_power_en =port:PH16<1><1>
csi_stby =port:PH18<1><0>
任务2:使MAC地址不重复:
修改:lichee\tools\pack\chips\sun7i\configs\android\default\env.cfg
任务3: 修改开机画面:
请注意:通常意义上的开机画面其实分以下三种:
1. Linux系统启动时的小企鹅。(Android早期版本和当前一些开发板还有用)
2. Android平台初始化时显示的rle图像。
3.Android平台图形系统启动时,显示的一个动画,如果没有特别设定,就是那个不断变化光线位置的ANDROID的动画。
我们着重学习2和3。
3.2: 添加和修改Android平台初始化时显示的rle图像:
/android/system/core/init/init.c
的main()函数中有:
queue_builtin_action(console_init_action,"console_init");
它向init 进程中添加了一个执行Action。名字为:"console_init"。 执行的是:console_init_action()
这里,就是显示开机画面的代码。
#define INIT_IMAGE_FILE "/initlogo.rle"
if( load_argb8888_image(INIT_IMAGE_FILE) ) {
fd = open("/dev/tty0", O_WRONLY);
if (fd >= 0) {
const char*msg;
msg = "\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n" // console is 40 cols x 30 lines
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
" A N D R OI D ";
write(fd,msg, strlen(msg));
close(fd);
}
这里,如果有/initlogo.rle,则利用framebuffer把图片显示在屏幕中。否则,打开串口,打印ANDROID.
如何将24bpp或者32bpp bmp图像转化成rle文件格式呢?
A20提供了一个软件:
\lichee\tools\tools_win\LogoGen\LogoGen\BmpConvert.exe
在Windows下,使用它将BMP图像转化为rle文件。
之后把它放到:/android/device/softwinner/wing-evb-v20/目录下。
请注意:此原始图像应与屏幕分辨率相同。当使用720P时,则应该使用1280x720的图片。
3.3:修改Android平台图形系统启动时的动画:
首先分析代码:
/android/frameworks/base/cmds/bootanimation/BootAnimation.cpp
#define USER_BOOTANIMATION_FILE"/data/local/bootanimation.zip"
#define SYSTEM_BOOTANIMATION_FILE"/system/media/bootanimation.zip"
#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE"/system/media/bootanimation-encrypted.zip"
if ((encryptedAnimation&&
(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE,R_OK) == 0) &&
(mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)== NO_ERROR))
((access(USER_BOOTANIMATION_FILE, R_OK) == 0)&&
(mZip.open(USER_BOOTANIMATION_FILE) ==NO_ERROR))
((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0)&&
(mZip.open(SYSTEM_BOOTANIMATION_FILE) ==NO_ERROR))) {
mAndroidAnimation =false;
}
这一段明确说明了:如果/data/local/bootanimation.zip,/system/media/bootanimation.zip,/system/media/bootanimation-encrypted.zip这三个文件有任何一个存在且能够正常解压,则mAndroidAnimation=false.
另一处:
if (mAndroidAnimation) {
r = android();
} else{
r = movie();
}
结合上面的代码,说明如果没有以上三个文件,则执行android();
加载:/android/frameworks/base/core/res/assets/images/中的:android-logo-mask.png android-logo-shine.png
这两个文件,一个是镂空的ANDROID字体默认的前景图片,文字部分镂空,大小256×64,一个是斜闪光,是动感效果。
源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面。
我们通常下载一个别人制作好的文件,放在:
\\android\out\target\product\wing-evb-v20\system\media下。
desc.txt文件很简单:
例1:
480 854 20
p 1 3 part0
p 0 3 part1
480854 20: 图像像素长宽为:480x854. 显示帧数:20帧。
p 13 part0:part0里面的图片(可以是多幅) 每个显示一次,间隔3。
p 03 part1:part1里面的图片显示无数次,间隔为3。
例2:
480 800 7
p 0 0 part0
480 800 7: 图像像素长宽为:480x800. 显示帧数:7帧。
p 0 0 part0:part0里面的图像显示无数次。间隔为0。
4. 预装APK:
预装APK的方式有两种不同方式,一种是作为系统软件安装,用户无法在卸载界面看到它(所以无法卸载)。另一种作为正常软件安装。
4.1:按照正常软件安装:
把APK放到:/android/device/softwinner/wing-common/preinstallapk
编译烧入后。启动后会静默安装。
4.2:按系统软件安装:
把APK放到:/android/device/softwinner/wing-common/apk
如果此APK有library.则需要把它放到:/android/device/softwinner/wing-common/apklib
最终,在Android Rootfs中,这个库会放到 /system/lib/中。
5. 指定缺省Launcher:
6. 配置wifi+bt
a) init.sun7i.rc:Android/device/softwinner/wing-evb-v20/init.sun7i.rc为资源和服务配置的文件
b) BoardConfig.mk:Android/device/softwinner/wing-evb-v20/BoardConfig.mk决定Android要加载哪一款wifi模组,以及是否支持蓝牙。
c) .config:将wifi driver编译成模块,CONFIG_RTL8723AU = m
d) Wing-evb-v20.mk:/android\device\softwinner\wing-evb-v20。决定拷贝文件rtl8723au wifi的firmware到相应的目录,要修改此目录。
e) Ueventd.sun7i.rc:android\device\softwinner\wing-evb-v20。增加设备的节点
f) Config.xml:android\device\softwinner\wing-evb-v20\overlay\frameworks\base\core\res\res\values.要打开蓝牙功能需要在文件中把蓝牙的bneq网口打开修改。
g) Vnd-wing-evb-v10.txt:android\device\softwinner\common\hardware\realtek\bluetooth\libbt-vendor\rtl8723au\include配置蓝牙:
h) bdroid_buildcfg.h:android\device\softwinner\wing-evb-v20\bluetooth。配置打开蓝牙时显示的本机的名字
i) sys_config.fex:lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20决定选用的wifi模组,以及GPIO pin 的分配
7.配置LCD屏
a) LCD_PWM_EN,LCD_BL_EN,LCD_PWR_EN 这三个函数是通过 GPIO 控制实现电源和背光的开启关闭,IO 的位置及属性定义在 sys_config.fex 文件中。
b) LCD基本配置在driver/video/sun7i/lcd/lcd0_panel_cfg.c中,可调节LCD背光,pwm等参数。
c)
d)
8.摄像头配置
a) Device Drivers --->Multimedia support ---> CSI Driver Config for sunxi ---> 或者Video capture adapters ---> 里面可以配置选上相应的摄像头。
9.启动频率和电压
a) Sys_config.fex文件中target中根据参考手册修改
10.增加蓝牙选项
1)android\frameworks\base\core\res\res\values\config.xml中加
2)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\wing_k70.mk中增加相应模块
3)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\init.sun7i.rc中增加相应模块
4)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\BoardConfig.mk中增加相应模块
11.修改字体以及整体大小
a) Y:\a20\android\out\target\product\wing-k70\recovery\root\default.prop
b) Y:\a20\android\out\target\product\wing-k70\system\build.prop中的fontScale
12.关于按键映射
1)mcu讲数据由串口传至arm,arm由串口程序接收,接收后,使用system函数映射按键system("input keyevent 82");后面的键值由Android映射的按键决定。
2)增加MUTE按键:由于Android本身有静音按键,但是在a20\android\frameworks\base\media\java\android\media\AudioManager.java中却没有映射出来,所以要自己添加程序:
public void handleKeyDown(KeyEvent event, int stream) {
int keyCode = event.getKeyCode();
boolean mute = isStreamMute(AudioManager.STREAM_MUSIC);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (mute) {
setStreamMute(AudioManager.STREAM_MUSIC, false);
int volume = getStreamVolume(AudioManager.STREAM_MUSIC);
if (volume == 0) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
setStreamMute(AudioManager.STREAM_MUSIC, true);
break;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
setStreamMute(AudioManager.STREAM_SYSTEM, false);
setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
}
} else {
setStreamMute(AudioManager.STREAM_SYSTEM, false);
setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
break;
}
}
int flags = FLAG_SHOW_UI
FLAG_VIBRATE;
if (mUseMasterVolume) {
adjustMasterVolume(
keyCode == KeyEvent.KEYCODE_VOLUME_UP
? ADJUST_RAISE
: ADJUST_LOWER,
flags);
} else {
adjustSuggestedStreamVolume(
keyCode == KeyEvent.KEYCODE_VOLUME_UP
? ADJUST_RAISE
: ADJUST_LOWER,
stream,
flags);
}
if (stream == AudioManager.STREAM_MUSIC) {
int v = getStreamVolume(AudioManager.STREAM_MUSIC);
mute = isStreamMute(AudioManager.STREAM_MUSIC);
if (!mute && (v == 0)) {
setStreamMute(AudioManager.STREAM_SYSTEM, true);
setStreamMute(AudioManager.STREAM_MUSIC, true);
setStreamMute(AudioManager.STREAM_NOTIFICATION, true);
adjustStreamVolume(stream,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
}
}
break;
case KeyEvent.KEYCODE_VOLUME_MUTE:
// TODO: Actually handle MUTE.
mute = !mute;
setStreamMute(AudioManager.STREAM_SYSTEM, mute);
setStreamMute(AudioManager.STREAM_MUSIC, mute);
setStreamMute(AudioManager.STREAM_NOTIFICATION, mute);
adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
break;
}
}
加入上述代码,可讲MUTE键映射成功。
13.关于UartTestApp服务(注意权限一定要最高)
1)使用,mmm把seria编译成UartTestApp可行性文件后,在目录out/target/product/wing-k70/system/bin下,在init.rc中加入service UartTestApp /system/bin/UartTestApp
class main
user root
group graphics
2)修改bin目录下的preinstall.sh文件,加上$BUSYBOX chmod 777 /system/bin/UartTestApp
3)如果1)中没有效果,接着在android\device\softwinner\wing-common\preinstall.sh中加上$BUSYBOX chmod 777 /system/bin/UartTestApp
4)然后make
14.gsensor方向
1)修改驱动文件
2)修改out/xxx/xxx/system/user/gsensor.cfg下的文件
15.圆圈与十字架不在同一点
以A23平台为例,是在android\frameworks\base\services\jni下的com_android_server_input_InputManagerService.cpp文件,outSpriteIcon->hotSpotX = pointerIcon.hotSpotX-10;
outSpriteIcon->hotSpotY = pointerIcon.hotSpotY-10;这个位置更改白色圆圈图片的坐标,数值又白点位置决定。
16.A23问题
Nw7723l:有8089和rda两种wifi,
8089:有1024x600和800x480两种分辨率,切换两种分辨时,主要修改:
1)sys_config.fex,看是什么lcd,如RGB和LVDS的
2)Out/xxx/xxx/system/bulid.prop中的ro.sf.lcd_density大小,1024为160,800为120,
3)Sensor方向:--》14
4)修改屏幕的方向。在build.prop文件中ro.sf.rotation=180(800x480)ro.sf.rotation=0(1024x600)
5)修改开机启动画面android\out\target\product\polaris-nw7723lesp\system\media,修改 6)
6) lichee\tools\pack\chips\sun8iw3p1\configs\android\polaris-nw7723lesp中的bootlogo.bmp,根据情况修改。
7)去掉又上角信号图标,找到\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\NetworkController.java
把其中关于stat_sys_signal_null的部分注释掉。
8)去掉解锁屏幕上关于SIM:字样。找到\android\frameworks\base\packages\Keyguard\src\com\android\keyguard\CarrierText.java把setText("SIM1:" + (text != null ? text.toString().toUpperCase() : null));注释掉。
16.关于亮度调节
亮度条减到一定值时屏幕变黑,此时修改亮度最小值:android\device\softwinner\fiber-common\hardware\libhardware\lights\lights.c
static int set_light_backlight(struct light_device_t *dev,
struct light_state_t const *state)
{
struct light_context_t *ctx;
int err = 0;
int brightness = rgb_to_brightness(state);
// add
if( brightness <= 80 )
brightness = 80;
//
pthread_mutex_lock(&g_lock);
unsigned long args[3];
args[0] = 0;
args[1] = brightness;
args[2] = 0;
err = ioctl(fd,DISP_CMD_LCD_SET_BRIGHTNESS,args);
pthread_mutex_unlock(&g_lock);
return err;
}
17.修改主页面添加程序的快捷方式:android\device\softwinner\astar-7723l\overlay\packages\apps\Launcher2\res\xml-sw720dp,或者在device/softewinner/overlay/Launcher中根据需要修改,可参照A23,default_ apace.xml里面的数据,跟A23对比即可。
18.删除右上角信号图标:找到X:\A23\nw7723l\esp8089\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\SignalClusterView.java,找到stat_sys_signal_null,把这一部分代码注释即可。
19.A33移植注意问题
1)lcd_pwm_pol 由0改为1,不然调节亮度会有问题
2)vip_define_sensor_list = 0取消扫描,不然会找不到摄像头
3)[clock] pll configuration选项的pll10 = 297
4)[dram_para]中dram_clk = 480与A23 = 552不同,不降频使用系统会不稳定
5)声音太小在配置文件中找到audio。pa_double_used = 1,原来为0更改为1。添加headset_mic_vol = 3 main_mic_vol = 1
6)修改下拉菜单中的服务问题:修改framework下的GsmServiceStateTracker.java KeyguardTouchDelegate.java KeyguardUpdateMonitor.java NetworkController.java中的文件,修改的时候跟a23的对比修改。
7)找不到camera时,有可能是camera.cfg中的没有相关的信息(在out目录下)。Camera方向不对时,更改camera.cfg中相关的角度。
8)找不到gsensor时,可参照7)。同时,查看android\device\softwinner\polaris-common\hardware\libhardware\libsensors\sensorDetect.cpp下有没有对应sensor的信息,跟原来的可用的对比,在debug模式下查看gsensor信息:input5。修改完成后使用adb push xxx /system/usr下
9)修改虚拟按键位置:竖屏时虚拟按键不能完全显示:平板布局需修改文件。frameworks/base/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml,
如果想注销某个按键,只需作如下修改即可:
- android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
+ android:layout_width="0dp" android:paddingStart="25dp" android:paddingEnd="25dp"
如果想要按键偏移,可以修改这个值android:layout_width="3300",
10)更换camera时,如0312+0328,首先确保I2C地址是正确的,如果两个I2C地址一样的话在sys_config.fex中有一个设置为不一样的(比如前置随便设置一个),否则只能检测一个,另一个会检测不到,在设置好地址后,挂载模块以后,看打印信息echo 8 > /proc/sys/kernel/printk,查看驱动的信息,如果找不到i2c地址使用test查看哪个i2c地址是正确的,在函数static int sensor_read(struct v4l2_subdev *sd, unsigned char reg, unsigned char *value)中加入
struct i2c_client *client = v4l2_get_subdevdata(sd);
client->addr = I2C_ADDR;
for(i = 0; i < 128 ;i ++)
{
client->addr = i;//I2C_ADDR;
printk("r:sa set is 0x%x\n",i);
ret = cci_read_a8_d8(sd,reg,value);
if(ret == 0)
printk(KERN_ERR "found 0x%x \n",i);
},根据情况而变。如果在sensor_detect中出错,打印查看value的值,更改它。
10)移植rda5991:
a) 调试蓝牙时,如出现mmc uartclk 过高,不在频率范围时,可更改X:\a33\android\external\bluetooth_rda\bt_cfg.h文件中的CUST_BT_SERIAL_BOURATE小一点的波特率
11)去掉蓝牙图标:删除frameworks/native/data/etc/android.hardware.bluetooth.xml文件以及system/etc/permissions/android.hardware.bluetooth.xml,同理增加蓝牙图标时放进去即可。
12)置换默认壁纸android\frameworks\base\core\res\res\drawable-sw600dp-nodpi
13)修改默认亮度:修改frameworks\base\packages\SettingsProvider\res\values\defaults.xml文件中的def_screen_brightness的值
14)A33 lvds RGB切换
a) 修改系统UI方向:RGB:在device\softwinner\astar-7723l\astar_7723l.mk中加入PRODUCT_PROPERTY_OVERRIDES += \ro.sf.rotation=180 ,在build.prop中加入ro.sf.rotation=180 LVDS: = 0
b) 修改bootlogo.bmp以及initlogo.rle:RGB:反向,LVDS:正向
c) 修改gsensor方向:在system/usr/gsensor.cfg中修改lcs RGB:false true LVDS:true false
20.去掉setting中某个选项:
a) 如果只是preference而不是checkboxpreference时,直接注释掉相应的preference即可
b) 如果是checkboxpreference:找到对应的Android:key找到对应的java代码,在相应代码后面加上getPreferenceScreen().removePreference(mBluetoothTether);
如下例子:去掉“手机套餐”以及“蓝牙共享网络”,xml路劲Setting/res/xml/wirless_setting.xml setting/res/tether_prefx.xml java路径:src/com/android/setting/tethersetting.java
Xml:lichee/brandy/u-boot-2011.09/drivers/video_sunxi/sunxi_v2/de_bsp/de/lowlevel_sun8iw5/de_be.c
android:key="enable_bluetooth_tethering"
android:title="@string/bluetooth_tether_checkbox_text"
android:persistent="false" />
Java:
mBluetoothTether = (CheckBoxPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
getPreferenceScreen().removePreference(mBluetoothTether);
21.去掉窗口小部件中的蓝牙快捷方式:在窗口小部件的xml源码中:Settings/res/layout/widget.xml中,找到蓝牙的加入android:visibility="gone"使其隐藏
22.系统自带的浏览器下载东西时出错退出信息如下failed to find provider info for downloads Unknown URL content://downloads
,查看有没有DownloadProvider(下载)这个服务,如果没有,在priv-app中加入DownloadProvider.apk和在app中加入DownloadProviderUi.apk
23.修改logcat的等级lichee\tools\pack\chips\sun8iw5p1\configs\default\env.cfg中的loglevel,默认是4,数字越大,级别越高。
24.关于Android4.4对外置卡写入限制问题:Android4.4以后对外置卡写入进行了限制,如要写入,需要对frameworks\base\data\etc下的platform.xml或者system/etc/permissions/platform.xml文件中
加入这一行
25.切换成阿拉伯语是systemui出现错误:Keyguard discontent ,其实是虚拟按键没有找到,主要是在切换语言是,使用了不同语言的frameworks\base\packages\SystemUI\res\layout
layout-ldrtl优先级介绍,layout-ldrtl优先级要低于语言级别(layout-ar),因此如果存在layout-ar目录,会首先去查找layout-ar目录下的布局文件,因此建议删除layout-ar等bidi语言目录。layout-ldrtl优先级又高于分辨率等级,优先级归纳如下:
layout-ar(语言级别) > layout-ldrtl > layout-800*540(分辨率),如果layout-ldrtl中的navigation_bar.xml文件中没有相应虚拟按键的id(比如没有volume的按键),则对比另外几个layout,把没有的id添加上
E/AndroidRuntime( 1845): java.lang.NullPointerException
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.NavigationBarView.setDisabledFlags(NavigationBarView.java:395)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.NavigationBarView.notifyScreenOn(NavigationBarView.java:321)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.notifyNavigationBarScreenOn(PhoneStatusBar.java:822)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.access$3800(PhoneStatusBar.java:110)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar$30.onReceive(PhoneStatusBar.java:2485)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.makeStatusBarView(PhoneStatusBar.java:639)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.addStatusBarWindow(PhoneStatusBar.java:2270)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.createAndAddWindows(PhoneStatusBar.java:2244)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.BaseStatusBar.start(BaseStatusBar.java:253)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.start(PhoneStatusBar.java:349)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.SystemBars.createStatusBarFromConfig(SystemBars.java:106)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.SystemBars.onNoService(SystemBars.java:58)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor.startService(ServiceMonitor.java:228)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor.access$000(ServiceMonitor.java:49)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor$1.handleMessage(ServiceMonitor.java:73)
E/AndroidRuntime( 1845): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 1845): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 1845): at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 1845): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1845): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1845): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 1845): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 1845): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 468): Process com.android.systemui has crashed too many times: killing!
26.修改开机第一屏时的背光亮度:lichee\brandyu-boot-2011.09\drivers\video_sunxi\sunxi_v1\de_bsp\de\ebios\de_be.c中的brightness = brightness>100?100:(brightness<0?0:brightness);以及ichee\brandyu-boot-2011.09\drivers\video_sunxi\sunxi_v2\de_bsp\de\lowlevel_sun8iw5\de_be.c同上。
27.当看视频时把屏幕倒回来看时,点击视频会抖动,修改android/device/softwinner/polaris-common/hardware/libhardware/hwcomposer中的hwc_sunxi.cpp文件中的static int _hwcdev_fe_can_use函数
double fe_clk = 234000000;
int fe_pro_w=0;
int fe_pro_h=0;
int m = 5;
int n = 4; 在后面添加return 0,
return 0;
。。。
28.在容易出现死机重启时,ddr不稳定,尝试修改dram_clk的频率,以及dcdc5_vol的电压,以及LVx_freq的频率
29.移植ap6476注意事项
1)调试wifi
a) 首先确认wifi脚位配置是否正确
b) 查看wifi使用的电压引脚,配置电压,在arch/arm/mach-sunxi/rf/wifi_pm_ap6xxx.c中添加wifi电压相关的信息
type = script_get_item(wifi_para, "ap6xxx_wl_regon", &val);
if (SCIRPT_ITEM_VALUE_TYPE_PIO!=type)
ap6xxx_msg("get ap6xxx ap6xxx_wl_regon gpio failed\n");
else
gpio_p = &val.gpio;
ap6xxx_wl_regon = gpio_p->gpio;
sunxi_ap6xxx_gpio_req(gpio_p);等等相关信息
c)在setting中,看wifi开关是否能打开,如打不开,是上层为配置好,查看X:\softwinner\A33\nw1034\android\device\softwinner\astar-nw1034\中相关mk文件有吗ap6476相关信息,查看framework,与移植包一一对应修改
d)如出现[ 10.706820] [mmc]: sdc1 power_supply is null
[ 10.711567] [mmc]: sdc1 card_power_on ok
[ 10.730037] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.740278] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.822362] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !!
[ 10.831311] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !!
[ 10.839453] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.849710] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.912002] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.922230] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.983926] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 8, RTO !!
Mmc等错误,尝试降低sdio的速率并查看电压是否正常。
2)调试蓝牙
a) 首先确认蓝牙脚位配置是否正确
b) 在正确的情况下查看蓝牙电压是否正确,
出现D/BluetoothAdapterState( 919): CURRENT_STATE=PENDING, MESSAGE = STARTED, isTurningOn=true, isTurningOff=false
I/bluedroid( 919): enable
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [0] task name [(null)] state [0]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception:
E/GKI_LINUX( 919): ********************************************************************
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: **********************************等错误,先查看蓝牙的wake脚位的电压是否正确,如不为高,
查看是否已经在arch/arm/mach-sunxi/rf/bt_pm.c中的rfkill_set_power函数增加wifi_pm_gpio_ctrl("ap6xxx_bt_wake", 1);把wake脚设置为高。
c) 如果出现[ 196.177323] +++++++++++ bt gpio on +++++++
d) [ 196.191878] gpio ap6xxx_bt_regon set io=360 val 1, act val 1
e) [ 196.210244] gpio ap6xxx_bt_wake set io=362 val 1, act val 1
f) [ 196.733337] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
g) [ 196.848732] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
h) [ 196.871298] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
修改串口的速率,根据uartclk 24000000查看lichee/linux-3.4/drivers/tty/serial/sunxi-uart.c中的范围,提高或者降低波特率。在android\hardware\broadcom\libbt\include\vnd_softwinner-ap6476.txt中修改
BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS2"
FW_PATCHFILE_LOCATION = "/system/vendor/modules/"
LPM_IDLE_TIMEOUT_MULTIPLE = 5
UART_TARGET_BAUD_RATE = 1500000
30.wifi,蓝牙等默认开关位置
android\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
31.A23(5501)增加、删除wifi选项
1)注释或者添加
android:title="@string/header_category_wireless_networks" />
android:id="@+id/wifi_settings"
android:fragment="com.android.settings.wifi.WifiSettings"
android:title="@string/wifi_settings_title"
android:icon="@drawable/ic_settings_wireless" />
2)X:\softwinner\A23\nw5501\nw5501_sources_wifi_0805\android\packages\apps\Settings\src\com\android\settings\Settings.java
a)在 private int[] SETTINGS_FOR_RESTRICTED 中注释或者添加
//R.id.wireless_section,
//R.id.wifi_settings,
B)在private void updateHeaderList(Listtarget)中注释或者添加
else if (id == R.id.wifi_settings) {
// Remove WiFi Settings if WiFi service is not available.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
target.remove(i);
}
}
C)在static int getHeaderType(Header header) 中注释或者添加
else if (header.id == R.id.wifi_settings
header.id == R.id.bluetooth_settings) {
return HEADER_TYPE_SWITCH;
}
D)在 switch (headerType) {中注释或者添加
if (header.id == R.id.wifi_settings) {
mWifiEnabler.setSwitch(holder.switch_);
} else {
mBluetoothEnabler.setSwitch(holder.switch_);
}
3)有wifi的时候出现如下错误
D/audio_hw_primary( 114): out_standby
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiStateMachine( 378): Failed to setup control channel, restart supplicant
D/WifiHW ( 108): Enter: wifi_get_fw_path function, fw_type=0,
E/WifiStateMachine( 378): Failed to reload STA firmware java.lang.IllegalStateException: command '129 softap fwreload wlan0 STA' failed with '400 129 Softap operation failed (No such device)'
W/CommandListener( 108): Failed to retrieve HW addr for wlan0 (No such device)
D/CommandListener( 108): Setting iface cfg
E/WifiStateMachine( 378): Unable to change interface settings: java.lang.IllegalStateException: command '131 interface setcfg wlan0 0.0.0.0 0 down' failed with '400 131 Failed to set address (No such device)'
E/wpa_supplicant( 3204): nl80211: Could not configure driver to use managed mode
E/wpa_supplicant( 3204): Could not read interface p2p0 flags: No such device
E/wpa_supplicant( 3204): p2p0: Failed to initialize driver interface
E/WifiHW ( 378): Unable to open connection to supplicant on "wlan0": No such file or directory
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiStateMachine( 378): Failed to setup control channel, restart supplicant
主要是驱动没有找到,查看驱动是否挂载,没有挂载的时候在init.sun8i.rc中加入insmod esp8089.ko
Adb shell基础知识
32.在写一个apk时,Edittext可以指定输入字符
33.
1)在shell中,可以使用am start -n 包名/类名 来打开应用程序如am start -n com.android.settings/.Settings
2)使用svc wifi enable/disabled来打开或者关闭wifi
3)Shell截屏:
adb shell /system/bin/screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png E:\
34.制作测试软件
在lichee下执行./build.sh config选择平台dragonboard,然后编译lichee,同时更改test_config.fex,加载相应的驱动。
35.去掉电池图标
找到该文件android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\BatteryController.java
//add by lc 150210 1line
import android.view.View;
import com.android.systemui.R;
public class BatteryController extends BroadcastReceiver {
private static final String TAG = "StatusBar.BatteryController";
private Context mContext;
private ArrayListmIconViews = new ArrayList();
private ArrayListmLabelViews = new ArrayList();
private ArrayListmChangeCallbacks =
new ArrayList();
public interface BatteryStateChangeCallback {
public void onBatteryLevelChanged(int level, boolean pluggedIn);
}
public BatteryController(Context context) {
mContext = context;
IntentFilter filter = new IntentFilter();
//del 20150210 1line
// filter.addAction(Intent.ACTION_BATTERY_CHANGED);
context.registerReceiver(this, filter);
}
public void addIconView(ImageView v) {
//add lc 20150210 2line
v.setVisibility(View.GONE);
mIconViews.add(v);
}
public void addLabelView(TextView v) {
//add lc 20150210
v.setVisibility(View.GONE);
mLabelViews.add(v);
}
36.一个应用不需要横竖屏选择的时候加入以下:只横屏显示,在AndroidManifest.xml的< p="">
37.只替换内核的时,在shell中,进入system目录:dd if=/boot.img of=/dev/block/nandc
38.设置字体大小比例
因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小。因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都必须变大。我想到的思路是将字体的缩放比例调大一些,下面是我的修改步骤。
1、修改默认字体的大小
Step1: 修改frameworks/base/core/java/android/content/res/Configuration.java
文件中的setToDefaults()方法,将默认的字体缩放比例调为1.35f,即修改fontScale属性
[java]
Public void setToDefaults(){
fontScale=1.35f; //default value is 1
mcc = mnc = 0;
....
}
2、修改设置-->显示-->字体大小的4个选项值
Step2: vim packages/apps/Settings/res/values/arrays.xml和
vim packages/apps/Settings/res/values-sw600dp/arrays.xml
下面就是4个选项对应的值,分别为 小、正常、大、超大
[html]
1.4
dabao1.45
1.5
1.55
Step3: 编译frameworks模块
[html]
mm frameworks/
Step4:
编译packages模块
[html]
mm packages/
39.更改图标大小android\packages\apps\Launcher2\res\values-sw600dp\dimens.xml,找到58dp
,数值越大,图标越大。图标太大时字体会显示不全
40.禁用下拉菜单KeyguardViewMediator.java
03:2禁用状态栏下拉
if (mStatusBarManager == null) {
mStatusBarManager = (StatusBarManager)
getSystemService(Context.STATUS_BAR_SERVICE);
}
禁用if (mStatusBarManager != null) {
mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
}
不禁用if (mStatusBarManager != null) {
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
}
41.摄像头插值,在camera.cfg中找到分辨率,改成你要
42.apk反编译问题,jdk最好装1.7以上的,版本太低有些反编译有些apk的时候会出现错误,
Exception in thread "main" java.lang.UnsupportedClassVersionError: brut/apktool/Main : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
打包后用apktool反编译再打包都没问题,安装时出现Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误,网上查资料原来是签名的问题,解决方案如下。
《一》使用命令行生成签名文件
(1)创建一个用来存放签名文件的文件夹Android_keystore
(2)在命令行窗口中输入命令:(粗体部分)
[java] view plaincopy
1. D:\Android_keystore>keytool -genkey -alias aeo_android.keystore -keyalg RSA -validity 2000 -keystore aeo_abdroid.keystore
[java] view plaincopy
1. 输入密钥库口令:
2. 再次输入新口令:
3. 您的名字与姓氏是什么?
4. [Unknown]: localhost
5. 您的组织单位名称是什么?
6. [Unknown]: btbu
7. 您的组织名称是什么?
8. [Unknown]: btbu
9. 您所在的城市或区域名称是什么?
10. [Unknown]: beijing
11. 您所在的省/市/自治区名称是什么?
12. [Unknown]: beijing
13. 该单位的双字母国家/地区代码是什么?
14. [Unknown]: cn
15. CN=XiaoFeng, OU=btbu, O=btbu, L=beijing, ST=beijing, C=cn是否正确?
16. [否]: y
输入的密钥口令
(如果和密钥库口令相同, 按回车):
这时会在D盘的Android_keystore文件夹下生成aeo_android.keystore文件,就是我们需要的签名文件,(-validity 20000 表示证书的有效天数为20000天)
《二》用生成的签名文件对apk文件进行签名
(1)在Eclipse中用“Export the unsigned apk”工具导出项目,这里保存到D盘的Android_keystore文件夹下,名为testbim.apk
(2)使用jarsigner给 testbim.apk 文件签名,如下所示:
[java] view plaincopy
1. D:\Android_keystore>"C:\Program Files\Java\jdk1.7.0_67\bin\jarsigner.exe" -verbose -keystore aeo_android.keystore -signedjar Launcher2_signed.apk Launcher2.apk aeo_android.keystore
2. 输入密钥库的口令短语:
3. 正在添加: META-INF/MANIFEST.MF
4. 正在添加: META-INF/AEO_ANDR.SF
5. 正在添加: META-INF/AEO_ANDR.RSA
6. 正在签名: res/drawable-hdpi/ic_action_search.png
7. 正在签名: res/drawable-hdpi/ic_launcher.png
8. 正在签名: res/drawable-ldpi/ic_launcher.png
9. 正在签名: res/drawable-mdpi/ic_action_search.png
10. 正在签名: res/drawable-mdpi/ic_launcher.png
11. 正在签名: res/drawable-xhdpi/ic_action_search.png
12. 正在签名: res/drawable-xhdpi/ic_launcher.png
13. 正在签名: res/layout/activity_main.xml
14. 正在签名: res/layout/two.xml
15. 正在签名: res/menu/activity_main.xml
16. 正在签名: AndroidManifest.xml
17. 正在签名: classes.dex
18. 正在签名: resources.arsc
keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。
这两个工具都是JDK自带的,所以你当前需要先确保JDK安装正确。并且环境变量设置正确,以便可以以命令行的方式进行处理。
输入密匙的口令短语:
......
通过上面的命令就可以讲未签名的testbim.apk 文件签名为
[java] view plaincopy
1. testbim_signed.apk
(3)最后验证是否签名成功
Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verify testbim_signed.apk
如果成功则
输出:
jar 已验证
43.使用adb与机器连接的时候出现错误
adb server is out of date. killing...
ADB server didn't ACK
* failed to start daemon *
是adb server端口被占用了
先执行adb nodaemon server ,查看adb server的端口是多少
C:\Users\xxxx>
cannot bind 'tcp:5037'
再执行下netstat -ano
findstr "5037"
C:\Users\xxxxxx>netstat -ano
findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4236
TCP 127.0.0.1:5037 127.0.0.1:49422 ESTABLISHED 4236
TCP 127.0.0.1:49422 127.0.0.1:5037 ESTABLISHED 3840
然后执行tskill 4236即可
44.去掉长按图标时Info选项
1) android\packages\apps\Launcher2\src\com\android\launcher2\SearchDropTargetBar.java在这个文件中去点关于info的信息
Line 49: private ButtonDropTarget mInfoDropTarget;
Line 67: dragController.addDragListener(mInfoDropTarget);
Line 69: dragController.addDropTarget(mInfoDropTarget);
Line 72: mInfoDropTarget.setLauncher(launcher);
Line 101: mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
Line 105: mInfoDropTarget.setSearchDropTargetBar(this);
2) android\packages\apps\Launcher2\res\layout\drop_target_bar.xml中删除以下
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DropTargetButtonContainer"
android:layout_weight="1">
style="@style/DropTargetButton"
android:id="@+id/info_target_text"
android:text="@string/info_target_label"
android:drawableStart="@drawable/info_target_selector" />
备注:lichee/brandy/u-boot-2011.09/drivers/video_sunxi/sunxi_v2/de_bsp/de/lowlevel_sun8iw5/de_be.c
X:\softwinner\A33\7729\lichee\brandy\u-boot-2011.09\include\spare_head.h 52 #define SUNXI_UPDATE_NEXT_ACTION_CHARGE (6)