混合开发新思路:用Android Studio将H5网站变身原生APP的实战与思考

APP开发_开发一个入门的 H5 APP 开发一个入门的 H5 APP 阅读详情

混合开发新思路:用Android Studio将H5网站变身原生APP的实战与思考

在移动应用开发领域,混合开发模式正成为越来越多创业团队和技术决策者的首选方案。面对快速迭代的市场需求与有限的开发资源,如何将成熟的H5产品高效转化为原生APP体验,成为了一个极具现实意义的技术课题。Android Studio作为官方集成开发环境,提供了强大的WebView控件和灵活的配置选项,让开发者能够以最小成本实现H5内容的原生封装,同时保持与原生功能的深度整合。

这种开发方式特别适合已经拥有稳定H5产品的团队,他们不需要完全重写应用逻辑,而是通过精心设计的封装策略,在保持开发效率的同时获得原生应用的分发渠道和用户体验。接下来我们将深入探讨从基础封装到高级优化的完整实施方案。

1. 环境准备与项目初始化

在开始封装之前,需要确保开发环境配置正确。Android Studio的最新稳定版本是必备工具,建议同时安装合适的SDK平台和构建工具。创建新项目时选择"Empty Activity"模板,这将提供一个干净的基础代码结构。

配置Gradle脚本时,需要特别注意目标SDK版本的选择。目前推荐使用API level 33或更高版本,这样可以确保应用能够充分利用最新的平台特性。同时,在build.gradle文件中需要设置合适的minSdkVersion,平衡功能覆盖率和开发成本:

android {
    compileSdk 33
    
    defaultConfig {
        minSdk 21
        targetSdk 33
        versionCode 1
        versionName "1.0"
    }
}

提示:将minSdkVersion设置为21可以覆盖超过95%的Android设备,同时允许使用现代API特性。

项目创建完成后,首先需要在AndroidManifest.xml中声明网络访问权限和适当的硬件特性要求。基本的网络权限声明如下:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

对于需要地理位置功能的应用,还需要添加相应的位置权限声明。权限管理策略应该根据应用的实际需求精心设计,避免过度请求权限影响用户体验。

2. WebView核心配置与优化

WebView是混合应用的核心组件,其配置方式直接影响应用性能和用户体验。正确的WebView初始化不仅需要基本的网页加载功能,还需要考虑JavaScript交互、缓存策略和安全防护等多个方面。

2.1 基础WebView配置

在布局文件中定义WebView控件时,建议使用Match_parent填充整个活动窗口:

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在Activity中初始化WebView时,需要进行一系列关键配置:

WebView webView = findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();

// 启用JavaScript支持
webSettings.setJavaScriptEnabled(true);

// 优化页面渲染和缩放设置
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setBuiltInZoomControls(false);

// 启用DOM存储和缓存
webSettings.setDomStorageEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

// 设置WebView客户端和处理页面加载
webView.setWebViewClient(new CustomWebViewClient());
webView.loadUrl("https://your-web-app.com");

为了提高页面加载速度,可以启用硬件加速和预加载策略。同时,应该为WebView设置合适的缓存策略,减少重复网络请求。

2.2 性能优化策略

WebView性能优化是提升用户体验的关键。以下是一些经过验证的有效策略:

  • 启用硬件加速:在AndroidManifest.xml中为Activity添加硬件加速支持
  • 资源预加载:在应用启动时预先加载关键资源,减少用户等待时间
  • 图片懒加载:通过自定义策略延迟加载非可视区域的图片
  • JavaScript优化:避免阻塞性JS操作,使用Web Workers处理复杂计算

实际测试表明,经过优化的WebView应用可以达到接近原生应用的流畅度,特别是在中高端设备上。以下是一组性能对比数据:

优化措施页面加载时间减少内存使用降低帧率提升
启用缓存40-60%15-25%10-15%
硬件加速10-20%5-10%30-50%
资源压缩20-30%10-20%5-10%

这些优化措施的组合使用可以显著提升应用的整体性能表现。

3. 高级功能与原生交互

单纯的网页封装远远不够,真正的混合应用需要实现H5与原生代码之间的深度交互。这种双向通信机制让Web内容能够调用设备原生功能,同时原生代码也可以响应用户在Web界面上的操作。

3.1 JavaScript与Java交互

