安卓源码学习之【开机向导定制 OOBE/Provision源码分析】

Android开机向导setupwizard,设置系统语言,WiFi向导 Android的框架设计有考虑到开机向导这一场景,因此我们实现开机向导参考Android的Provision.apk Provision: MSM8976/repo/packages/apps/Provision 它的主要作用是作为开机引导用户进行一些基本设置.在原生的 android 系统中,provision非常的简单,只有一个空白的 activity,这个主要就是留给 厂商自己定制开机向 阅读详情
AI摘要

本文围绕安卓开机向导 OOBE 展开,对 Provision 源码进行分析,包括属性、Intent Filter、DefaultActivity 等。还介绍了创建自定义开机向导 app 的步骤,如添加权限、配置清单文件等。同时提到修改源码时要处理权限白名单问题,以确保应用正常运行。

OOBE 是 “Out-Of-Box Experience”(开箱体验)的缩写。它指的是用户在首次使用 Android 设备时所经历的初始设置过程。

Provision源码分析

Provision 在 Android 系统中是一个关键的 初始化引导程序,主要用于设备首次启动或系统升级后执行基础配置,确保设备进入可用状态,引导用户进入初始化的操作,就是开机向导。其核心功能包括:

  • 设置系统就绪标志:通过写入 Settings.Global.DEVICE_PROVISIONED=1 和 Settings.Secure.USER_SETUP_COMPLETE=1,标记设备已完成初始化,允许正常功能(如 Home 键、网络服务)启用。
  • 禁用自身组件:执行后通过 PackageManager 禁用其 Activity,确保仅运行一次,避免重复触发。
  • 定制化扩展:厂商可在此阶段添加初始化逻辑(如关闭调试模式、校准屏幕等)。

Provision 就是谷歌为我们设计的一个 OOBE 示例,Provision 源码位于 AOSP 中:

AOSP/packages/apps/Provision/

Provision 的 AndroidMinifest.xml 关键代码分析:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.provision">

    //...
    <!-- For miscellaneous settings -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
    //...
    
    <application>
        <activity android:name="DefaultActivity"
             android:excludeFromRecents="true"
             android:exported="true">
            <intent-filter android:priority="1">
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.SETUP_WIZARD"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

其中 DefaultActivity 就是引导页的默认 Activity

属性解析

android:excludeFromRecents="true" :将该 Activity 排除在最近任务列表(Recent Tasks)之外。

用户按下“最近任务”按钮时,不会看到 DefaultActivity,为了防止用户在初始化完成后再次返回到该界面。

android:exported="true":允许其他应用程序或组件启动该 Activity。

exported="true" 表示该 Activity 可以被系统或其他应用调用,对于 Provision 来说,这是必要的,因为系统需要在设备启动时自动调用它。

Intent Filter 解析

android:priority="1":设置该 Intent Filter 的优先级为 1。

当多个组件可以处理同一个 Intent 时,系统会优先选择优先级较高的组件,这就代表如果你想自定义 Provision 应用,就需要将该优先级设置为大于 1,这样在系统启动引导页应用时就会优先于系统默认 Provision 启动。

<action android:name="android.intent.action.MAIN"/>:指定该 Activity 是应用的入口点。

<category android:name="android.intent.category.HOME"/>:指定该 Activity 可以作为设备的“主屏幕”。

设备启动时,系统会寻找带有 category.HOME 的 Activity 作为默认主屏幕,Provision 的 DefaultActivity 通过此标签确保在设备初始化期间优先于 Launcher 被调用。

<category android:name="android.intent.category.DEFAULT"/>:指定该 Activity 可以作为默认的 Intent 处理组件。

<category android:name="android.intent.category.SETUP_WIZARD"/>:指定该 Activity 是设备设置向导的一部分。

设备首次启动或恢复出厂设置后,系统会寻找带有 category.SETUP_WIZARD 的 Activity 作为设置向导。Provision 的 DefaultActivity 通过此标签确保在设备初始化期间被调用。


