Android系统开发

mtk解锁方式

1、setting -> system -> Developer options -> OEM unlocking
进入开发者模式中打开 OEM 
2 adb reboot bootloader
3 fastboot flashing unlock
4 按音量上键
5 fastboot reboot
6 adb root
7 adb disable-verity
8 adb reboot
9 adb root
10 adb remount

Mtk S+T编译方式

编译步骤
1 先进入alps-mp-s0目录  比如编译userdebug版本 命令如下
    source build/envsetup.sh
    export OUT_DIR=out
    lunch vnd_k62v1_64_bsp-usedebug
    make vnd_images krn_images 2>&1 | tee build_vendor.log
    
2 第一步编译完 再进入 alps-mp-t0 再执行这一步
    source build/envsetup.sh
    export OUT_DIR=out_sys
    lunch sys_mssi_64_cn-userdebug
    make sys_images 2>&1 | tee build.log
    
3 执行完第三步  还是在alps-mp-t0这个目录  再执行这一步。 就编译完成了
    python out_sys/target/product/mssi_64_cn/images/split_build.py --system-dir out_sys/target/product/mssi_64_cn/images --vendor-dir ../alps-mp-s0/out/target/product/k62v1_64_bsp/images --kernel-dir ../alps-mp-s0/out/target/product/k62v1_64_bsp/images --output-dir out_sys/target/product/mssi_64_cn/merged/ 2>&1 | tee build_python.log

添加可卸载内置apk名单

ap/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt

修改盘符和蓝牙名称、系统值

ap/build/make/tools/buildinfo.sh

+echo "ro.build.id=M392"
+echo "ro.build.display.id=T04_50_2_16_3.99inch_7701S_M392_V1.0_`$DATE +%Y%m%d`"

+echo "ro.product.model=M392"
+echo "ro.product.brand=M392"
+echo "ro.product.name=M392"
+echo "ro.product.device=M392"

echo "ro.build.product=M392"

蓝牙名称

ap/device/generic/common/bluetooth/bdroid_buildcfg.h

#define BTM_DEF_LOCAL_NAME   "M392"

修改热点名称

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiApConfigStore.java

ap/device/mediateksample/k50v1_64_bsp/system.prop

persist.sys.auto.sd.time=30

广播

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

public class hqb {
    private Receiver mReceiver;
    Context mContext;
    void  Send(){//发送
        Intent intent=new Intent();
        intent.setAction("HQB_HQB");
        mContext.sendBroadcast(intent);
    }
    void init(){//注册广播
        mReceiver= new Receiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("HQB_HQB");
        mContext.registerReceiver(mReceiver,intentFilter);
    }
    final class Receiver extends BroadcastReceiver {//接收广播
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals("HQB_HQB")) {
                //要执行的动作
            }
        }
    }
    void onPause(){//销毁广播
        mContext.unregisterReceiver(mReceiver);
    }
}

线程

new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //执行的方法
            }
        }.start();

Toast

+++ b/ap/frameworks/base/core/java/android/widget/Toast.java
@@ -39,7 +39,7 @@ import android.view.View;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
-
+import java.util.Locale;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -131,6 +131,7 @@ public class Toast {
 
         INotificationManager service = getService();
         String pkg = mContext.getOpPackageName();
+               android.util.Log.d("hqb","pkg="+pkg);
         TN tn = mTN;
         tn.mNextView = mNextView;
 
@@ -267,6 +268,24 @@ public class Toast {
      *
      */
     public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
+               android.util.Log.d("hqb","6text="+text.toString());
+               Locale locale = context.getResources().getConfiguration().locale;
+        Log.d("hqb",locale.getLanguage());
+               if(text.toString().contains("关闭中")){
+                                       if(locale.getLanguage().contains("en")){
+                                       text="closing";
+                                       }else if(locale.getLanguage().contains("ja")){
+                                       text="closing";
+                                       }else if(locale.getLanguage().contains("de")){
+                                       text="closing";
+                                       }else if(locale.getLanguage().contains("fr")){
+                                       text="closing";
+                                       }else if(locale.getLanguage().contains("it")){
+                                       text="closing";
+                                       }else if(locale.getLanguage().contains("es")){
+                                       text="closing"; 
+                                       }
+                               }
         return makeText(context, null, text, duration);
     }

移除一览

usb默认为文件传输

X:\AndroidT_2\sprd.mocor13.androidT\frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java

protected void finishBoot()和public void handleMessage(Message msg) {

//setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
                    setEnabledFunctions(UsbManager.FUNCTION_MTP, false);

移除蓝牙的共享联系人

X:\AndroidT_2\sprd.mocor13.androidT\frameworks\base\packages\SettingsLib\src\com\android\settingslib\bluetooth\PbapServerProfile.java

 public boolean isProfileReady() {
        return false;
    }

移除锁定屏幕-->通过已锁定的设备

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\display\ControlsTrivialPrivacyPreferenceController.java

UNSUPPORTED_ON_DEVICE;

连接偏好设置移除蓝牙

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\connected_devices_advanced.xml

蓝牙加已连接的设备

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\connected_devices.xml中的

 <Preference
            android:key="previously_connected_devices_see_all"
            android:title="@string/previous_connected_see_all"
            android:icon="@drawable/ic_chevron_right_24dp"
            android:order="10"
            settings:searchable="false"
            android:fragment="com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment"/>

移到X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\bluetooth_screen.xml

移除按流量计费

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\layout\wifi_network_config.xml

metered_settings

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\wifi\WifiConfigController2.java

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\wifi\WifiConfigController.java 

mMeteredSettingsSpinner

移除不属于运营商的流量消耗

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\network\NetworkProviderSettings.java

mDataUsagePreference.setVisible(false);

移除锁定屏幕的快捷方式

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\accessibility\AccessibilityShortcutPreferenceController.java

 @Override
    public int getAvailabilityStatus() {
        return UNSUPPORTED_ON_DEVICE;
    }

移除备份和多用户

packages\apps\Settings\src\com\android\settings\SettingsActivity.java

import com.android.settings.backup.UserBackupSettingsActivity;

somethingChanged = setTileEnabled(changedList, //hqb
                new ComponentName(packageName,
                UserBackupSettingsActivity.class.getName()), false, isAdmin)
                || somethingChanged;

 somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
                        Settings.UserSettingsActivity.class.getName()),false, isAdmin)
                || somethingChanged;

packages/apps/Settingsres/xml/top_level_settings.xml

移除下拉状态栏编辑图标

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java

setting搜索框过滤某些关键字

packages/apps/SettingsIntelligence/src/com/android/settings/intelligence/search/SearchResultsAdapter.java

// modify by yxiaobin Search for cast, and no result is displayed begin 
import android.util.Log;
import android.text.TextUtils;
// modify by yxiaobin Search for cast, and no result is displayed end
  
