call to OpenGL ES API with no current context

Logcat中的錯誤訊息如下
call to OpenGL ES API with no current context (logged once per thread)

問題起因

簡單的說
不能在OpenGL Thread以外的Thread呼叫OpenGL指令

我遇到的實際情況是使用cocos2dx實作一個按鈕
點擊後會使用JNI呼叫Java以連接其他人提供的程式庫
該程式庫會處理一些事情後經過Listener callback 呼叫 Native Method
該Native Method會使用OpenGL 指令繪圖
此時會出現這個錯誤
可能是其他人的程式庫callback時在UI Thread或者是其他的Thread造成這個問題

解決方式

可以參照以下這篇
http://stackoverflow.com/questions/5234867/using-opengl-from-the-main-thread-on-android
使用GLSurfaceView.queueEvent就可以解決
在cocos2dx中可以直接使用Cocos2dxActivity.runOnGLThread
或者是修改程式碼在callback呼叫Native Method時改變作法不要直接呼叫繪圖指令
等到回到OpenGL Thread時再處理

Android_SoundPool的ID限制

很久以前發現的,發現沒寫到,補一下。

在使用cocos2d-x的SimpleAudioEngine時有遇到一個情形,就是有時候音效在幾個場景的切換後會撥不出來,後來發現到是因為我場景切換時會把舊場景的音效unload,再preload新場景的音效,不過照理講是不會有問題才對,後來測試是只有android會有這樣的問題。

後來查到http://d.hatena.ne.jp/itog/20100927/1285550195,裡面有寫到他的ID最大就只會到256個,所以當在重複unload 與 preload的動作之後,配到的ID就會大於256,大於256後就會發生音效撥不出來的問題。

解決的方案是呼叫end(),就可以讓ID重新計算,但會連Music都一起清掉,所以如果不想連Music都一起停的話就要另外寫方法。

另外那個網頁有提到一些其他SoundPool的限制,值得參閱一下。

ios app crack 相關文章

詳細教程
這兩篇主要教你使用GDB並使用修改組語方式改程式
http://bbs.weiphone.com/read-htm-tid-672262.html
http://bbs.weiphone.com/read-htm-tid-1523875.html

MAC APP的防堵方式 參考用
第一點基本上沒用 第二點弄發佈版的時候build不過 第三點還沒試
http://www.seoxys.com/3-easy-tips-to-prevent-a-binary-crack/

最基本檢測方法
http://stackoverflow.com/questions/1929166/how-to-programmatically-determine-if-drm-was-removed-from-iphone-application
回應3 >
http://stackoverflow.com/questions/846309/reducing-piracy-of-iphone-applications
最佳回答>
http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

教學與效果
http://www.youtube.com/watch?v=R0EIkCNyCiE

關鍵文字
{SignerIdentity, Apple iPhone OS Application Signing}

關於那段文字似乎許多文章指出是在不用99鎂證書打包ipa時的步驟之一
http://blog.csdn.net/yohunl/article/details/5971252
http://www.cocoachina.com/bbs/simple/?t7316.html
http://www.codeios.com/thread-1054-1-1.html

剛剛看過可以在改過的ipa檔中的*~.arm中找到Apple iPhone OS Application Signing
我自己打包的沒有

另外似乎還有其他防止方式
防止方式一覽
http://lwbpeter.blog.163.com/blog/static/3850821120103180386372/

改的方法, 那段文字的主要功用 還在尋找當中

一些相關資料
http://lifehacker.com/5736101/how-to-crack-just-about-any-mac-app-and-how-to-prevent-it
http://hackulo.us/wiki/IOS_Cracking
http://www.mrspeaker.net/2011/01/06/mac-hacking/

http://www.cocoanetics.com/anticrack/
http://www.sensepost.com/blog/6254.html

http://38leinad.wordpress.com/2011/05/12/cracking-cocoa-apps-for-dummies/

使用CRACKULOUS破解App Store應用
http://www.jindi.org/bbs/thread-183804-1-1.html
揭秘破解软件的幕后,以及ARM那点事
http://bbs.weiphone.com/read-htm-tid-1374779.html

lua的decompiler & checksum檢查

之前的文章[Lua預編譯]有提到預編譯可保護source code免於被用戶修改,但在最近的專案中有人修改預編譯的lua檔達到作弊的效果,雖然看來像是硬改的,但仍對lua的decompiler做了一下搜尋,找到了下面的東西:

LuaDec51 - A Lua Decompiler for lua 5.1.x

這東西可以將預編譯後的lua檔反編譯,還原成一般人都看的懂的樣子,因此對於預編譯後的lua做防護仍有必要,主要的問題在於要選擇哪一種作法,最後是選擇用Checksum而不用加解密的方式,因為較快且基本上這個專案的設定一般玩家看到也不會有什麼問題。

程式庫的選擇上,最後是選擇了hashlib++,因為較小(專注於checksum )且便於使用(兩行code就可以取一個檔案的MD5),並且在編譯上沒有其他需要特別修改的地方,搭配cocos2d-x基本上沒有問題。

Android裝置的唯一識別碼

先講我的結論:沒有一個方法是保證百分之百適用於全部的裝置

以下列出找到的一些方法

  1. The IMEI/MEID
    TelephonyManager.getDeviceId()
    不能用的原因: IMEI有重複的疑慮(不肖廠商為省錢用相同的)

  2. ANDROID_ID Settings.Secure.ANDROID_ID
    不能用的原因:回原廠設定可能改變,root手機可改,某些廠牌取出來的都一樣

  3. Serial Number android.os.Build.SERIAL
    A hardware serial number, if available. Alphanumeric only, case-insensitive.
    不能用的原因:僅2.3以上版本支援

  4. Mac Address(wifi, BlueTooth)
    不能用的原因:官方不推,首先非全部裝置都有WiFi,其次如果關閉,可能會取不到(以下Ref2中有人試過)

  5. Pseudo-Unique 請看Ref3第2項
    不能用的原因:還是有可能相同

參考資料
Ref1: http://android-developers.blogspot.com/2011/03/identifying-app-installations.html
Ref2: http://groups.google.com/group/android-developers/browse_thread/thread/48c7e15935a29eb1
Ref3: http://www.pocketmagic.net/?p=1662
Ref4: http://innovator.samsungmobile.com/cms/cnts/knowledge.detail.view.do?platformId=1&cntsId=9640