最近有个小需求,在移动设备(iOS / Android)中应用调用拍照并把所拍照片存入相册。我原本以为这是一个很简单的事情,不就拍个照然后把照片丢进相册?心想最多100行代码即可解决问题,谁知还是踩中坑。且听我一一分解。

必备权限

<uses -permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses>
<uses -permission android:name="android.permission.CAMERA"></uses>

添加入 AndroidManifest.xml 中

执行拍照

File destDir = new File(m_ImageRootPath);
if (!destDir.exists())
{
      destDir.mkdirs();
}

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(m_ImageRootPath , m_ImageName)));
startActivityForResult(intent, 100);

代码中 m_ImageRootPath 为照片所存目录,m_ImageName为照片名。注意,若拍照不止一张 则照片名字最好每次不一样,否则你打开相册有可能每次都只能看到一张照片。

继续阅读

项目开发笔记(十)

最近真是繁忙,公司项目 业余项目都同步推进中

公司的项目最近略有松散,但是感觉自己也应该做到了称职。按照公司目前的项目开发模式,可以预见未来很长一段时间都会处在一种 改 改 改 改 的节奏中。在这种节奏下 很容易把代码写烂,在很多次产品改需求 催进度的时候 我都时刻暗示自己 不要因为时间紧迫,而生产垃圾代码,不要因为功能变动,而产生过多硬编码,从这种角度来看 可能这种开发模式可以磨练人呢。

业余项目最近也处在最关键的一个阶段,业余项目的一个好处就是 我可以把任意一个地方模块 写成我自己想要的样子,我不用担心任何人破坏我原本的代码思路,我可以无限次重构 直到自己觉得优雅为止。可喜可贺的是,业余的项目终于可以产生收益了 Orz,之前的独立游戏 也有国外渠道愿意推广(太有眼光了),虽然对独立游戏的收益不抱希望。不管这些事情结果如何 都感谢大家的赏识。

好了,我们接下来扯今天要分享的技术内容。针对Unity使用c#脚本编写逻辑的项目,逻辑代码的保护也就是DLL文件的防反编译(Anti-Decompile) 目前市面上还没有一套完整的方案。

一般的防破解思路

在软件保护中 一般分为 客户端软件的保护 和 web软件的保护。客户端软件一般的防破解思路基本都一致,无论是win/OSX/Linux/Android/iOS 还是其他单片机上的软件程序。防破解的做法都是从 静态保护动态保护 两个方面着手。有可能很多其他地方管着两种方式的命名不一样。通俗的叫法应该是 防止静态反编译 防止动态反编译。

静态反编译(Static decompile)

所谓的静态反编译,就是在不调试的情况下根据软件的本体去查看实现逻辑或者原理(Q.普通没代码的软件也可以调试? A.一般无论是什么系统 Win Linux Android OSX iOS,其核心库 – Kernel层中都会带有调试功能的API,即使是在发行版本的操作系统中 这些调试接口也会被保留,而这些调试接口可以调试任意User层的软件,而我们开发的大多都是属于User层的软件。)

举几个例子:

使用Dex2jar工具对安卓安装文件APK进行导出jar,就属于一种针对安卓软件的静态反编译技术,
使用IDA OD等工具对 .exe .dll进行反编译 也算是一种针对win平台软件的静态反编译的行为。
使用JDgui工具对jar进行查看代码,也算是针对Java软件的一种静态反编译行为

继续阅读

个人游戏杂谈(一)

今天,我的第二款游戏装机用户已经突破1000,这里统计的是启动并玩过的用户,只下载不启动的不算,在没有任何推广策略。没有任何商业运营手段的情况下,我觉得已经非常惊喜了。特别是锤子,从锤子商店过来的用户让我大大吃了一惊,看来我要把几年来黑过老罗的话收回去了。以后尽量不黑他了Orz。

以下是我后台收集的自然用户来源比率:

这张图让我大吃一惊,从平台用户基数(平台的总用户量)来讲。锤子商店是图中最少的。从锤子科技发布的锤子手机销售情况判断,注意 市面上并没有锤子商店这个APP 也就是说只有用锤子系统的用户才能够进入锤子商店APP,才能从锤子渠道下载到我的游戏,作为一个用户基数最少的平台 竟然是游戏里用户最大的来源渠道,真猜不透这是为何。按照一般的来说,在不买量不推广的情况下,上图的比率应该是各自平台用户基数比率才对。

继续阅读

开发日志系列(十六)

cocos2d-x lua binding,android-ndk-r9c,eclipse,cygwin,window7 64bit,red mi,Thl9,htc one

项目最近进入高速迭代阶段,版本更新速度比平时加快了几倍,这几天出的版本 莫名的出现频繁崩溃闪退的问题(仅仅Android上),不得已停下逻辑开发工作去fix 这个问题.

问题重现

打开游戏进入场景 频繁切换模块界面的时候 有一定几率崩溃

初步猜测

很大可能是加载销毁UI资源的时候导致C++代码出错.而仅仅在Android上出问题 就有可能是挂在异步加载的线程上.由于 最近两周才做的UI资源分模块管理 和异步加载.所以 异步子线程出的问题非常大.