建立JavaScript与Java的桥梁是通过WebView的addJavascriptInterface方法实现的:

public class WebAppInterface {
    Context mContext;
    
    WebAppInterface(Context c) {
        mContext = c;
    }
    
    @JavascriptInterface
    public void showToast(String message) {
        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
    }
    
    @JavascriptInterface
    public String getDeviceInfo() {
        return Build.MODEL + " - " + Build.VERSION.RELEASE;
    }
}

// 在WebView初始化时添加接口
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

在JavaScript代码中,可以直接调用这些暴露的方法:

// 显示Toast消息
Android.showToast('Hello from JavaScript!');

// 获取设备信息
var deviceInfo = Android.getDeviceInfo();

注意:所有通过@JavascriptInterface暴露的方法都必须在UI线程中执行,避免复杂的阻塞操作。

3.2 自定义URL处理与深度链接

通过重写WebViewClient的shouldOverrideUrlLoading方法,可以实现自定义的URL处理机制:

private class CustomWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        
        // 处理深度链接
        if (url.startsWith("myapp://")) {
            handleDeepLink(url);
            return true;
        }
        
        // 处理特定文件下载
        if (url.endsWith(".pdf")) {
            startDownload(url);
            return true;
        }
        
        return false;
    }
}

这种机制允许应用拦截特定模式的URL,实现原生功能调用、深度导航或特殊处理,为混合应用提供了极大的灵活性。

4. 离线功能与缓存策略

离线功能是提升混合应用用户体验的重要方面。合理的缓存策略可以确保在网络不稳定时应用仍能正常使用,同时减少数据流量消耗。

4.1 应用缓存与数据存储

WebView提供了多种缓存机制,可以根据内容类型和更新频率选择合适的策略:

// 配置缓存策略
webSettings.setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
webSettings.setAppCacheEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

// 设置数据库存储
webSettings.setDatabaseEnabled(true);
webSettings.setDomStorageEnabled(true);

// 根据网络状态调整缓存策略
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();

if (!isConnected) {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}

对于重要静态资源,可以考虑使用Service Worker进行更精细的缓存控制,实现真正的离线体验。

4.2 资源预加载与更新机制

为了实现最佳性能,可以在应用启动时预加载关键资源:

// 预加载WebView
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        // 页面加载完成后预加载下一个可能访问的页面
        webView.loadUrl("javascript:preloadNextPage()");
    }
});

// 后台更新缓存内容
Handler handler = new Handler();
Runnable cacheUpdateTask = new Runnable() {
    @Override
    public void run() {
        updateCache();
        handler.postDelayed(this, CACHE_UPDATE_INTERVAL);
    }
};
handler.postDelayed(cacheUpdateTask, CACHE_UPDATE_INTERVAL);

这种机制确保了用户即使在没有网络的情况下也能访问核心功能,同时通过后台更新保持内容的时效性。

5. 用户体验与界面优化

混合应用的成功很大程度上取决于用户体验的质量。通过精心设计的界面过渡、加载状态处理和原生控件集成,可以创造近乎原生的使用感受。

5.1 加载状态与错误处理

用户对加载等待的容忍度有限,因此需要设计良好的加载状态反馈:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // 显示加载进度条
        progressBar.setVisibility(View.VISIBLE);
    }
    
    @Override
    public void onPageFinished(WebView view, String url) {
        // 隐藏加载进度条
        progressBar.setVisibility(View.GONE);
    }
    
    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        // 显示错误页面
        showErrorPage();
    }
});

对于网络错误或加载失败的情况,应该提供友好的错误页面和重试机制,避免显示技术性的错误信息。

5.2 导航控制与手势支持

实现直观的导航控制是提升用户体验的关键环节:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // 处理返回键导航
    if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
        webView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

// 添加手势导航支持
webView.setOnTouchListener(new View.OnTouchListener() {
    private float startX;
    private static final float MIN_SWIPE_DISTANCE = 100;
    
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                break;
            case MotionEvent.ACTION_UP:
                float endX = event.getX();
                float deltaX = endX - startX;
                
                if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {
                    if (deltaX > 0) {
                        // 右滑,相当于后退
                        if (webView.canGoBack()) {
                            webView.goBack();
                        }
                    } else {
                        // 左滑,相当于前进
                        if (webView.canGoForward()) {
                            webView.goForward();
                        }
                    }
                    return true;
                }
                break;
        }
        return false;
    }
});