DefaultActivity 分析

DefaultActivity 头部有如下一段注释:

/**
 * Application that sets the provisioned bit, like {@code SetupWizard} does.
 *
 * <p>By default, it silently provisions the device, but it can also be used to provision
 * {@code DeviceOwner}. For example, to set the {@code TestDPC} app, run the steps below:
 * <pre><code>
    adb root
    adb install PATH_TO_TESTDPC_APK
    adb shell settings put secure tmp_provision_set_do 1
    adb shell settings put secure tmp_provision_package com.afwsamples.testdpc
    adb shell settings put secure tmp_provision_receiver com.afwsamples.testdpc.DeviceAdminReceiver
    adb shell settings put secure tmp_provision_trigger 2
    adb shell rm /data/system/device_policies.xml
    adb shell settings put global device_provisioned 0
    adb shell settings put secure user_setup_complete 0
    adb shell pm enable com.android.provision
    adb shell pm enable com.android.provision/.DefaultActivity
    adb shell stop && adb shell start

    // You might also need to run:
    adb shell am start com.android.provision/.DefaultActivity

 * </code></pre>
 */

这段注释来自 Android Provisioning(设备预配)相关的 Provision 应用源码,主要描述了 Provision 应用的作用 以及 如何通过 ADB 命令手动触发设备预配,尤其是设置 Device Owner(设备所有者)。

这里需要关注的是:

adb shell settings put global device_provisioned 0
adb shell settings put secure user_setup_complete 0

在首次开机时,这两个值被设置为 0,当开机向导结束后 这两个值设置为 1,代表开机向导将不会再出现,除非恢复出厂设置!

继续看Provision DefaultActivity 中的代码:

protected void onCreate(Bundle icicle) {
     super.onCreate(icicle);
     boolean provisionDeviceOwner = getSettings(getContentResolver(), SETTINGS_PROVISION_DO_MODE,
             DEFAULT_SETTINGS_PROVISION_DO_MODE) == 1;
     if (provisionDeviceOwner) {
         provisionDeviceOwner();
         return;
     }
     finishSetup();
 }
 private void finishSetup() {
     setProvisioningState();
     disableSelfAndFinish();
 }
 private void setProvisioningState() {
     Log.i(TAG, "Setting provisioning state");
     // Add a persistent setting to allow other apps to know the device has been provisioned.
     Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
     Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
 }
 private void disableSelfAndFinish() {
     // remove this activity from the package manager.
     PackageManager pm = getPackageManager();
     ComponentName name = new ComponentName(this, DefaultActivity.class);
     Log.i(TAG, "Disabling itself (" + name + ")");
     pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
             PackageManager.DONT_KILL_APP);
     // terminate the activity.
     finish();
 }

其中 finishSetup() 代表开机向导结束的方法,其中 setProvisioningState() 将 device_provisioned 和 user_setup_complete 两个值设置为 1,disableSelfAndFinish() 让自己不会再被启动。

那么,如果我们现在就知道了,开机向导应用的启动和结束配置步骤,接下来就动手做一个自定义的开机向导吧!


创建一个 app

  • 包名为:com.example.oobe
  • 因为需要设置系统属性的值,所以需要添加以下权限:
<!--  For miscellaneous settings  -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
  • 清单文件 Activity 配置:
        <activity android:name=".WelcomeActivity"
            android:excludeFromRecents="true"
            android:exported="true">
            <intent-filter android:priority="2">
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.SETUP_WIZARD"/>
            </intent-filter>
        </activity>

直接复制Provision 的 DefaultActivity 配置,将 android:priority改为 2,大于Provision 的优先级。

  • 将 finishSetup() 代码放到我们的应用中,作为向导结束时最后一步使用。

导入代码后会发现 Settings.Secure.USER_SETUP_COMPLETE会爆红找不到,是因为这是系统的 API,无法被普通应用使用:

 @SystemApi
 @Settings.Readable
 public static final String USER_SETUP_COMPLETE = "user_setup_complete";

