標籤:android style io ar 使用 java sp strong on
最近一直在做公司的一個安卓開發架構,含so庫,接近尾聲了,領導提出一個需求,要求使用這個架構的開發人員必須有我們的授權才可以,但是對方發布的應用後又不能被此授許可權制——要不然所有的應用都來要授權那就麻煩了。
分析:
既然是限制開發人員,那麼就必須要區分debug版本和release版本,也就是架構的授許可權制功能只對debug版本有效,而對release版本無效;然後就是需要一個調試裝置的一個唯一ID,這樣授權碼是綁定在固定的裝置的,只要有新的調試裝置就需要新的授權碼,一般公司裡也就是十幾個裝置吧,這個申請量級完全可以接受。
思路:
因為正好這個架構需要so庫的支援,這樣在so庫載入時的int JNI_OnLoad(JavaVM* jvm, void* reserved)方法中可以完成驗證。
關於debug和release版本的區分,安卓系統提供了一個debugable屬性可以實現,只要是從Eclipse或者ADT的Integration Environment裡直接運行或者調試,都可以判斷出是否是debug版本;
關於安卓裝置的ID,安卓本身提供好幾種ID的擷取,我最終使用的是security類的ID, Settings.Secure.getString(ContentResolver,Settings.Secure.ANDROID_ID),這個ID是在安卓裝置第一次啟動的時候自動產生的,如果刷機的話則可能會改變。
授權碼的存放位置就放在AndroidManifest中的application結點下,增加一個meta結點,並可以自訂資訊的名稱,那麼現在就是準備工作就全了.
實現:
1. JNI層的int JNI_OnLoad(JavaVM* jvm, void* reserved)完成驗證
2.JNI層判斷程式是否為debug版本,為防止java代碼被反編譯,所以擷取debug屬性和判斷都在JNI層進行,可以參考java層的如下代碼,即將一下代碼改編為C++代碼:
public boolean isDebugMode(){ApplicationInfo info = this.getApplicationInfo();return (0!=((info.flags) & ApplicationInfo.FLAG_DEBUGGABLE));}
3.JNI層擷取安卓裝置的唯一ID,可以參考java代碼,即將一下代碼改編為C++代碼:
String id = Settings.Secure.getString(this.mainActivity.getContentResolver(), Settings.Secure.ANDROID_ID);
4.擷取Manifest中的meta中的授權碼,這個就沒必要非得在JNI層實現了,可以在java層擷取,然後傳遞給JNI層,參考是如下的java代碼:
ApplicationInfo info=context.getPackageManager().getApplicationInfo(con.getPackageName(),PackageManager.GET_META_DATA);String key=info.metadata.getString("permissionKey");
5.接下來就是加密解密以及最後的適當加花加殼的取捨了,就不再細說了。
簡單的安卓應用授權認證(JNI)