当前位置: 首页 > article >正文

Android frameworks 开发总结之十一

1.查看android关机前的log    

有时候我们在没有连接电脑的情况下,会在测试的时候突然机器关机. 这个时候如果查看 log信息就看不到了。测试前可以执行下面的命令,之后再进行测试.

$ adb shell
$ nohup logcat > /sdcard/xxx.log

2.android日期时间同步

关于android请求日期时间同步的具体方法在frameworks/base/core/java/android/util/NtpTrustedTime.java文件中的forceSync方法中
 

3.SD card mount 和unmount以及notification

关于sdcard mount和unmount的代码: frameworks/base/services/core/java/com/android/server/StorageManagerService.java.

SD card在mount或之unmount成功之后发送的通知:

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java

在arashi的测试过程中要求在多用户的情况下,sdcard不能被认到,解决办法是从两个部分处理。
A.在外置sdcard成功mount之后,检测如果是外置sdcard,则进行unmount的操作。

private void mount(VolumeInfo vol) {
        try {
            // TODO(b/135341433): Remove paranoid logging when FUSE is stable
            Slog.i(TAG, "Mounting volume " + vol);
            mVold.mount(vol.id, vol.mountFlags, vol.mountUserId, new IVoldMountCallback.Stub() {
                @Override
                public boolean onVolumeChecking(FileDescriptor fd, String path,
                        String internalPath) {
                    vol.path = path;
                    vol.internalPath = internalPath;
                    ParcelFileDescriptor pfd = new ParcelFileDescriptor(fd);
                    try {
                        mStorageSessionController.onVolumeMount(pfd, vol);
                        return true;
                    } catch (ExternalStorageServiceException e) {
                        Slog.e(TAG, "Failed to mount volume " + vol, e);

                        int nextResetSeconds = FAILED_MOUNT_RESET_TIMEOUT_SECONDS;
                        Slog.i(TAG, "Scheduling reset in " + nextResetSeconds + "s");
                        mHandler.removeMessages(H_RESET);
                        mHandler.sendMessageDelayed(mHandler.obtainMessage(H_RESET),
                                TimeUnit.SECONDS.toMillis(nextResetSeconds));
                        return false;
                    } finally {
                        try {
                            pfd.close();
                        } catch (Exception e) {
                            Slog.e(TAG, "Failed to close FUSE device fd", e);
                        }
                    }
                }
            });
            Slog.i(TAG, "Mounted volume " + vol);
            if(!vol.path.contains("emulated")){
                UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
                mExternalVolumeId = vol.getId();
                if(userManager.getUserCount() > 1){ //检测当且用户个数是否是两个或以上
                    unmount(vol);  //进行unmount操作
                    mExternalVolumeId = null;
                }
            }
        } catch (Exception e) {
            Slog.wtf(TAG, e);
        }
    }

在settings → storage中如果unmount之后会显示enject, 这个时候需要在packages/apps/Settings/src/com/android/settings/deviceinfo/StorageSettings.java文件中隐藏外置sdcard的显示

private synchronized void refresh() {
        ...

        mInternalCategory.addPreference(mInternalSummary);

        UserManager userManager = (UserManager)getPrefContext().getSystemService(Context.USER_SERVICE);
       ....
        for (VolumeInfo vol : volumes) {
            if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {

                ....
            } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC
                    || vol.getType() == VolumeInfo.TYPE_STUB) {
                if(userManager.getUserCount() <= 1) {
                    mExternalCategory.addPreference(
                            new StorageVolumePreference(context, vol, 0));
                }
            }
        }

        ....

        // Show unsupported disks to give a chance to init
        final List<DiskInfo> disks = mStorageManager.getDisks();
        for (DiskInfo disk : disks) {
            if (disk.volumeCount == 0 && disk.size > 0) {
                ....
                if(userManager.getUserCount() <= 1) {
                    mExternalCategory.addPreference(pref);
                }
            }
        }

        ...
        if (mExternalCategory.getPreferenceCount() > 0 && userManager.getUserCount() <= 1) {
            getPreferenceScreen().addPreference(mExternalCategory);
        }

       ...
    }

B.在创建user或者Guest完成之后,如果外置sdcard已经mount, 则进行unmount操作,通过广播的方式通知StorageManagerService.java。
package/apps/src/com/android/settings/users/UserSettings.java
 

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MESSAGE_UPDATE_LIST:
                    updateUserList();
                    break;
                case MESSAGE_USER_CREATED:
                    sendUnmountBroadcast(); //user 创建完成发送广播
                    onUserCreated(msg.arg1);
                    break;
            }
        }
    };

…

@Override
    public boolean onPreferenceClick(Preference pref) {
        if (pref == mMePreference) {
           …...
        } else if (pref == mAddGuest) {
            mAddGuest.setEnabled(false); // prevent multiple tap issue
            UserInfo guest = mUserManager.createGuest(
                    getContext(), getString(com.android.settingslib.R.string.user_guest));
            sendUnmountBroadcast();//Guest 创建完成发送广播
            openUserDetails(guest, true);
            return true;
        }
        return false;
    }


http://www.kler.cn/a/149017.html

相关文章:

  • 性能优化、安全
  • GxtWaitCursor:Qt下基于RAII的鼠标等待光标类
  • 十三、注解配置SpringMVC
  • 基于非时空的离身与反身智能
  • 深度学习代码笔记
  • 【金融风控】特征评估与筛选详解
  • 郑州数字孪生技术推进制造业升级,工业物联网可视化应用加速
  • YOLO改进系列之SKNet注意力机制
  • GitHub 2023排名前十的最佳开源项目
  • 微信小程序+中草药分类+爬虫+torch
  • Linux命令(136)之zcat
  • 芯知识 | 混音播报语音芯片的优势:革新音频应用的新力量
  • 使用 Mybatis 的 TypeHandler 存取 Postgresql jsonb 类型
  • 【数学】旋转矩阵
  • xv6 磁盘中断流程和启动时调度流程
  • Java中实现精度准确的浮点数运算
  • SpringBoot——模板引擎及原理
  • RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树中断信息实验
  • 2023年国赛试题:配置inux1 为 CA 服务器
  • Linux dd命令详解:如何从标准输入或文件中读取、转换并输出数据(附实例教程和注意事项)
  • 7.5 Windows驱动开发:监控Register注册表回调
  • Day09
  • using meta-SQL 使用元SQL
  • awk,sed都可以用号表示查找结果,给查找结果加括号反引号
  • 『 Linux 』进程优先级
  • Pytorch:view()、permute()和contiguous()