这些交互细节的优化让用户感觉像是在使用原生应用,而不是简单的网页封装。

6. 安全加固与性能监控

安全性和稳定性是发布高质量应用的基本要求。混合应用需要特别关注WebView的安全配置和性能监控。

6.1 WebView安全配置

WebView作为潜在的安全风险点,需要采取严格的安全措施:

// 禁用不安全的功能
webSettings.setAllowFileAccess(false);
webSettings.setAllowContentAccess(false);
webSettings.setAllowFileAccessFromFileURLs(false);
webSettings.setAllowUniversalAccessFromFileURLs(false);

// 启用安全浏览功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    webSettings.setSafeBrowsingEnabled(true);
}

// 设置内容安全策略
webSettings.setMediaPlaybackRequiresUserGesture(true);

对于加载的内容,应该实施严格的白名单机制,只允许信任的域名和协议:

private boolean isAllowedUrl(String url) {
    String[] allowedDomains = {
        "https://your-web-app.com",
        "https://api.your-web-app.com"
    };
    
    for (String domain : allowedDomains) {
        if (url.startsWith(domain)) {
            return true;
        }
    }
    return false;
}

6.2 性能监控与异常追踪

集成性能监控工具可以帮助发现和解决潜在问题:

// 监控WebView性能
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onConsoleMessage(ConsoleMessage consoleMessage) {
        // 记录JavaScript控制台消息
        Log.d("WebViewConsole", consoleMessage.message());
    }
    
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        // 记录页面加载进度
        analytics.logLoadProgress(newProgress);
    }
});

// 监控内存使用
Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo);
long totalMemory = Runtime.getRuntime().totalMemory();
long freeMemory = Runtime.getRuntime().freeMemory();

通过持续监控关键性能指标,可以及时发现和优化瓶颈问题,确保应用在各种设备上都能提供稳定的体验。

在实际项目中,我们团队发现最影响用户体验的往往是那些看似微小的细节:页面过渡动画的流畅性、加载状态的自然反馈、离线时的有意义的提示。这些细节的处理水平往往决定了用户是将应用视为"另一个Web应用"还是真正的原生体验。

通过Android Studio进行H5封装的技术方案已经相当成熟,但真正出色的混合应用需要在此基础上深入优化每个环节,从基础配置到高级功能,从性能表现到用户体验。这种开发模式不仅节省初期开发成本,更为后续的功能扩展和维护提供了灵活的基础架构。

Android Studio WebView实战:从零封装H5网站为原生APP 本文详细介绍了如何使用Android Studio的WebView组件将H5网站快速封装为原生APP。从环境配置、界面布局到核心功能实现,涵盖JavaScript交互、性能优化及安全设置等关键技术点,帮助开发者高效完成H5应用的原生封装,特别适合内容展示型应用的快速开发。 阅读详情

相关推荐

Android Studio记录在使用过程遇到的各种问题及解决,2021大厂Android开发面试总结+解答

classpath ‘com.neenbedankt.gradle.plugins:android-apt:x.x’ classpath ‘me.tatarka:gradle-retrolambda:x.x.x’ 在module的build.gradle中删除 apply plugin: ‘com.neenbedankt.android-apt’ apply plugin: ‘me.tatarka.retrolambda’ 将module的build.gradle文件中的dependency改为 annot

m0_64383081的博客 1021

Android Studio 打包H5网址页面,封装APK

AndroidStudio 打包H5网址页面,封装APK

geniusbluesky的博客 6409

Android Studio WebView实战:将H5站点快速封装为原生APP

本文详细介绍了如何使用Android Studio的WebView组件将现有的H5网站快速封装为原生APP。通过实战步骤讲解环境配置、布局设计、性能优化及常见问题处理,帮助开发者低成本实现HTML5内容到移动端的迁移,提升开发效率。

oauth7security的博客 776

老调重弹,Android Studio 打包H5项目(2020版)

最近有个非常需求,领导要我把H5打包成安卓App。无奈之下,倒腾了一翻。用Android Studio来打包H5项目,其实并不难,看完本文就知道啦,2020版,点击我查看更多......

洲上牧童 5231

Android打开H5网页完整AndroidStudio工程