public void postSearchResults(List<? extends SearchResult> newSearchResults) {
        final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
                new SearchResultDiffCallback(mSearchResults, newSearchResults));
        mSearchResults.clear();
		/* modify by yxiaobin Search for cast, and no result is displayed begin */
		notifyDataSetChanged();
		int index = -1;
        if(newSearchResults.size()>0){
            for (int i= 0; i < newSearchResults.size(); i++) {
            SearchResult sr = newSearchResults.get(i);
			String title ="";
			String summary="";
			String dataKey="";
			if(!TextUtils.isEmpty(sr.title)){
			    title = sr.title.toString();}
            if(!TextUtils.isEmpty(sr.summary)){
			    summary=sr.summary.toString();}
			if(!TextUtils.isEmpty(sr.dataKey)){
			    dataKey=sr.dataKey.toString();}
			if("Cast".equalsIgnoreCase(title)||"cast".equalsIgnoreCase(summary)||"cast".equalsIgnoreCase(dataKey)||"Cast options".equalsIgnoreCase(title)||"Wi-Fi calling".equalsIgnoreCase(title) 
			|| title.contains("Wireless") || summary.contains("Receive wireless") || summary.contains("Wireless") || dataKey.contains("Wireless")
			|| title.contains("Face") || summary.contains("Face") 	){//modify by lzerong 20230601 for remove EmergencyBroadcast and Face ID
				index = i;
				newSearchResults.remove(index);
                notifyDataSetChanged();
				i--;
			}
         }
        }

在clearallbutton中图标和文本动态居中

//packages/apps/Launcher3/quickstep/src/com/sprd/ext/clearall/ClearAllButton.java
protected void onDraw(Canvas canvas) {
        Drawable[] drawables = getCompoundDrawables();
        if(drawables !=null) {
            Drawable drawableLeft = drawables[0];
            if(drawableLeft !=null) {
                float textWidth = getPaint().measureText(getText().toString());
                int drawablePadding = getCompoundDrawablePadding();
                int drawableWidth =0;
               drawableWidth = drawableLeft.getIntrinsicWidth();
                float bodyWidth = textWidth + drawableWidth + drawablePadding;
                canvas.translate((getWidth() - bodyWidth) /2,0);
            }
        }
        super.onDraw(canvas);
    }

Google search替换成可移动可删除的小部件

//packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java
--public static final boolean QSB_ON_FIRST_SCREEN = true;
++public static final boolean QSB_ON_FIRST_SCREEN = false;

//vendor/partner_gms/apps/GmsSampleIntegration/res_dhs_full/xml/partner_default_layout.xml
++<appwidget screen="0" x="0" y="0" spanX="5" spanY="1" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" />


//vendor/partner_gms/apps/SearchLauncher/res/xml/launcher_preferences.xml
-- <androidx.preference.PreferenceScreen
        android:key="pref_smartspace"
        android:persistent="false"
        android:summary="@string/smartspace_preferences_in_settings_desc"
        android:title="@string/smartspace_preferences_in_settings"/>

模拟按键命令

public static void sendKeyEvent(final int KeyCode) {
		new Thread() {     
			public void run() {
				try {
					Instrumentation inst = new Instrumentation();
					inst.sendKeyDownUpSync(KeyCode);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		}.start();
	}

判断屏幕是否旋转

import android.content.SharedPreferences;
import com.android.launcher3.Utilities; 
private boolean getHomeRotationEnabled(){
SharedPreferences mSharedPrefs = Utilities.getPrefs(getContext());
boolean mHomeRotationEnabled=mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,false);
Log.d("TaskView","mHomeRotationEnabled:"+mHomeRotationEnabled);
					return mHomeRotationEnabled;
	}

定制侧滑返回

//frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java

navigation_edge_panel_width 110
navigation_edge_panel_height 200
//mPaint.setStyle(Paint.Style.FILL); 填充线条 Paint.Style.STROKE不填充
//mPaintwt.setColor(Color.LTGRAY); 设置颜色
//mArrowPaint.setStrokeWidth(4); 线条粗细
//mPaintwt.setAlpha(180); 透明度
 private final Paint mPaint = new Paint()
   Path mPath= new Path();
@Override
    protected void onDraw(Canvas canvas) {
    float pointerPosition = mCurrentTranslation - mArrowThickness / 2.0f;
	mPath.reset();
    int factor = mIsLeftPanel ? 1 : -1;
    int currentY = getHeight() / 2;
    int topY = 0;
    int bottomY = getHeight();
    int footX = mIsLeftPanel ? 0 : getWidth();
    int peekX = (int) (footX + factor * (mIsLeftPanel ? pointerPosition : pointerPosition - getStaticArrowWidth()) / 2);
    mPath.moveTo(footX, topY);
    mPath.cubicTo(footX, topY + 75, peekX, topY + 100, peekX, currentY);
    mPath.cubicTo(peekX, bottomY - 100, footX, bottomY - 75, footX, bottomY);
    mPath.close();
	//canvas.drawColor(Color.argb(125,255,0,0));
		canvas.drawPath(mPath, mPaintwt);
	mArrowPath.reset();
    mArrowPath.moveTo(mIsLeftPanel?(peekX-40 + dp(3.5f)):(peekX+40 + dp(3.5f)), getHeight() / 2 - dp(5.5f));
    mArrowPath.lineTo(mIsLeftPanel?(peekX-40 - dp(4f)):(peekX+40 - dp(4f)), getHeight() / 2);
    mArrowPath.lineTo(mIsLeftPanel?(peekX-40 + dp(3.5f)):(peekX+40 + dp(3.5f)), getHeight() / 2 + dp(5.5f));
    canvas.drawPath(mArrowPath, mArrowPaint);
    }

判断WiFi是否连接、数据是否开启

//判断网络是否连接
public boolean isWifiConnect() {
        ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifiInfo.isConnected();
    }

//判断数据是否打开
import android.telephony.TelephonyManager;
private TelephonyManager mTelephonyManager;
 if (mTelephonyManager == null) {
                mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
            } 
            if (mTelephonyManager != null && !mTelephonyManager.isDataEnabled()) {
                state.typeId = 0;
            }

获取顶部activity

private String getPkgName(Context context) {
        try {
             ActivityManager am = context.getSystemService(ActivityManager.class);
             List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
             return tasks.get(0).topActivity.getPackageName();
        } catch (Exception e) {
           //ignore
        }
        return "";
    }

拦截屏幕滑动事件

//frameworks/base/core/java/android/view/ViewGroup.java
 public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
                && ev.getAction() == MotionEvent.ACTION_DOWN
                && ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
                && isOnScrollbarThumb(ev.getX(), ev.getY())) {
            return true;
        }
		if((ev.getPointerCount() >= 3)&&(Settings.Secure.getInt(mContext.getContentResolver(), "screenshot_pointer", 0)==1)){
			return true;//hqingbin 2023.2.14 The screen does not slide when taking a three-finger screenshot
		}
        return false;
    }

锁屏事件

//获取锁屏锁的状态
//Y:\AndroidS\sprd.mocor12.androidS\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\KeyguardStateController.java
mKeyguardStateController.isMethodSecure()

android横竖屏判断

 //获取设置的配置信息
        Configuration mConfiguration = this.getResources().getConfiguration(); 
        //获取屏幕方向
        int ori = mConfiguration.orientation;
        if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
            //横屏
        } else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
            //竖屏
        }

打开开发者模式点击次数修改

packages\apps\Settings\src\com\android\settings\deviceinfo\BuildNumberPreferenceController.java里面的TAPS_TO_BE_A_DEVELOPER

长按电源键弹出的功能修改

frameworks/base/core/res/res/values/config.xml中的config_globalActionsList

修改默认导航键选项

frameworks/base/packages/SettingsProvider/res/values/defaults.xml中的def_navigation_bar_config

修改锁屏时录屏是否停止

frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java 

   BroadcastReceiver mShutDownReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
             /* UNISOC: Modify for bug 1880099 stop recording when screen off {@ */
            if (Intent.ACTION_SHUTDOWN.equals(action)) {
                Log.d(TAG, "SHUTDOWN, Stopping Recording.");
                int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                if (userId == -1) {
                    userId = mUserContextTracker.getUserContext().getUserId();
                }
                stopRecording(userId);
            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                Log.d(TAG, "Screen Off, Stopping Recording.");
				//hqingbin 2023.5.16 Lock the screen and the recording stops automatically end
                //onStartCommand(getStopIntent(getApplicationContext()), 0, 0);
				//hqingbin 2023.5.16 Lock the screen and the recording stops automatically end
            }
            /* @} */
        }
    };

 单点模式下两点快速触摸会错位

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
			Log.d(TAG, "ygl--event.getAction())::" + event.getAction());
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
					Log.d(TAG, "ygl--MotionEvent.ACTION_DOWN::" + MotionEvent.ACTION_DOWN);
                    touchDown(event);
					//hqingbin 2023.5.15 Line drift begin
					movex = event.getX();
					movey = event.getY();
					//hqingbin 2023.5.15 Line drift end
                    break;
                case MotionEvent.ACTION_MOVE:
					Log.d(TAG, "ygl--MotionEvent.ACTION_MOVE::" + MotionEvent.ACTION_MOVE);
					//hqingbin 2023.5.15 Line drift begin
					if(Math.abs(movex - event.getX())>175||Math.abs(movey - event.getY())>175){
					break;
					}
                    touchMove(event);
					movex=event.getX();
					movey=event.getY();
					//hqingbin 2023.5.15 Line drift end
                    break;
                case MotionEvent.ACTION_UP:
					Log.d(TAG, "ygl--MotionEvent.ACTION_UP::" + MotionEvent.ACTION_UP);
                    //mTouchDown = false;
                    Log.d(TAG, "mPassNum:" + mPassNum + "  mTotalPassCount:" + mTotalPassCount);
                    if (mPassNum == mTotalPassCount) {
                        mIsRun = false;
                        mHandler.sendEmptyMessageDelayed(0, 200);
                    }
                    break;

长按google search不显示Glance widget

vendor/partner_gms/apps/SearchLauncher/quickstep/src/com/android/searchlauncher/SmartSpaceHostView.java

    @Override
    public boolean onLongClick(View view) {
        if (!hasSettings(view.getContext())) {
            return false;
        }
        performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
        Rect pos = new Rect();
        mLauncher.getDragLayer().getDescendantRectRelativeToSelf(this, pos);

        RectF centerPos = new RectF();
        centerPos.left = centerPos.right = pos.exactCenterX();

        // Set the top to match draglayer, so that the popup doesn't appear above the view.
        centerPos.top = 0;
        centerPos.bottom = pos.bottom;
        // Adjust the bottom to match the bottom most visible child
        centerPos.bottom = Math.min(findBottomRecur(this, pos.top, pos), centerPos.bottom);

        OptionItem item = new OptionItem(mLauncher,
                R.string.smartspace_preferences,
                R.drawable.ic_smartspace_preferences,
                LAUNCHER_SEARCH_SMARTSPACE_PREFERENCES_TAP_OR_LONGPRESS,
                this::openSettings);
        //OptionsPopupView.show(mLauncher, centerPos, Collections.singletonList(item), false);
		//hqingbin 2023.5.11 Glance widget removed
        return true;
    }

修改运营商信号格强度标准

frameworks/base/telephony/java/android/telephony/CellSignalStrengthGsm.java

修改滑动解锁滑动距离

1、frameworks/base/packages/SystemUI/res/values/dimens.xml

<dimen name="unlock_falsing_threshold">40dp</dimen>

2、frameworks/base/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java

private static final float HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN = 1;

3、frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java

return getExpandedFraction() > 0.8f;

输入正确的PIN直接解锁

//frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java
   @Override
    protected void onViewAttached() {
        super.onViewAttached();

        for (NumPadKey button: mView.getButtons()) {
            button.setOnTouchListener((v, event) -> {
                if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                    mFalsingCollector.avoidGesture();
                }
                return false;
            });
        }
        mPasswordEntry.setOnKeyListener(mOnKeyListener);
        mPasswordEntry.setUserActivityListener(this::onUserInput);

        View deleteButton = mView.findViewById(R.id.delete_button);
        deleteButton.setOnTouchListener(mActionButtonTouchListener);
        deleteButton.setOnClickListener(v -> {
            // check for time-based lockouts
            if (mPasswordEntry.isEnabled()) {
                mPasswordEntry.deleteLastChar();
            }
        });
        deleteButton.setOnLongClickListener(v -> {
            // check for time-based lockouts
            if (mPasswordEntry.isEnabled()) {
                mView.resetPasswordText(true /* animate */, true /* announce */);
            }
            mView.doHapticKeyClick();
            return true;
        });

        View okButton = mView.findViewById(R.id.key_enter);
        if (okButton != null) {
            okButton.setOnTouchListener(mActionButtonTouchListener);
            okButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mPasswordEntry.isEnabled()) {
                        verifyPasswordAndUnlock();
                    }
                }
            });
            okButton.setOnHoverListener(mLiftToActivateListener);
        }
		//hqb 2023.4.14 Enter the correct PIN to unlock directly begin
        mPasswordEntry.setUserActivityListener(new PasswordTextView.UserActivityListener() {
            @Override
            public void onUserActivity() {
                String entry = mPasswordEntry.getText();
                int passlength = Settings.Global.getInt(mView.getContext().getContentResolver(),"passlength", 0);
	            if(passlength !=0 && passlength==entry.length()){
	            	verifyPasswordAndUnlock();
	            }
            }
        });
		//hqb 2023.4.14 Enter the correct PIN to unlock directly end
    }


//packages/apps/Settings/src/com/android/settings/password/ChooseLockPassword.java
  public void handleNext() {
            if (mSaveAndFinishWorker != null) return;
            // TODO(b/120484642): This is a point of entry for passwords from the UI
            final Editable passwordText = mPasswordEntry.getText();
            if (TextUtils.isEmpty(passwordText)) {
                return;
            }
            mChosenPassword = mIsAlphaMode ? LockscreenCredential.createPassword(passwordText)
                    : LockscreenCredential.createPin(passwordText);
            if (mUiStage == Stage.Introduction) {
                if (validatePassword(mChosenPassword)) {
                    mFirstPassword = mChosenPassword;
                    mPasswordEntry.setText("");
                    updateStage(Stage.NeedToConfirm);
                } else {
                    mChosenPassword.zeroize();
                }
            } else if (mUiStage == Stage.NeedToConfirm) {
                if (mChosenPassword.equals(mFirstPassword)) {
					//hqb 2023.4.14 Enter the correct PIN to unlock directly begin
                	if(!mIsAlphaMode){
                		Settings.Global.putInt(getContext().getContentResolver(),"passlength", passwordText.length());
                	}
					//hqb 2023.4.14 Enter the correct PIN to unlock directly end
                    startSaveAndFinish();
                } else {
                    CharSequence tmp = mPasswordEntry.getText();
                    if (tmp != null) {
                        Selection.setSelection((Spannable) tmp, 0, tmp.length());
                    }
                    updateStage(Stage.ConfirmWrong);
                    mChosenPassword.zeroize();
                }
            }
        }

Launcher字体固定