我们可以将 framework 中的 jar 包,引入到项目中使用,在系统源码编译完成后,在 aosp_android12_r27/out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/目录下找到 classes.jar文件,里面包含系统运行中使用的变量及代码,下面将 classes.jar修改为 framework.jar放入到项目中的 libs/ 下导入,即可在编译时使用系统 API 不报错。

但是现在项目中自身的 sdk 也包含framework.jar中相同的文件和目录,这时候在编译时就不会去framework.jar中去找代码,这个时候就需要我们指定一下具体编译目录,修改编译规则,在 build.gradle 中加入以下代码,这样在编译的时候能够优先去framework.jar找相关代码:

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs.add("-Xbootclasspath/p:${rootDir}/app/libs/framework.jar")
    }
}

build.gradle 关键代码如下,注意要指定 Java 版本 JavaVersion.VERSION_1_8,否则仍会编译不通过!

android {
    namespace 'com.example.oobe'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.oobe"
        minSdk 31
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            minifyEnabled false
            debuggable true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def fileName = "SetupWizard_ext.apk"
            output.outputFileName = fileName
        }
    }
}

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs.add("-Xbootclasspath/p:${rootDir}/app/libs/framework.jar")
    }
}

dependencies {
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.activity:activity:1.2.2'
    implementation files('libs/framework.jar')
    testImplementation libs.junit
}

修改源码

因为是在模拟器上运行看效果,所以还需要将development/apps/SdkSetup/src/com/android/sdksetup/DefaultActivity.java中 设置 DEVICE_PROVISIONED 和 USER_SETUP_COMPLETE 为 1 的代码给注释掉,因为 当判断设备是 Build.IS_EMULATOR 模拟器时,不允许启动开机向导:

    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        // Edit Settings only for Emulator
        if (Build.IS_EMULATOR) {
            // ...
            // Add a persistent setting to allow other apps to know the device has been provisioned.
//            Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
//
//            Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);

            // ...
            }
    }

接着,在 vendor/apps/ 下创建 SetupWizard_ext 文件夹(注意:vendor 相关目录在前几篇文章有一步一步创建使用说明,最好是看过前几篇文章再来看接下来的步骤),将上面编译好的 SetupWizard_ext.apk 应用放到 vendor/apps/SetupWizard_ext/ 下(编译 debug 包即可),然后配置 Android.mk:

#每个 Android.mk 文件必须以定义 LOCAL_PATH 为开始,它用于在开发树中查找源文件。  
LOCAL_PATH:= $(call my-dir)
#CLEAR_VARS 变量由 Build System 提供,并指向一个指定的 GNU Makefile,由它负责清理很多 LOCAL_xxx。
include $(CLEAR_VARS)
#模块名
LOCAL_MODULE := SetupWizard_ext
#apk 名  
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#user、eng、tests、optional(所有版本都编译)
LOCAL_MODULE_TAGS := optional
#指定模块的类型,可不用定义 APPS、JAVA_LIBRAYIES、 SHARED_LIBRAYIES、 EXECUTABLES
LOCAL_MODULE_CLASS := APPS
#签名 platform 、PRESIGNED、 shared
LOCAL_CERTIFICATE := platform
# in system/app/
LOCAL_SYSTEM_MODULE := true
#  true system/priv-app; false system/app  
LOCAL_PRIVILEGED_MODULE := true
# false system; true system_ext  
# LOCAL_SYSTEM_EXT_MODULE := false
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

然后,重点来了!虽然我们在清单文件中设置了写系统属性相关的权限,但是在实际运行中,仍会报错权限问题,这时候就涉及到了权限白名单了。

在 Android 系统中,权限白名单是一种机制,用于限制某些敏感权限的使用范围,确保只有经过授权的应用或组件才能访问这些权限。这种机制通常用于系统级权限或高权限操作,以增强系统的安全性和稳定性。