Android打开H5网页完整AndroidStudio工程

TI LP87745-Q1汽车雷达PMIC评估:从硬件设计到性能测试全解析

在汽车电子和高级驾驶辅助系统(ADAS)中,电源管理单元(PMIC)是确保传感器稳定可靠运行的核心。其工作原理在于集成多路高效电源转换器(如Buck、Boost)和精密监控电路,通过数字接口实现灵活配置与实时诊断。这项技术的核心价值在于为毫米波雷达等关键负载提供低噪声、高精度、满足严格时序与功能安全(ASIL)要求的供电方案,从而提升整个感知系统的信噪比与可靠性。其典型应用场景包括自动驾驶域控制器、车载传感器融合模块等。本文以德州仪器(TI)的LP87745-Q1专用PMIC及其评估模块(EVM)为例,深入

weixin_27017211的博客 311

使用android studio将h5项目打包成安卓app

使用android studio将h5项目打包成安卓app

猛犸象 5039

程序自动化填写网页表单数据

如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。

Y 2425

【亲测免费】 Android Studio 打包H5网页应用教程

Android Studio 打包H5网页应用教程 【下载地址】AndroidStudio打包H5网页应用教程 - **标题**: androidstudio 打包h5 网页地址包壳- **功能**: 本资源包含了一个简单的Android项目模板,能够让您轻松地将自己的H5网页封装成一个Android应用程序。通过修改提...

gitblog_09812的博客 1112

本地AI代码助手:智能解析大型代码库,实现自动化重构与理解

在软件开发中,大型代码库的理解与维护是常见挑战。传统方法依赖人工阅读和有限上下文工具,效率低下。通过结合检索增强生成(RAG)和多智能体(Multi-Agent)架构,现代AI工具能够智能解析代码结构,理解模块关系,并精准定位相关代码片段。这种技术不仅能提升代码探索效率,还能自动化执行重构、文档生成等任务,在遗留系统维护、快速上手新项目等场景中发挥关键作用。本文以blackboxaicode/cli为例,展示了如何利用其代码感知和Workflow Automation能力,高效处理复杂代码库。

weixin_30240349的博客 363

Ghidra逆向工具入门:从安装到实战分析baby.exe(附详细配置截图)

本文详细介绍了Ghidra逆向工具的安装配置与实战应用,通过破解CTF题目baby.exe的全过程展示其强大功能。从Java环境搭建到插件配置,再到反编译技巧与动态调试方法,帮助读者快速掌握这款免费开源的反编译神器,有效替代收费的IDA Pro工具。

weixin_29252171的博客 352

android webView 的WebSettings 说明

史上最全的WebSettings说明 WebSettings webSettings=webView.getSettings(); setAllowContentAccess (boolean allow) 是否允许在WebView中访问内容URL(Content Url...

845

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

安卓h5打包系统设计

设计一个安卓H5打包系统,主要是为了将H5应用高效、便捷地转换为原生安卓应用(APK),以适应不同场景下的需求。

svygh123的专栏 914

YOLOv11在STM32H7上的MCU部署实战:基于CMSIS-NN的高效推理实现

嵌入式AI与MCU部署技术解析 本文系统介绍了基于STM32H7微控制器的YOLOv11模型部署方案。主要内容包括: 边缘计算背景下MCU的AI部署优势与挑战,重点分析了STM32H7平台特性 YOLOv11模型的结构优化,包括E-ELAN骨干网络和Meta-ACON激活函数等改进 CMSIS-NN加速库的架构原理,在STM32H743上可实现5.4倍卷积加速 完整的开发环境搭建流程,涵盖硬件选型、工具链配置和模型转换 模型优化关键技术,包括int8量化、剪枝和内存占用优化等 实验表明,该方案在保持模型精度

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 853

华为 MetaERP 总账模块依托 “交易即核算” 的事件驱动架构,与 Oracle EBS 相比,更强调业务事件自动触发财务动作、实时数据同步和智能规则引擎,实现业务与财务的深度融合

华为MetaERP总账模块采用"交易即核算"架构,相比Oracle EBS实现了三大突破:1)业务事件自动触发财务动作,如采购收货自动生成暂估凭证;2)业务财务数据实时同步,支持即时分析;3)内置智能规则引擎,实现自动匹配、核销和结转。该模块覆盖采购、销售、资产、薪酬等全业务场景,支持多维核算和关联交易自动抵消,显著提升核算效率与准确性。其中采购暂估、销售结转等场景实现全自动化处理,较EBS减少80%手工操作。