packages\apps\Launcher3\src\com\android\launcher3\BubbleTextView.java

    public BubbleTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mActivity = ActivityContext.lookupContext(context);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.BubbleTextView, defStyle, 0);
        mLayoutHorizontal = a.getBoolean(R.styleable.BubbleTextView_layoutHorizontal, false);
        mIsRtl = (getResources().getConfiguration().getLayoutDirection()
                == View.LAYOUT_DIRECTION_RTL);
        DeviceProfile grid = mActivity.getDeviceProfile();
		//hqingbin 2023.5.8 Determine whether to rotate begin
		Configuration mConfiguration = context.getResources().getConfiguration();
        int ori = mConfiguration.orientation;
		//hqingbin 2023.5.8 Determine whether to rotate begin
        mDisplay = a.getInteger(R.styleable.BubbleTextView_iconDisplay, DISPLAY_WORKSPACE);
        final int defaultIconSize;
		//hqingbin 2023.4.24 Desktop application icon names are not fully displayed begin
		 if (grid.iconTextSizePx>24.0f) {
            if (grid.iconTextSizePx>27.5f) {
                if (grid.iconTextSizePx>31.0f) {
                    mIconTextSize = 27.5f;
                } else {
                    mIconTextSize = 26.0f;
                }
            } else {
                mIconTextSize = 24.0f;
            }
        } else {
            mIconTextSize = grid.iconTextSizePx;
        }
		//hqingbin 2023.4.24 Desktop application icon names are not fully displayed end
        //add by cjianyong for Blu Public to app label double-line display @20230207
        setMaxLines(2);
        if (mDisplay == DISPLAY_WORKSPACE) {
			if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
            setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.iconTextSizePx);
			}else{
				setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
			}
            setCompoundDrawablePadding(grid.iconDrawablePaddingPx);
            defaultIconSize = grid.iconSizePx;
            setCenterVertically(grid.isScalableGrid);
        } else if (mDisplay == DISPLAY_ALL_APPS) {
			if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
            setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.allAppsIconTextSizePx);
			}else{
            setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
			}
			setCompoundDrawablePadding(grid.allAppsIconDrawablePaddingPx);
            defaultIconSize = grid.allAppsIconSizePx;
        } else if (mDisplay == DISPLAY_FOLDER) {
			if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
            setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.folderChildTextSizePx);
			}else{
			setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
			}
            setCompoundDrawablePadding(grid.folderChildDrawablePaddingPx);
            defaultIconSize = grid.folderChildIconSizePx;
            //add by cjianyong for Blu Public to app label double-line display @20230207
            setMaxLines(1);

去除按5次启动紧急拨号

frameworks/base/services/core/java/com/android/server/GestureLauncherService.java

isEmergencyGestureSettingEnabled

如何使apk在编译时生成到指定的目录下

在对应的apk代码目录下的Android.mk中添加下面语句
LOCAL_MODULE := SprdTest
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
+LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app  //表示最后的目标安装路径

长按打开手电筒

frameworks/base/services/core/java/com/android/server/media/MediaSessionService.java
   @Override
        public void dispatchVolumeKeyEvent(String packageName, String opPackageName,
                boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) {

            if (keyEvent == null
                    || (keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_UP
                    && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_DOWN
                    && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_MUTE)) {
                Log.w(TAG, "Attempted to dispatch null or non-volume key event.");
                return;
            }

			//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time begin
			final int keyCode = keyEvent.getKeyCode();
			final boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
			boolean up = keyEvent.getAction() == KeyEvent.ACTION_UP;
			
			PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
			
			if((keyCode == KeyEvent.KEYCODE_VOLUME_UP)&& down && !pm.isScreenOn()&&(Settings.Secure.getInt(mContext.getContentResolver(),"quick_flashlight_enabled",0)==1)){
				mLongVolumeUpdown = true;
				mHandler.postDelayed(mLongPressVolumeUp,2000);
			}else if((keyCode == KeyEvent.KEYCODE_VOLUME_UP)&& up && !pm.isScreenOn()){
				mLongVolumeUpdown = false;   
			}
			//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time end
		
            final int pid = Binder.getCallingPid();
            final int uid = Binder.getCallingUid();
            final long token = Binder.clearCallingIdentity();

            if (DEBUG_KEY_EVENT) {
                Log.d(TAG, "dispatchVolumeKeyEvent, pkg=" + packageName
                        + ", opPkg=" + opPackageName + ", pid=" + pid + ", uid=" + uid
                        + ", asSystem=" + asSystemService + ", event=" + keyEvent
                        + ", stream=" + stream + ", musicOnly=" + musicOnly);
            }

            try {
                synchronized (mLock) {
                    if (isGlobalPriorityActiveLocked()) {
                        dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
                                asSystemService, keyEvent, stream, musicOnly);
                    } else {
                        // TODO: Consider the case when both volume up and down keys are pressed
                        //       at the same time.
                        mVolumeKeyEventHandler.handleVolumeKeyEventLocked(packageName, pid, uid,
                                asSystemService, keyEvent, opPackageName, stream, musicOnly);
                    }
                }
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }
		//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time begin
		private boolean mLongVolumeUpdown = false;
		private final Runnable mLongPressVolumeUp = new Runnable() {
			@Override
			public void run() {
				if(mLongVolumeUpdown){
					Intent intent = new Intent();
					intent.setAction("LONG_PRESS_VOLUME_UP_OPEN_FLASH_BY_LZR");
					mContext.sendBroadcast(intent);	
				}
			}
		};
		//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time end
		

在某些情况下,不应该息屏

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
  @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
        final int keyCode = event.getKeyCode();
        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                || event.isWakeKey();

        //add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 begin
        if (keyCode == KeyEvent.KEYCODE_POWER) {
            String packageName = getTopActivityPackageName(mContext);
            if (null != packageName && packageName.startsWith("com.sprd.validationtools")) {
               return 0;
            }
        }
        //add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 end



  //add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 begin
    public String getTopActivityPackageName(Context context) {
        String topActivityPackage = null;
        ActivityManager activityManager = (ActivityManager) (context
                .getSystemService(android.content.Context.ACTIVITY_SERVICE));
        List<RunningTaskInfo> runningTaskInfos = activityManager
                .getRunningTasks(1);
        if (runningTaskInfos != null) {
            ComponentName f = runningTaskInfos.get(0).topActivity;
            topActivityPackage = f.getPackageName();
        }
        return topActivityPackage;
     }
     //add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 end
}

修改下拉状态栏QS默认选项

frameworks/base/packages/SystemUI/res/values/config.xml

quick_settings_tiles_default

修改长按电源跳出的弹窗选项

frameworks/base/core/res/res/values/config.xml

config_globalActionsList

修改导航键默认样式

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

def_navigation_bar_config

点击5次打开工厂测试

@Override
    public boolean handlePreferenceTreeClick(Preference preference) {
		if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
            return false;
        }
		mDevHitCountdown ++;
		if (mDevHitCountdown % 5 == 0) {
			Intent i = new Intent();
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			i.setComponent(new ComponentName("com.sprd.validationtools", "com.sprd.validationtools.ValidationToolsMainActivity"));			
			mContext.startActivity(i);
			return true;
		}
		return false;
	}

移除长按home 出现的google白色圆球

frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java

protected boolean shouldShowOrb() {
        //modify by wshengnan remove google circle white ball @20230621 start
        return false;
        //modify by wshengnan remove google circle white ball @20230621 end
    }

相机照片添加水印