这个问题的难点在于,C++代码在android上调试比较困难,由于我们的项目(cocos2d-x lua)并非单纯的NDK项目 所以并不能完全用单步调试JNI的方式解决.需要知道问题的根源 还是必须从想办法抓取崩溃最后的打印信息开始.

继续阅读

  • 题外

目前我的团队正使用2DX的另一个实现quick-cocos2dx来制作下一款产品,又一次得益于开源社区.提到开源 作为受益者们 很多都缺乏对自由软件认知.下面针对安卓平台记录我的一些理解,如你有更深的认识 或者 发现我的误区欢迎指点.(以下分析可能存在谬误)

  • 题内 – android机器结构

由于2DX本质是使用C/C++编写 所以在安卓平台上必须使用到NDK,NDK是一种基于原生程序接口的软件开发工具。通过此工具开发的程序直接以本地语言运行,而非虚拟机。因此只有java等基于虚拟机运行的语言的程序才会有原生开发工具包。NDK与JAVA的关系 对比AIR来说 相当于ANE与AS.只是速度和深度他们都不在一个水平上.通过下图展示的是android整个系统的大题结构:

继续阅读

首先看一个简单的实现

在需要调用的地方写入一下代码:

try
{
	sJump = Class.forName("com.rect.jumpdemo.JumpHandle");
	if(sJump != null)
	{
		Method method = 
     sJump.getMethod("CallBack", new Class[] { Integer.TYPE});
		if(method != null)
	   method.invoke(null, new Object[] { Integer.valueOf(11)});
	}
}
catch (Exception e) {
	// TODO: handle exception
}

继续阅读

之前


在九月份的时候我对自己参与的项目做了一次粗浅的总结:传送门,到了四个月后的现在,这个项目我能参与的部分应该只剩接渠道的时候写ANE(前后端)和更新版本的时候负责出所有渠道的版本,关于我的第一个项目的所有模块几乎都已经转给其他同事了,而项目新版本的开发我也完全没有参与了,在这项目最后的这几个月也让我对AIR这个跨平台"引擎"又有了新的认识.在前一个月多的时间里我把AIR仔细分析了一遍,对于跨平台的认知感觉和之前又有了区别,我们总是抱怨在现有的环境下学不到东西,很多道友在抱怨每天写同样的if-elseif-else逻辑枯燥无比,其实很多时候你换几个视角看东西会让你获益匪浅.

 

之一


对于我参与的这个AIR项目,我虽然并没有在项目中参与运营,但是这个项目从无到有,再到上平台,到第一个玩家付费,到第一个单笔10K的大R出现,每一个让团队激动的时刻 我都算见证了,这个项目从无到上线总共经历了207天的时间(6~7个月左右,以前可能只听到网上分析或者预估的时间,但是这个时间是我从写的第一句代码到上平台开服的那一天的准确时间.)

继续阅读

最近在有平台合作伙伴告诉我全国SDK“百度最差,联想第二”。

听到这句话让我很感慨,因为我接过联想的SDK,而且知道联想的SDK的外包方。

可能巨头都比较专注自己的业务而忽略一些边缘的东西。

不过我最近听说的华为和TX在开发自己的flash。不知道两年后浏览器视频流会有什么变化。

2014.01.07


 

继续阅读

把逆向丢了有一段时间了,总觉得有些东西应该坚持研究下去。最近一年在做移动项目的时候一直都想把整个android底层了解清楚。

直到最近有点时间空余下来。一段时间后发现android的芯片ARM的ARM汇编和x86的16,32位汇编其实原理是相通的,只是可能在语法 在硬件结构上会导致有差别。(虽然这篇文章并用不到这种东西),而相比于android的Dalvik虚拟机代码,Dalvik机器码更便于阅读。只要好好记住Dalvik的一些规则便可。

然后我们从简单的逆向开始吧。这篇我会拿一个有广告的android应用来试手,当然原理本身非常简单,当然并没有针对的意思,下面是一个简单的使用逆向技术而修改程序的过程:

使用到的工具:IDA,C32ASM,JD-gui,Notepat++,apktool,android签名工具。

需要做手术的应用:某事百科。

继续阅读

前言

拔开云雾见到明月之后才发现柳暗花明又一村.

    这篇文章是解密ADT系列中解密air for android的最终篇(希望是最终,本来上一篇想做最终篇的 但是发现越写越多越乱,于是就把它拆开了),在前四篇文章中说的东西可能没什么实际用途,那么这一篇 我就说说之前那么多分析 对于我们的项目究竟有什么用?下面我就列举几个ANE巨坑(所谓的坑,即使归根到底是由于自己当初的无知),这篇文章即将要针对这几个问题给出完美解决方式的,当然这些问题我在之前的ANE教程中已经有当时认为是完美的解决方式.
 
 

修改的内容


1.自定义AIR主activity的launchMode,解决平台支付过程中activity堆栈被切掉的问题.

说明:改为默认的launchMode:android:launchMode="standard"

2.去除包名前缀"air.",虽然这无伤大雅 但是前缀带air总有一种不太好的感觉.

说明:默认为设置环境变量“AIR_NOANDROIDFLAIR=true”可去掉,

3.去除android资源国际化限制.

说明:修改aapt编译参数

继续阅读