一天干掉一只Monkey计划(序)【转】

本文介绍了作者通过使用RenderMonkey工具进行着色器开发的学习计划。主要内容包括RenderMonkey的使用方法、在线教程链接以及作者的学习目标。RenderMonkey作为一款由AMD推出的着色器开发工具,能有效降低开发门槛。

http://www.cnblogs.com/Zephyroal/archive/2011/10/10/2206509.html

一天干掉一只Monkey计划(序)

一天干掉一只Monkey计划(序)

经过n久的焦头烂额,手头的工作终于开始轻松下来,想法很多,但出于兴趣第一,及将来对项目多做贡献的角度,决定目前最大的精力放在Shader效果上,辅之以C++深入的学习。

千里之行始于足下,要专心学习shader还是用RenderMonkey这样的工具,排除其他编程方面的干扰为佳,以前对此工具还略有入门,正好现在拿来开刀:

1,

首先记录下,网上一些关于renderMonkey的教程:

一步一步学RenderMonkey

http://blog.youkuaiyun.com/tianhai110/article/details/5668832

《RenderMonkey的基本使用方法》

http://www.cnblogs.com/mixiyou/archive/2009/10/05/1578208.html

《用RenderMonkey 进行shader开发(一)》

http://school.ogdev.net/ArticleShow.asp?id=5551&categoryid=5

《用RenderMonkey 进行shader开发(二)》

http://school.ogdev.net/ArticleShow.asp?id=5552&categoryid=5

renderMonkey官方网址(提供renderMonkey下载)

http://developer.amd.com/gpu/rendermonkey/Pages/default.aspx

RenderMonkey制作photoshop特效

http://www.qqread.com/soft-engineering/q372752_2.html

2,

还有鉴于RenderMonkey由于长时间的不更新,附上其藏在amd角落的位置:

http://developer.amd.com/archive/gpu/rendermonkey/pages/default.aspx

3,

万籁具备,只欠东风,现在最需要的就是订立一个详细的计划,目标是首先走一遍基本的光照模型,然后一天收集一个符合cool标准的shader效果,从原理到实际实现加以吸收,争取一天干掉一只猴子,为期一月,再行引擎改造大业。

4,Basic

这里就偷个懒,直接套用逍遥剑客的blog:

http://blog.youkuaiyun.com/xoyojank/article/details/1788982

RenderMokey是ATi发布的一个快速开发着色器程序和效果的工具.它解决了几个问题:

1. 着色器程序通常需要一个框架才能运行.这样的一个工具必须可以设置几何和纹理等信息而不用额外的代码

2. 传统的着色器程序开发时间消耗太大,而且需要高质量的代码做为依托.这就增加了开发难度,并限制了技术的共享

3. 着色器开发工具应该在程序员和美工之间建立一个桥梁,所以它不应该依赖任何API,也不应该需要太高的编程能力

4. 工具的框架应该要能够适应未来技术的发展

基于这些目标,ATi推出一个强大而且高效的开发工具:RenderMonkey,它大大降低了着色器程序开发的门槛,你只需要基本的图形学知识就可以使用它.

主界面

clip_image002

Workspace窗口

clip_image003

这里面包含很多不同类型的元素,可以分成4组:

1. 组元素,用来把元素组织成一个层次结构,如effect,pass等

2. 着色器或效果用到的参数,包括矩阵,向量,颜色等.它们可以用Artist编辑器来设定,我们会在后面提到

3. 着色器或效果的状态控制,包括着色器程序,硬件渲染状态,或顶点流映射

4. 着色器用到的资源,通常是网格和纹理

这些东西被保存到一个.RFX文件中,里面是XML格式的.这样可以用程序来方便地读取

效果预览窗口

clip_image004

从这里你可以看到着色器程序的最终效果.当然,你可以用鼠标来控制摄像机观察方式

输出窗口

clip_image005

如果在这里出现了错误信息,你可以像在VC中一样双击它,RenderMonkey会自动打开编辑器窗口,并把光标定位到相应的位置

编辑器窗口

clip_image006

它可以用来编辑ASM代码或HLSL,而且在编辑的同时状态栏还会给出相应的代码提示

Artist编辑器

clip_image007

这个窗口默认不显示,可以通过View->Artist Editor来调出来

在这里你可以设置各个参数元素,而且可以即时显示结果

下面看一下整个工程的组织形式

1. 库存变量,这里是View-Projection矩阵

2. 流映射,即这里的PNTT,应该是定义的VertexShader的顶点输入格式,双击可以打开编辑框

clip_image008