public void writeExif(byte[] jpeg, OutputStream exifOutStream) throws IOException {
 		if(WaterMarkController.getInstance()!=null&&WaterMarkController.getInstance().WaterMark!=0){
		jpeg=stampImage(jpeg);
		}
        if (jpeg == null || exifOutStream == null) {
            throw new IllegalArgumentException(NULL_ARGUMENT_STRING);
        }
        OutputStream s = getExifWriterStream(exifOutStream);
        s.write(jpeg, 0, jpeg.length);
        s.flush();
    }
	   public byte[] stampImage(byte[] b) {
		Bitmap masterBitmap=null;
		if (b.length != 0) {masterBitmap= BitmapFactory.decodeByteArray(b, 0, b.length);}
        Paint paint = new Paint();
        paint.setFilterBitmap(true);
        Bitmap newBitmap = null;
        Canvas canvas = null;
		Bitmap bitmap=null;
        try {
			switch(WaterMarkController.getInstance().WaterMark){
				case 1:
			bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo1);
				break;
				case 2:
			bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo2);
				break;
				case 3:
			bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo3);
				break;
				case 4:
			bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo4);
				break;
				case 5:
			bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo5);
				break;
			}
            newBitmap = Bitmap.createBitmap(masterBitmap.getWidth(), masterBitmap.getHeight(), Bitmap.Config.ARGB_8888);
            canvas = new Canvas(newBitmap);
            canvas.drawBitmap(masterBitmap, 0, 0, paint);
            canvas.drawBitmap(bitmap, masterBitmap.getWidth()/10, masterBitmap.getHeight()*0.97f-bitmap.getHeight(), paint);
            canvas.save();
            canvas.restore();
        } catch (Exception e) {
        }
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
        newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] data = baos.toByteArray();
		return data;
    }
	
	public byte[] stampText(byte[] b, String label, int labelSize, int labelColor) {
        Paint paint = new Paint();
        paint.setFilterBitmap(true);
        paint.setDither(true);
        paint.setColor(labelColor);
        paint.setTextSize(labelSize);
        Bitmap masterBitmap=null;
        Bitmap newBitmap = null;
        Canvas canvas = null;
        if (b.length != 0) {masterBitmap= BitmapFactory.decodeByteArray(b, 0, b.length);}
        try {
            Bitmap.Config config = masterBitmap.getConfig();
            if (config == null) {
                config = Bitmap.Config.ARGB_8888;
            }
            newBitmap = masterBitmap.copy(config, true);
            canvas = new Canvas(newBitmap);
            canvas.drawText(label, 500, 500, paint);
            canvas.save();
            canvas.restore();
        } catch (Exception e) {
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] data = baos.toByteArray();
        return data;
    }

按电源键不灭屏

sprd.mocor13.androidT/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

@Override // Binder call
        public void goToSleep(long eventTime, int reason, int flags) {
            //hqingbin 2023.6.21 The power button cannot turn off the screen begin
            if(true){
                return;
            }
            //hqingbin 2023.6.21 The power button cannot turn off the screen begin

置灰和禁用但是不置灰

mPreference.setEnabled(false);

android:shouldDisableView="false"
            android:enabled="false"

判断是否为开机后第一次解锁

KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
                    mKeyguardUpdateMonitor.getStrongAuthTracker();

strongAuthTracker.hasUserAuthenticatedSinceBoot()

防止解锁时两声解锁声音

frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java

private long prelongTim = 0;//hqingbin 2023.2.9 Prevent two release sounds
 private void playSound(int soundId) {
        if (soundId == 0) return;
		//hqingbin 2023.2.9 Prevent two release sounds begin
		if(prelongTim==0){
            prelongTim = System.currentTimeMillis();
        }else if(soundId == mUnlockSoundId){
            long curTime = System.currentTimeMillis();
            long difference = curTime - prelongTim;
            prelongTim = curTime;
            if (difference < 200) {
                return;
            }
        }
		//hqingbin 2023.2.9 Prevent two release sounds end

实现动态禁用导航键

import android.app.StatusBarManager;
private StatusBarManager mStatusBarManager;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_charging_simple);
		mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);/

/*add by sdongxuan 20230621 for The navigation bar is not displayed when the charging animation is displayed  begin*/
	@Override
	protected void onStop() {
		super.onStop();
		mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
    }
	@Override
	protected void onResume() {
       super.onResume();
	   mStatusBarManager.disable(StatusBarManager.DISABLE_NAVIGATION|StatusBarManager.DISABLE_BACK);	   
    }
	/*add by sdongxuan 20230621 for The navigation bar is not displayed when the charging animation is displayed  end*/

Calendar默认显示月

\packages\apps\Calendar\src\com\android\calendar\GeneralPreferences.java

 public static final int DEFAULT_START_VIEW = CalendarController.ViewType.MONTH;//默认启动视图

限制recent只显示3个task

X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Launcher3\quickstep\src\com\android\quickstep\RecentTasksList.java

 @VisibleForTesting
    TaskLoadResult loadTasksInBackground(int numTasks, int requestId, boolean loadKeysOnly) {
        int currentUserId = Process.myUserHandle().getIdentifier();
        ArrayList<GroupedRecentTaskInfo> rawTasks =
                mSysUiProxy.getRecentTasks(numTasks, currentUserId);
                while(3<rawTasks.size()){
                    rawTasks.remove(rawTasks.size()-1);
                }     

仿苹果hotseat底部白条

Y:\mtk6762_13_alps\alps-mp-t0\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\Hotseat.java


//hqingbin Add hotseat white bar begin
	@Override
    protected void onDraw(Canvas canvas) {
		Paint paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setAlpha(120);
		RectF rectF = new RectF(20, 10, 700, 170);
		canvas.drawRoundRect(rectF, 60, 60, paint);
	}
	//hqingbin Add hotseat white bar end

  launcher移除导航栏后动态布局

Y:\mtk6762_13_alps\alps-mp-t0\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\statemanager\StatefulActivity.java



    protected void inflateRootView(int layoutId) {
        mRootView = (LauncherRootView) LayoutInflater.from(this).inflate(layoutId, null);
        mRootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                /* | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION */
                /* | View.SYSTEM_UI_FLAG_LAYOUT_STABLE */);
    }

某些应用未适应屏幕大小

android:maxAspectRatio="2.22"

Android9修改系统分区大小

ap/device/mediateksample/k50v1_64_bsp/BoardConfig.mk

+#hqingbin 2023.7.20 Example Modify the system partition size
+BOARD_MTK_SYSTEM_SIZE_KB := 2872864


修改默认语言

ap/device/mediateksample/k50v1_64_bsp/full_k50v1_64_bsp.mk

Y:\mtk6755_A6\mtk6755_p_alps\ap\device\mediateksample\k50v1_64_bsp

persist.sys.locale=zh-CN

settings总内存修改为3G

Y:\mtk6755\mtk6755_p_alps\ap\vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\applications\ProcStatsData.java

 //realTotalRam = memReader.getTotalSize();
            realTotalRam = 2f*1000*1000*1000;//hqingbin totalram change

Android9添加锁屏壁纸

    添加锁屏壁纸

diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg
new file mode 100755
index 0000000..cc26f20
Binary files /dev/null and b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg differ
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
old mode 100644
new mode 100755
index 40ddf5b..fa4f89a
--- a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
@@ -42,9 +42,11 @@ import android.util.Log;
 import com.android.keyguard.KeyguardUpdateMonitor;
 
 import libcore.io.IoUtils;
-
+import com.android.systemui.R;
 import java.util.Objects;
-
+import java.io.IOException;
+import android.os.SystemProperties;
+import android.provider.Settings;
 /**
  * Manages the lockscreen wallpaper.
  */