金牌架构师 222

AndroidStudio打包HBuilderX的H5+项目为安卓App【一次过,无任何异常报错】

(2)本地电脑务必有JDK1.8以上且配备好环境变量【用于生成和查看证书】,有一个容易犯错误的点,就是在DCloud开发者中心生成证书下载到本地使用,那是不行的,我爬了两天这个坑,安装JDK后迎刃而解!要注意的是,你在输入密码的时候光标不会有移动的变化,但是你的在输入状态的,不要管他,输入完毕按下回车,这里我以密码为123456示例。(3)项目中有两个容易混淆的build.gradle文件,要注意我们修改的是sampleDemo文件夹下的那个,值得注意的是,此时我的APP有。复制到步骤4刚清空的文件夹。

冰凌的博客 4379

别再用LabelImg了!我手搓了一个C#“一站式”YOLO工具箱,标注训练推理全搞定

这个工具箱目前已经在两个小型产线项目中试用,反馈非常好。效率提升:原本需要 2 天完成的“数据准备 - 训练 - 验证”循环,现在缩短到了 2 小时。门槛降低:产线技术员经过 10 分钟培训,就能独立完成新产品的模型迭代。当然,它还有改进空间未来计划集成主动学习功能:自动筛选出置信度低的图片,推荐优先标注。支持多模型管理:方便在不同产品型号间快速切换。增加PLC 通信模块:直接在推理界面配置 IO 信号,实现真正的软硬联动。最后想说工具的本质是服务于人。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 441

android studio打包纯H5项目(集成5+SDK)

我们下载5+SDK直接复制demo出来 ![在这里插入图片描述](https://img-blog.youkuaiyun.com/20181023173807288?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NzAyMzY0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 改个名...

一念执着。c的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度学习工具包 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")

Android Studio将html5网址封装成APP

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2301_82242844的博客 1221

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

使用 Android Studio 进行 HbuilderX H5+App 离线打包

本文详细介绍了使用Android Studio进行HBuilderX H5+App离线打包的完整流程。主要内容包括:1) 准备工作(安装工具、获取SDK);2) 使用VSCode打包前端项目;3) 在HBuilderX中创建H5+App项目并替换资源;4) 配置应用信息(AppKey、版本号等);5) 使用Android Studio导入工程并配置签名文件;6) 打包测试版和正式版APK。文中特别强调了DCloud开发者中心的配置要点和签名文件的处理方法,为开发者提供了清晰的离线打包指南。

灵魂学者的博客 1131

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android Studio开发安卓app 封装WEB(H5,URL)

Android Studio开发安卓app 封装WEB(H5,URL)

qq445829096的博客 2111

android studio封装h5,androidstudio打包html成为apk | 时刻需

最近想把博客站打包成小的APP但还不会java就百度寻找了方法1.先安装 androidStudio2.打开软件新建项目3.修改 MainActivity.java 如下在 Android模式下:package com.example.h5;//改成你的项目名import android.support.v7.app.AppCompatActivity;import android.os.Bund...

weixin_39704971的博客 785

android studio创建第一个安卓程序加载html5页面(一)

前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本。 动机:由于工作中需要对移动端软件开发的几种方式进行一下对比研究,故有了此文章的产生,估计后续还会有其他技术方案的文章发布。 目标:为了适应跨平台的要求,所以用html5编写页面,利用webview装载html5页面就成为了一个...

zhangbijun1230的专栏 2万+

用android studio创建第一个安卓程序加载html5页面(一)

前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本。 动机:由于工作中需要对移动端软件开发的几种方式进行一下对比研究,故有了此文章的产生,估计后续还会有其他技术方案的文章发布。 目标:为了适应跨平台的要求,所以用html5编写页面,利用webview装载html5页面就

Tan397844313的博客 1万+
上一篇: 解码通信协议:如何像侦探一样分析I2C与SPI的每一bit数据
下一篇: 超越点灯:用STM32寄存器解锁嵌入式系统的隐藏技能
git9versioner
博客等级 码龄4年 74粉丝 1650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值