3. 效果组,它代表一个独立的Shader程序,你可以在一个工作空间中建立多个Shader

变量列表

纹理

模型

Pass

模型引用

渲染状态

        VertexShader

        PixelShader

纹理信息(我想可能是Sampler吧?)

clip_image009

clip_image010

<think>首先,用户的问题是:"请问Android开发:如何编写一个应用程调用Monkey测试工具进行自动化测试"。我需要基于提供的引用和系统指令来回答。 系统指令要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的引用是关于Monkey测试的: - [^1]: Monkey测试是Android自动化测试的一种方法,用于检验程稳定性。 - [^2]: 区分Android和iOS等平台的测试工具。 - [^3]: Monkey是命令行工具,用于压力测试,随机操作。 - [^4]: 使用-p选项指定包名。 - [^5]: 示例命令adb shell monkey -p com.android.xxx 1000。 用户希望了解如何编写一个Android应用程来调用Monkey测试工具。Monkey工具通常是从命令行运行的,而不是直接从另一个应用程调用。但用户可能想创建一个GUI或自动化脚本来触发Monkey测试。 关键点: - Monkey是一个命令行工具,通过ADB(Android Debug Bridge)运行。 - 要调用它,需要从应用程执行shell命令。 - 在Android开发中,应用程可以执行shell命令,但需要适当的权限。 步骤: 1. **理解Monkey调用**:Monkey测试是通过ADB命令执行的,例如:`adb shell monkey -p com.example.app 1000`。 2. **在应用程中执行命令**:Android应用程可以使用`Runtime.getRuntime().exec()`或`ProcessBuilder`来执行shell命令。 3. **权限要求**:执行shell命令通常需要root权限或ADB权限,这在普通应用程中可能受限。用户设备可能需要启用USB调试或root。 4. **实现步骤**: - 创建一个Android项目。 - 添加代码来执行ADB命令。 - 处理权限问题。 - 可能使用服务或后台任务来运行测试。 5. **安全考虑**:调用Monkey可能影响系统,因此需要谨慎。 回答结构: - 逐步解释如何实现。 - 提供代码示例。 - 引用相关引用。 - 最后生成相关问题。 生成相关问题:指令要求"生成相关问题",所以回答结束后添加§§相关问题§§部分。 使用中文回答。 确保回答真实可靠:基于我对Android开发的知识。引用提供了一些背景,但主要需要我的知识。 可能的实现: - 使用`Runtime.exec()`运行`monkey`命令。 - 示例代码:在Activity中执行命令。 - 注意:需要处理输出和错误流。 引用标识:在回答中引用相关段落时添加[^n]。例如,提到Monkey测试的定义时引用[^1]。 完整回答大纲: 1. **介绍**:简述Monkey测试和如何在应用程中调用。 2. **步骤**: - 步骤1: 设置项目和环境。 - 步骤2: 编写代码执行Monkey命令。 - 步骤3: 处理权限和输出。 3. **代码示例**:提供Kotlin或Java代码。 4. **注意事项**:讨论权限限制和替代方法。 5. **引用**:自然地添加引用。 6. **相关问题**:生成几个相关问题。 生成相关问题:基于主题,例如: - 如何在无root权限下执行Monkey测试? - Monkey测试的结果如何解析? - 其他自动化测试工具比较。 确保LaTeX:虽然主题是开发,但如果有数学表达式,使用指定格式。可能这里没有数学表达式,但如果有,要处理。</think>### Android开发:调用Monkey测试工具进行自动化测试的实现方法 在Android开发中,Monkey测试是一种强大的压力测试工具,用于模拟用户随机操作(如点击、滑动等),以检验应用程的稳定性和健壮性[^1]。通常,Monkey工具通过ADB(Android Debug Bridge)命令行调用,但您可以通过编写一个Android应用程来封装这个过程,实现自动化触发和监控。下面我将逐步解释实现方法,包括代码示例和关键注意事项。整个过程基于标准Android开发实践,确保真实可靠。 #### 步骤1: 理解Monkey命令和权限要求 Monkey测试的核心是执行ADB shell命令,例如: ``` adb shell monkey -p com.example.app 1000 ``` - `-p com.example.app`:指定被测试应用的包名(引用[^4])。 - `1000`:随机操作的次数(引用[^5])。 在应用程中调用此命令需要: - **ADB权限**:设备必须启用USB调试模式(在开发者选项中设置)。 - **应用程权限**:您的应用需要`INTERNET`权限(用于ADB通信)和`RUN_IN_BACKGROUND`权限(如果测试在后台运行)。普通应用无法直接执行shell命令,除非设备已root或使用特定API。 - **安全限制**:Monkey测试可能影响系统稳定性,建议在测试设备上使用,避免生产环境(引用[^3])。 #### 步骤2: 创建Android项目并添加权限 1. **创建新项目**:在Android Studio中创建一个新项目(例如,使用Kotlin语言)。 2. **添加权限**:在`AndroidManifest.xml`文件中声明必要权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 可选,用于保存测试日志 --> ``` 注意:如果目标设备已root,还需添加`android.permission.ACCESS_SUPERUSER`,但普通应用可能无法获取root权限,需用户手动授权。 #### 步骤3: 编写代码执行Monkey命令 使用`Runtime.getRuntime().exec()`方法执行shell命令。以下是一个Kotlin示例,在Activity中实现: ```kotlin import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import java.io.BufferedReader import java.io.InputStreamReader class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 调用Monkey测试(示例包名:com.example.app,操作次数:1000) executeMonkeyTest("com.example.app", 1000) } private fun executeMonkeyTest(packageName: String, eventCount: Int) { try { // 构建Monkey命令 val command = "monkey -p $packageName $eventCount" val process = Runtime.getRuntime().exec(arrayOf("su", "-c", command)) // 使用"su"获取root权限,如果设备未root,可能失败 // 如果设备未root,可尝试直接执行:Runtime.getRuntime().exec("sh -c '$command'"),但成功率低 // 读取命令输出(日志用于调试) val reader = BufferedReader(InputStreamReader(process.inputStream)) val errorReader = BufferedReader(InputStreamReader(process.errorStream)) var line: String? while (reader.readLine().also { line = it } != null) { Log.d("MonkeyTest", "Output: $line") // 输出到Logcat } while (errorReader.readLine().also { line = it } != null) { Log.e("MonkeyTest", "Error: $line") } // 等待命令完成 process.waitFor() Log.i("MonkeyTest", "Monkey test completed with exit code: ${process.exitValue()}") } catch (e: Exception) { Log.e("MonkeyTest", "Failed to execute Monkey test: ${e.message}") } } } ``` - **代码解释**: - `Runtime.getRuntime().exec()`:执行shell命令。这里使用`su -c`尝试获取root权限执行Monkey命令(设备root时有效)。 - 如果设备未root,命令可能失败(Android安全限制),此时需用户手动在ADB中运行。 - 输出日志通过Logcat查看,便于调试(引用[^3])。 - **注意事项**: - 包名替换:将`com.example.app`改为您的实际应用包名(引用[^4])。 - 事件次数:`eventCount` 可根据需求调整(如1000次测试,引用[^5])。 - 后台运行:建议使用`IntentService`或`WorkManager`在后台执行,避免阻塞UI线程。 #### 步骤4: 处理测试输出和错误 - **日志保存**:修改代码,将输出写入文件: ```kotlin val logFile = File(getExternalFilesDir(null), "monkey_log.txt") val writer = FileWriter(logFile) while (reader.readLine().also { line = it } != null) { writer.write("$line\n") } writer.close() ``` - **错误处理**:捕获`SecurityException`等异常,提示用户启用USB调试或root设备。 - **结果分析**:Monkey测试的crash应处理为0(引用[^3]),您的应用可添加解析日志的模块,自动检测crash。 #### 步骤5: 替代方案和优化 - **无root权限的替代方法**:如果设备未root,无法直接调用Monkey,建议: - 通过应用启动ADB命令:使用`adb over WiFi`库(如开源项目`adb-remote`)或发送Intent到PC端脚本。 - 改用UI自动化工具:如Espresso或Appium,它们更易集成(引用[^2])。 - **优化建议**: - 添加配置选项:允许用户输入包名、操作次数等参数(通过UI界面)。 - 结合持续集成:在Jenkins或GitHub Actions中触发测试。 - 安全性:仅在调试版本启用此功能,避免发布版本泄露敏感权限。 #### 注意事项总结 - Monkey测试适合压力测试,但无法替代全面测试(如单元测试)[^1]。 - 在真实设备上测试时,确保高事件次数(如25,000次)以符合业内标准[^3]。 - 如果您的应用是系统应用(如Launcher),可更直接调用Monkey;否则,权限限制可能需用户干预[^5]。 通过以上步骤,您可以创建一个基本的Android应用来自动化调用Monkey测试。实际开发中,建议结合日志监控和错误报告功能,以提升测试效率。如果您有特定需求(如无root实现),可进一步探索替代工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值