@@ -64,10 +66,13 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
     // users.
     private UserHandle mSelectedUser;
     private AsyncTask<Void, Void, LoaderResult> mLoader;
+    
+    private Context mContext;
 
     public LockscreenWallpaper(Context ctx, StatusBar bar, Handler h) {
         mBar = bar;
         mH = h;
+        mContext = ctx;
         mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE);
         mCurrentUserId = ActivityManager.getCurrentUser();
         mUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx);
@@ -97,6 +102,27 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
             mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
             mCache = result.bitmap;
         }
+        //zya add
+       if (mCache == null && Settings.System.getInt(mContext.getContentResolver(),"is_first_boot",-1)==-1) {
+            Settings.System.putInt(mContext.getContentResolver(),"is_first_boot",1);
+            try {
+                mWallpaperManager.setStream(
+                        mContext.getResources().openRawResource(R.drawable.default_lock_wallpaper11),
+                        null,
+                        true,
+                        WallpaperManager.FLAG_LOCK);
+
+                result = loadBitmap(mCurrentUserId, mSelectedUser);
+                if (result.success) {
+                    mCached = true;
+                    mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
+                    mCache = result.bitmap;
+                }
+            } catch (IOException e) {
+                //Log.e(TAG, "can not set default lockscreen wallpaper");
+            }
+        }
+        //zya end
         return mCache;
     }
 
@@ -124,8 +150,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
         } else {
             if (selectedUser != null) {
                 // Show the selected user's static wallpaper.
-                return LoaderResult.success(mWallpaperManager.getBitmapAsUser(
-                        selectedUser.getIdentifier(), true /* hardware */));
+                return LoaderResult.success(
+                        mWallpaperManager.getBitmapAsUser(selectedUser.getIdentifier(),true));
 
             } else {
                 // When there is no selected user, show the system wallpaper

清除应用数据

import android.app.ActivityManager;
import android.provider.Settings;
if(packageName.equals("in.krosbits.musicolet")&&(Settings.Global.getString(mContext.getContentResolver(),"sys.start.forceReload")==null)){
			ActivityManager am = (ActivityManager)
                mContext.getSystemService(mContext.ACTIVITY_SERVICE);
			am.clearApplicationUserData("com.android.launcher3", null);
			Settings.Global.putString(mContext.getContentResolver(),"sys.start.forceReload","1");
		}


 

添加图标背景

Y:\mtk6755_A6\mtk6755_p_alps\ap\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\graphics\LauncherIcons.java
createIconBitmap下面
return getRoundedBitmap(bitmap);
    }
	 public static Bitmap getRoundedBitmap(Bitmap mBitmap){
        //Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.frame);  
        //创建与原始位图大小相同的画布位图ᄡᄡᄑᄄ￐ᅡ샤ᅫ콰ᄐ  
        /* Bitmap bgBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        //初始化画布
        Canvas mCanvas = new Canvas(bgBitmap);
        Paint mPaint = new Paint();
        Rect mRect = new Rect(5, 5, mBitmap.getWidth()-5, mBitmap.getHeight()-5);
        RectF mRectF = new RectF(mRect);
        //设置圆角半径 
        float roundPx = 480;
        mPaint.setAntiAlias(true);
        //绘制圆角矩形
        mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);
        //设置图像的叠加模式, 此处模式选择可参考后面的规则
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        //绘制图像  
        mCanvas.drawBitmap(mBitmap, mRect, mRect, mPaint); */
        return addBorderToImage(mBitmap);
    }
    private static Bitmap addBorderToImage(Bitmap src) {
		Bitmap output = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.iconback).copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(output);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
        //paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
		android.util.Log.d("hqb1","  output.getHeight()="+output.getHeight()+"  output.getWidth()="+output.getWidth());
        Rect dstRect = new Rect(0,0,output.getWidth(),output.getHeight());
        canvas.drawBitmap(src, null, dstRect, paint);
        return output;
    }

默认给与权限

b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -863,6 +863,7 @@ public class PermissionManagerService {
                         // For modern apps keep runtime permissions unchanged.
                         grant = GRANT_RUNTIME;
                     }
+                                       grant = GRANT_INSTALL;
                 } else if (bp.isSignature()) {
                     // For all apps signature permissions are install time ones.
                     allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);

修改系统支持的语言

ap/frameworks/base/core/res/res/values/locale_config.xml

<string-array translatable="false" name="supported_locales">

Android13新建lunch项

在对应的AndroidProducts.mk下添加

COMMON_LUNCH_CHOICES := \
    sys_mssi_64_cn-user \
    sys_mssi_64_cn-userdebug

Android13设备名版本修改失败

rm -rf out_sys/target/product/mssi_64_cn/system/build.prop out_sys/target/product/mssi_64_cn/recovery/root/prop.default out_sys/target/product/mssi_64_cn/obj/PACKAGING/target_files_intermediates/sys_mssi_64_cn-target_files-mp1V1010/SYSTEM/build.prop out_sys/target/product/mssi_64_cn/obj/PACKAGING/target_files_intermediates/sys_mssi_64_cn-target_files-mp1V1010/BOOT/RAMDISK/prop.default out_sys/target/product/mssi_64_cn/obj/PACKAGING/system_build_prop_intermediates/buildinfo.prop out_sys/target/product/mssi_64_cn/obj/PACKAGING/system_target_files_intermediates/sys_mssi_64_cn-system_target_files/SYSTEM/build.prop

android 左上角返回上一级的实现