只有与系统使用相同签名的应用,只有预装在系统分区(/system/priv-app)中的应用才能申请的权限。对应上面 .mk 文件中的 LOCAL_CERTIFICATE := platform 和 LOCAL_PRIVILEGED_MODULE := true

权限白名单的作用
  • 限制敏感权限:某些权限(如 INSTALL_PACKAGES、WRITE_SECURE_SETTINGS)只能由系统应用或特定组件使用。
  • 防止滥用:通过白名单机制,防止第三方应用滥用高权限操作,导致系统不稳定或安全漏洞。
  • 增强控制:系统开发者可以通过白名单精确控制哪些应用或组件可以使用特定权限。

这里不过多介绍,感兴趣的可以单独去了解。

创建权限白名单 com.example.oobe.xml:

<!-- 
  ~ Copyright (C) 2019 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License
   -->
<permissions>
  <privapp-permissions package="com.example.oobe">
    <permission name="android.permission.CHANGE_OVERLAY_PACKAGES"/>
    <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
  </privapp-permissions>
</permissions>

这里注意包名,要和上面创建的应用一致,然后将该文件也放到 vendor/apps/SetupWizard_ext/下,修改 vendor/apps/product.mk 文件:

PRODUCT_PACKAGES += \
    SetupWizard_ext \
    MyApplication \
    MyApplicationOverlay \

PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \
    system/priv-app/SetupWizard_ext/SetupWizard_ext.apk \
    system/etc/permissions/com.example.oobe.xml



PRODUCT_COPY_FILES += \
    vendor/apps/SetupWizard_ext/com.example.oobe.xml:system/etc/permissions/com.example.oobe.xml

PRODUCT_PACKAGES 添加要编译的文件夹 SetupWizard_ext ,PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST 添加 system/priv-app/SetupWizard_ext/SetupWizard_ext.apk防止编译报错,PRODUCT_COPY_FILES复制文件。

至此,开机向导应用配置完成,接下来开始整编,运行模拟器查看效果:

运行编译脚本 make_all.sh:

#!/bin/bash
rm -rf /home/你的主机名/code/aosp_android12_r27/out/target/product/emulator_x86_64/*.img
source build/envsetup.sh;
lunch sdk_phone_x86_64-eng;
make;

运行启动模拟器脚本emulator.sh:

#!/bin/bash
export ANDROID_PRODUCT_OUT=/home/你的主机名/code/aosp_android12_r27/out/target/product/emulator_x86_64
source build/envsetup.sh;
lunch sdk_phone_x86_64-eng;
emulator -writable-system;

在这里插入图片描述
在这里插入图片描述

结束!✿✿ヽ(°▽°)ノ✿

2021-05-14 AndroidR 开机向导完成标志位 当开机完成后会对标志位进行写值 packages/apps/Provision/src/com/android/DefaultActivity.java Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1); 对. 阅读详情

相关推荐

Windows 11跳过微软账户登录的三种方法(支持家庭版和专业版) Windows 11 跳过微软账户、本地账户安装、OOBE命令、注册表修改、bypassnro

方法是否修改注册表是否重启推荐程度使用命令否否⭐⭐⭐⭐⭐注册表隐藏微软账户是否⭐⭐⭐⭐添加 BypassNRO 注册项是是⭐⭐⭐⭐这三种方法是我在 2025 年 Windows 11 最新安装版本中亲测有效的。如果你和我一样,不想每台设备都绑定微软账户,这篇文章一定帮得上忙。如需复制本文作为脚本或安装教程,建议保存为.bat脚本或制作PE工具使用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3万+

Android 自定义开机引导最强篇 provision

设置相关标记位可以让其他服务知道设备可用,如锁屏服务可用,启用Home键功能等,将该Activity禁用可以让下次开机时我们的应用不会再起来而直接启动桌面,finish就不用做解释,开机引导走完了就该销毁自己了。属性的Launcher,在Pixel手机上,作为开机向导的应用是Google的。应用,这是谷歌的应用,代码不在AOSP中,在AOSP中有一个包名为。的代码移到自己的项目,走完我们自己的引导流程后设置相关属性,然后把。具体代码实现,让自己的应用比Launcher先起来的方式,

Venus 的博客 4149

Flightmare实战:从零搭建强化学习无人机控制环境

本文详细介绍了从零开始搭建Flightmare强化学习无人机控制环境的完整流程。内容包括环境准备、核心库安装、依赖冲突解决,以及如何运行PPO算法示例进行训练与可视化测试。文章还提供了环境配置、自定义任务修改及常见问题的避坑指南,帮助开发者快速上手这一模块化的无人机RL仿真平台。

weixin_29081101的博客 356

Android OOBE开发

什么是OOBE 就是开机向导,在 Android 设备首次开机的时候,会先进行一系列的初始化,然后再进入主页。 初始化的操作一般有 登录或注册厂商账号、选择时区、选择语言等,TV的话还可能包括搜台等。 初始化的操作只在首次开机和安卓复位后才会出现,普通开关机不会出现。 源码的开机向导 源码 \packages\apps\Provision 。 查看注册文件: <manifest xmlns...

weixin_44021334的博客 3729

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

3060台式机 Ubuntu 双系统部署 LingBot-Map 完整指南

摘要: 本文详细介绍了在配备RTX 3060显卡的台式机上部署Ubuntu双系统并安装LingBot-Map 3D重建模型的完整流程。LingBot-Map作为蚂蚁灵波科技开源的Transformer架构模型,在流式3D场景重建中展现出高效性能(20 FPS)和卓越精度(ATE仅6.42米)。指南涵盖关键准备步骤、UEFI分区原理、Ubuntu安装流程(推荐150GB空间及手动分区方案),以及后续驱动配置说明,特别强调RTX 3060需12GB显存支持,并提供了数据备份、Secure Boot处理等实用建议

huanghm88的专栏 306

com.android.provision基本介绍

1.com.android.provision ANR(平台android6  mstar芯片  内存1G)1.从device log看,cpu只有30占用排除cpu导致的anr2.anr类型为input dispatching time out 按键无响应3.从trace看,pid 4618主线程处于空闲状态,不像进程本身原因导致的anrE/ActivityManager( 1817): ANR...

wd229047557的博客 7250

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

伶俐角少儿编程 727

关于Android P Auto锁屏Global.DEVICE_PROVISIONED

在Android P的Auto版本中,多用户会根据Global.DEVICE_PROVISIONED的值选择一个导航栏的锁屏画面。 官网解释: https://developer.android.com/reference/android/provider/Settings.Global#DEVICE_PROVISIONED DEVICE_PROVISIONED Added in API leve...

Sunxiaolin2016的博客 4857

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 180

基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)

在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。

YOLO 634

手机中的com.android.provision删除可不可以,Android Provision (Setup Wizard)

http://blog.youkuaiyun.com/linghu_java/article/details/8128639Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一个冗余的实现。Android中的Provision其实就是类似刚出厂时或者恢复出厂设置之后,一步一步引导用户完成各种设置的Setup Wizar...

weixin_33369808的博客 2538

基于物联网设计的蜂箱智能监测系统设计

为解决传统养蜂业依赖人工、管理效率低下、干扰蜂群等问题,本项目设计并实现了一套基于物联网(IoT)的蜂箱智能监测系统。

682

android 开机向导OOBE源码分析

OOBE是开机向导,普通的理解就是一个界面跳另一个界面再跳下一个界面,OOBE却不是这么实现的。下面分析OOBE界面跳转实现: 打开OOBE目录,找到入口是WizardActivity.java,该Activity随后跳转到MainActivity.java。OOBE界面跳转逻辑都在MainActivity.java里实现。 对于一个陌生的Activity,我们先看它的onCreate方法:

cuckoochun的专栏 6868

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 显示Gif 动态图片(1)

下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。判断gif图是否停止了。

2301_79600088的博客 990

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android11 provision引导程序私有权限配置

LOCAL_REQUIRED_MODULES := privapp_whitelist_com.xxx.provision 引用配置的私有权限。现象:自己开发的provision设置 “user_setup_complete”不生效。1、使用Android studio 开发自己的provision.apk。目录:frameworks\base\data\etc。2、配置应用程序权限,参考系统provision权限配置。在同目录下的Android.bp文件中配置。2、Android.mk文件。

qq_16815415的博客 1105

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Provision(开机向导setupwizard程序)

但是在原生的 android 系统中,这个 provision 非常的简单,只有一个空白的 activity,这个主要就是留给 厂商自己定制的(像 google 的 nexus 进行让里你登陆 google 帐号,连接WiFi等等一些功能)。之所以会关注DEVICE_PROVISIONED这个标记,是因为当用户操作完的App 的时候我设置了这个标记,等其他逻辑,导致外部程序进入的时候黑屏,为了排查原因,所以就从这入手了。这个组件只会运行一次,所以我们如果没有格式化/data目录,这个组件就会被禁止。

Venus 的博客 2865

预装 Win 11 系统跳过联网激活

随后按下回车,电脑将进入重启. 重启完成后, 再次来到Win11联网界面, 可以看到右下角的 “下一步” 按钮旁多出了一个 “我没有Internet连接” 的选项.点击该选项, 在新的界面中, 继续点击右下角的 “继续执行受限设置”, 到此就完成了跳过联网激活的环节。

howeres的博客 4万+

Android仿系统provision应用实现开机向导

背景:TV首次开机实现遥控对焦、连接wifi等指导性功能应用需要的功能 :1.设置相关属性让自己早于Launcher起来;2.设置开机引导已经走完的标记位。

qq_44203816的博客 927

Google APK ANR 解决方案

极力推荐文章:欢迎收藏Android 干货分享阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分GMS...

程序员Android 917

android provision

今天说说Provision这个APK,可能很多朋友都不知道有这个APK存在。Provision的作用很简单,就是一个系统初始化引导程序,原生的Android里面Provision只做了一件事,就是写入一个DEVICE_PROVISIONED标记。不过这个标记作用很大,这个标记只会在系统全新升级(双清)的时候写入一次,代表了Android系统升级准备完成,可以正常工作。   之所以会关注DEVIC

shenmay2012的专栏 1万+

Android——锁定launch - 原生Browser启动 -引导provision

前段时间做了一个功能,就是锁定主launch,机器上只能跑我们定义的launch,当时没注意影响, 最近发现就是因为在AMS中加了这个锁定过滤条件导致原生Browser无法启动了, 把我郁闷的,当时怎么想都觉得奇怪,这完全不相关的两件事怎么会影响到~ 这里记录一下

jscese 5300

android 默认打开数据网络设置,android系统开机向导无法启动数据进行上网

由于android系统开机向导界面比较特殊,会通过Settings.Global.DEVICE_PROVISIONED 属性来控制,刷完机第一次启启动此值会默认为0 ,开机向导结束后会设置为1,系统很多地方会根据此值来控制opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.javaopt/te...

weixin_39612038的博客 1328

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Windows11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Windows11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激活,操作步骤如下: 第一次开机初始化系统,配置完所在地区、输入法就到了联网界面,这个界面没有跳过联网的按钮方式,即使重新开机重启也无法跳过该联网界面,接下来我们进行联网激活跳过操作; 1、在连接网络界面,按键键盘快捷键【

rtkj1122的博客 2万+

android OOBE创建方法

OOBE就是ANDROID第一次开机时候的系统设置,只在机器第一次开机的时候运行一次,之后都不会再运行,除非erase userdata和erase cache。 创建OOBE很简单,只需要把Google的APK应用套件拷贝到自己的系统里就可以了,其中有一个SetupWizard.apk就是干这个的,另外还要一些权限类的文件,一并拷入系统即可,在erase userdata & erase ca

suntao222的专栏 8310
上一篇: 我的创作纪念日
下一篇: 安卓源码学习之【导航方式切换分析及实战】
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值