1.在.java中:

     //左上角返回
     @Override
        protected void onStart() {
            super.onStart();
            ActionBar actionBar = this.getActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
     @Override
         public boolean onOptionsItemSelected(MenuItem item) {   
            return super.onOptionsItemSelected(item);    
        }

     这样就会出现左上角返回按钮,但返回的是上一个Activity,跟返回键的功能相同。若需返回指定的activity需进行第二步。

2.在Manifest中:

        <activity
            android:name=".SecondActivity
            android:parentActivityName=".FirstActivity">          
        </activity>

    利用android:parentActivityName指定父类Activity.

android9和Android12修改亮度为线性变化

Android9

Author: huangqingbin <908689287@qq.com>
Date:   Tue Jul 18 22:32:36 2023 +0800

    修改为线型亮度(亮度默认为50%)

diff --git a/ap/frameworks/base/core/res/res/values/config.xml b/ap/frameworks/base/core/res/res/values/config.xml
old mode 100644
new mode 100755
index 3536b37..a254534
--- a/ap/frameworks/base/core/res/res/values/config.xml
+++ b/ap/frameworks/base/core/res/res/values/config.xml
@@ -1232,7 +1232,8 @@
 
     <!-- Minimum screen brightness setting allowed by the power manager.
          The user is forbidden from setting the brightness below this level. -->
-    <integer name="config_screenBrightnessSettingMinimum">10</integer>
+       <!-- hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) -->
+    <integer name="config_screenBrightnessSettingMinimum">1</integer>
 
     <!-- Maximum screen brightness allowed by the power manager.
          The user is forbidden from setting the brightness above this level. -->
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
old mode 100644
new mode 100755
index 4bb0a99..0cf022d
--- a/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
@@ -32,7 +32,7 @@ import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
-
+import android.util.MathUtils;//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -128,11 +128,11 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr
     private double getCurrentBrightness() {
         final int value;
         if (isInVrMode()) {
-            value = convertLinearToGamma(System.getInt(mContentResolver,
+            value = convertLinearToGammaExt(System.getInt(mContentResolver,
                     System.SCREEN_BRIGHTNESS_FOR_VR, mMaxBrightness),
                     mMinVrBrightness, mMaxVrBrightness);
         } else {
-            value = convertLinearToGamma(Settings.System.getInt(mContentResolver,
+            value = convertLinearToGammaExt(Settings.System.getInt(mContentResolver,
                     System.SCREEN_BRIGHTNESS, mMinBrightness),
                     mMinBrightness, mMaxBrightness);
 
@@ -160,4 +160,11 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr
         }
         return false;
     }
+       //hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
+       private final int convertLinearToGammaExt(int val, int min, int max) {
+      // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+       final float normalizedVal = MathUtils.norm(0, max, val);
+       return (int) (normalizedVal*GAMMA_SPACE_MAX);
+   }
+   //hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) end
 }
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
old mode 100644
new mode 100755
index be0aa11..25ea5c9
--- a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -19,7 +19,7 @@ package com.android.systemui.settings;
 import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
 import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
 import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
-
+import android.util.MathUtils;
 import android.animation.ValueAnimator;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -373,7 +373,7 @@ public class BrightnessController implements ToggleSlider.Listener {
             setting = Settings.System.SCREEN_BRIGHTNESS;
         }
 
-        final int val = convertGammaToLinear(value, min, max);
+        final int val = convertGammaToLinearExt(value, min, max);
 
         if (stopTracking) {
             MetricsLogger.action(mContext, metric, val);
@@ -445,7 +445,7 @@ public class BrightnessController implements ToggleSlider.Listener {
             min = mMinimumBacklight;
             max = mMaximumBacklight;
         }
-        if (val == convertGammaToLinear(mControl.getValue(), min, max)) {
+        if (val == convertGammaToLinearExt(mControl.getValue(), min, max)) {
             // If we have more resolution on the slider than we do in the actual setting, then
             // multiple slider positions will map to the same setting value. Thus, if we see a
             // setting value here that maps to the current slider position, we don't bother to
@@ -453,7 +453,7 @@ public class BrightnessController implements ToggleSlider.Listener {
             // change to the user even though it isn't one.
             return;
         }
-        final int sliderVal = convertLinearToGamma(val, min, max);
+        final int sliderVal = convertLinearToGammaExt(val, min, max);
         animateSliderTo(sliderVal);
     }
 
@@ -475,5 +475,18 @@ public class BrightnessController implements ToggleSlider.Listener {
         mSliderAnimator.setDuration(SLIDER_ANIMATION_DURATION);
         mSliderAnimator.start();
     }
+//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
+private final int convertGammaToLinearExt(int val, int min, int max) {
+        final float normalizedVal = MathUtils.norm(0, GAMMA_SPACE_MAX, val);
+        int value = (int) (normalizedVal*max);
+        return value>0? value : 1;
+   }
+   private final int convertLinearToGammaExt(int val, int min, int max) {
+       // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+       final float normalizedVal = MathUtils.norm(0, max, val);
+       return (int) (normalizedVal*GAMMA_SPACE_MAX);
+   }
+//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) end
+
 
 }

Android12

+++ b/alps-mp-t0/frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
@@ -22,6 +22,7 @@ public class BrightnessUtils {
 
     public static final int GAMMA_SPACE_MIN = 0;
     public static final int GAMMA_SPACE_MAX = 65535;
+       public static final boolean ENABLE_GAMMA = false;
 
     // Hybrid Log Gamma constant values
     private static final float R = 0.5f;
@@ -75,6 +76,10 @@ public class BrightnessUtils {
      * @return The corresponding setting value.
      */
     public static final float convertGammaToLinearFloat(int val, float min, float max) {
+               if(!ENABLE_GAMMA){
+            float ratio = (float)val / GAMMA_SPACE_MAX;
+            return min + (float)(ratio * (max - min));
+        }
         final float normalizedVal = MathUtils.norm(GAMMA_SPACE_MIN, GAMMA_SPACE_MAX, val);
         final float ret;
         if (normalizedVal <= R) {
@@ -128,6 +133,10 @@ public class BrightnessUtils {
      */
     public static final int convertLinearToGammaFloat(float val, float min, float max) {
         // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+               if(!ENABLE_GAMMA){
+            float ratio = (float)(val - min)/ (max - min);
+            return (int)(ratio * GAMMA_SPACE_MAX);
+        }
         final float normalizedVal = MathUtils.norm(min, max, val) * 12;
         final float ret;
         if (normalizedVal <= 1f) {

修改MTK屏幕默认亮度

Android11以前的版本

vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml

Android11后的版本

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

修改锁屏状态的熄屏时间

frameworks/base/core/res/res/values/config.xml

- <integer name="config_minimumScreenOffTimeout">10000</integer> + <integer name="config_minimumScreenOffTimeout">15000</integer>

禁止关机状态下电源加下键进入工厂模式

    禁止关机状态下电源加下键进入工厂模式

diff --git a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
old mode 100644
new mode 100755
index b54a2ca..86b4b8d
--- a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
+++ b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
@@ -76,7 +76,7 @@ static int mrdump_check(void)
 {
        if (mrdump_detection()) {
 #ifdef MTK_TC7_FEATURE
-               g_boot_mode = FACTORY_BOOT;
+               g_boot_mode = NORMAL_BOOT;
                cmdline_append("frdump_boot=1");
 #endif
                mt65xx_backlight_on();
@@ -165,7 +165,7 @@ void boot_mode_select(void)
                        if (mtk_detect_key(MT65XX_FACTORY_KEY)) {
                                dprintf(CRITICAL, "%s Detect key\n",MODULE_NAME);
                                dprintf(CRITICAL, "%s Enable factory mode\n",MODULE_NAME);
-                               g_boot_mode = FACTORY_BOOT;
+                               g_boot_mode = NORMAL_BOOT;
                                //video_printf("%s : detect factory mode !\n",MODULE_NAME);
                                return;
                        }
@@ -243,7 +243,7 @@ void boot_mode_select(void)
                        if (mtk_detect_key(MT65XX_FACTORY_KEY)) {
                                dprintf(INFO, "%s Detect key\n",MODULE_NAME);
                                dprintf(INFO, "%s Enable factory mode\n",MODULE_NAME);
-                               g_boot_mode = FACTORY_BOOT;
+                               g_boot_mode = NORMAL_BOOT;
                                //video_printf("%s : detect factory mode !\n",MODULE_NAME);
                                return TRUE;
                        }
diff --git a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
old mode 100644
new mode 100755
index ed8cddf..8c716fd
--- a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
+++ b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
@@ -37,7 +37,7 @@ BOOL factory_check_key_trigger(void)
                {       
                        printf("%s Detect key\n",MODULE_NAME);
                        printf("%s Enable factory mode\n",MODULE_NAME);         
-                       g_boot_mode = FACTORY_BOOT;
+                       g_boot_mode = NORMAL_BOOT;
                        //video_printf("%s : detect factory mode !\n",MODULE_NAME);
                        return TRUE;
                }

某些应用小部件不允许调整大小、不显示某些应用小部件

diff --git a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
index 66fb3c6..fbb4c54 100755
--- a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
@@ -1911,6 +1911,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
                     item.spanX = resultSpan[0];
                     item.spanY = resultSpan[1];
                     AppWidgetHostView awhv = (AppWidgetHostView) cell;
+                                       android.util.Log.d("hqb1","1");
                     AppWidgetResizeFrame.updateWidgetSizeRanges(awhv, mLauncher, resultSpan[0],
                             resultSpan[1]);
                 }
@@ -1955,7 +1956,10 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
                             onCompleteRunnable = new Runnable() {
                                 public void run() {
                                     if (!isPageInTransition()) {
+                                                                               android.util.Log.d("hqb1","pInfo.label="+pInfo.label);
+                                                                               if(!pInfo.label.equals("NewWidght")){
                                         AppWidgetResizeFrame.showForWidget(hostView, cellLayout);
+                                                                               }
                                     }
                                 }
                             };
@@ -2603,6 +2607,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
                     ((PendingAddWidgetInfo) pendingInfo).boundWidget : null;
 
             if (finalView != null && updateWidgetSize) {
+                               android.util.Log.d("hqb1","3");
                 AppWidgetResizeFrame.updateWidgetSizeRanges(finalView, mLauncher, item.spanX,
                         item.spanY);
             }
ts06@blueshark03:~/work/mtk6755_p_alps_fanmu/mtk6755_p_alps/ap$ git diff vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
old mode 100644
new mode 100755
index 9f8f263..d1c6c76
--- a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
@@ -185,6 +185,10 @@ public class WidgetsModel {
             }
 
             String packageName = item.componentName.getPackageName();
+                       android.util.Log.d("hqb1","packageName="+packageName);
+                       if(packageName.equals("com.example.newwidght")){
+                               continue;
+                       }
             PackageItemInfo pInfo = tmpPackageItemInfos.get(packageName);
             if (pInfo == null) {
                 pInfo = new PackageItemInfo(packageName);

Android9取消未知安装

Author: huangqingbin <hqingbin@waterworld.com.cn>
Date:   Tue Nov 21 18:32:05 2023 +0800

    取消未知安装

diff --git a/ap/frameworks/base/core/java/android/app/AppOpsManager.java b/ap/frameworks/base/core/java/android/app/AppOpsManager.java
old mode 100644
new mode 100755
index 5559af2..686434d
--- a/ap/frameworks/base/core/java/android/app/AppOpsManager.java
+++ b/ap/frameworks/base/core/java/android/app/AppOpsManager.java
@@ -1240,7 +1240,7 @@ public class AppOpsManager {
             AppOpsManager.MODE_ALLOWED,  // OP_RUN_IN_BACKGROUND
             AppOpsManager.MODE_ALLOWED,  // OP_AUDIO_ACCESSIBILITY_VOLUME
             AppOpsManager.MODE_ALLOWED,
-            AppOpsManager.MODE_DEFAULT,  // OP_REQUEST_INSTALL_PACKAGES
+            AppOpsManager.MODE_ALLOWED,  // OP_REQUEST_INSTALL_PACKAGES
             AppOpsManager.MODE_ALLOWED,  // OP_PICTURE_IN_PICTURE
             AppOpsManager.MODE_DEFAULT,  // OP_INSTANT_APP_START_FOREGROUND
             AppOpsManager.MODE_ALLOWED,  // ANSWER_PHONE_CALLS
diff --git a/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
old mode 100644
new mode 100755
index 8b90997..b87dc4b
--- a/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -314,7 +314,9 @@ public final class DefaultPermissionGrantPolicy {
                                //by ken add start for app Permissions
                        if(pkg.packageName.equals("com.mediatek.filemanager")|| pkg.packageName.equals("com.android.browser")
                                || pkg.packageName.equals("com.android.calendar")|| pkg.packageName.equals("com.android.soundrecorder")
-                               || pkg.packageName.equals("com.android.fmradio")|| pkg.packageName.equals("com.android.music")){
+                               || pkg.packageName.equals("com.android.fmradio")
+                               || pkg.packageName.equals("com.android.hotapps")
+                               || pkg.packageName.equals("com.android.music")){
                                  grantRuntimePermissionsForPackage(userId, pkg);
                        }else{
                                if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index fd49690..6872bfe 100755
--- a/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -513,7 +513,8 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
         final int installAppsRestrictionSource = mUserManager.getUserRestrictionSource(
                 UserManager.DISALLOW_INSTALL_APPS, Process.myUserHandle());
         if ((installAppsRestrictionSource & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
-            showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
+            //showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
+                       initiateInstall();
             return;
         } else if (installAppsRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
             startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
@@ -533,7 +534,8 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
                 startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
                 finish();
             } else {
-                handleUnknownSources();
+                               initiateInstall();
+                //handleUnknownSources();
             }
         }
     }
@@ -541,8 +543,7 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
     private void handleUnknownSources() {
         if (mOriginatingPackage == null) {
             Log.i(TAG, "No source found for package " + mPkgInfo.packageName);
-            //showDialogInner(DLG_ANONYMOUS_SOURCE);
-                       initiateInstall();
+            showDialogInner(DLG_ANONYMOUS_SOURCE);
             return;
         }
         // Shouldn't use static constant directly, see b/65534401.

编译ota升级包命令


整包

make -j16 otapackage

Android11差异包

 ./build/tools/releasetools/ota_from_target_files -v -i v1.zip  --block  -p out/host/linux-x86 -k build/target/product/security/testkey v2.zip  update.zip

android 13 差分包指令
 ./out_sys/host/linux-x86/bin/ota_from_target_files --path out_sys/host/linux-x86/ -v -i old_ota.zip new_ota.zip upate.zip

mtk的FM设置为可卸载后会报错

system/app或者priv-app目录下的系统应用需要可卸载

vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt
在文件中添加需要可卸载应用的包名

如果会报错则需要将缺乏的so文件添加到system/core/rootdir/etc/public.libraries.android.txt 文件中

Android 跳转到文件管理某个目录

    private void openMusic(){
        Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Music");
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
        startActivityForResult(intent, 1);
    }

修改壁纸库壁纸尺寸为真实尺寸

vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/WallpaperUtils.java
vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/WallpaperUtils.java
@@ -146,6 +146,7 @@ public final class WallpaperUtils {
                 defaultHeight = maxDim;
             }
             sDefaultWallpaperSize = new Point(defaultWidth, defaultHeight);
+                       sDefaultWallpaperSize = realSize;
         }
         return sDefaultWallpaperSize;
     }


Mtk改屏目录

vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/

kernel-4.14/drivers/misc/mediatek/lcm/

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Android系统开发是指使用Android开发平台、工具和技术来创建Android操作系统的应用程序。在Android系统开发中,开发人员可以使用Java和C/C++等编程语言来编写应用程序代码,并使用Android SDK提供的各种API和工具来进行开发Android系统开发主要涉及以下几个核心方面: 1. Android应用层:这是Android系统的最顶层,包括各种应用程序,如游戏、社交媒体应用、工具应用等。开发人员可以使用Java编程语言和Android SDK提供的各种API来创建丰富多样的应用程序。 2. Android应用框架层:这是Android系统的核心组件之一,提供了各种功能和服务,包括活动管理、界面构建、数据存储、通信等。开发人员可以使用Android框架提供的各种类和接口来构建应用程序的各个模块。 3. Android系统运行库层:这一层包括Android系统的核心库,如SQLite数据库库、图形库、媒体库等。开发人员可以使用这些库来实现应用程序的各种功能。 4. Linux内核层:这是Android系统的底层,它提供了操作系统的基本功能,包括进程管理、内存管理、设备驱动等。Android系统基于Linux内核,通过JNI技术将Java层和C/C++层连接起来,实现了与底层硬件的交互和系统功能的支持。 总之,Android系统开发是一个基于Android平台的软件开发过程,通过使用Android开发工具和技术,开发人员可以创建功能强大、稳定可靠的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值