2012-10-03 69 views
3

好,優雅和安全的方式我有一個Android應用程序在至極,我需要一些「靜態配置」數據預加載和不可編輯。這些數據也是相關的。當應用程序功能增加時,可能會及時更改。預加載數據的Android應用

環顧四周我已經看到了預先準備好你的sqlite3數據庫文件的建議,然後將它代碼放在典型的數據庫目錄(/data/data/whateverapp/databases/preloaded.db)中。 但是用這種方法,我擔心具有root權限的人(即rooted phone)可能會輸入和編輯數據。而不得不加密/解密數據庫文件可能會變得繁瑣和混亂(沒有本地方法來實現這個afaik)。

我甚至看到過使用靜態數據列表構建類的建議。哪個可能有效,但也有點混亂,不夠優雅。

所以,這將是實現這一正確的,優雅的和安全的方式?

+5

啊,這個安全的問題。每天至少出現一次!簡短的回答,你不能。最好你可以使用設備上的數據進行加密,然後隱藏你的私鑰/散列/鹽/算法的生命。如果我有根(而且我總是這樣做),那麼唯一的問題是「開裂它的代價是否值得獎勵」?關於如何做到這一點,在這裏進行了大量的討論。 PS。就安全性而言,SQLite和嵌入式靜態數據之間沒有區別。兩者一樣容易,或者很難得到,取決於你讓我跳過多少圈。 – Simon

+0

我的意思很多關於如何obsfucate,而不是如何破解的討論;) – Simon

+0

我雖然如此關於問題的「安全」部分。它似乎歸結爲自己加密它。但正如你所說的,可能不值得付出努力,如果你修改了數據庫,至少在我的應用程序的情況下,它會停止正常工作。儘管我對優雅和優雅的部分更感興趣。也許在api中有一些東西可以正確地實現這種預加載。 –

回答

1

很多的方式做到這一點:

  • 束作爲資源的應用程序,提取和更新數據庫等,第一次運行
  • 從服務器
  • 下載,使用GCM通知有關數據更新。當數據發生變化時無需更新整個應用程序
  • 使用Google Play擴展(或是擴展名?)文件。數據從Google服務器下載,您的應用需要進行身份驗證。您需要推送新的應用程序版本才能更新數據。
  • 使用遠程API,而忘記處理的原始數據

優雅是主觀的,你挑。

0

我的建議是使用基於服務器的數據庫,並使用嚴格的安全性,讓用戶訪問該服務器。如果您安全地加密和模糊您的訪問代碼並保護用戶憑證,那麼您已經擋住了大量無經驗的黑客,並且不必擔心根源電話,因爲數據庫甚至不在電話中。正如評論中提到的,黑客變得非常聰明,但這不應該阻止你讓自己的生活更難以破解你的代碼。

1

您可以擁有一個具有已定義XML資源的配置文件。我已經做到了這一點,並且工作得很好。這樣,如果您有多個配置,您可以備份這些配置文件以使用舊版本。據我所知,我不認爲你可以編程方式編輯這些資源。

下面是我如何使用它的一個簡單示例。 即:

清單:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="blah.blah" 
     android:versionCode="@integer/version_code" 
     android:versionName="@string/build_version"> 

我的資源文件:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <integer name="version_code">1</integer> 
    <string name="build_version">1.0</string> 
     <string name="param">Some other Param</string> 
</resources> 

現在你的程序將能夠在運行時的版本號和版本名稱來獲得資源。要獲得其他值編程,您可以使用下面的代碼:

public class Configuration { 
Context thisContext; 
private String Param = ""; 

    public Configuration(Context cont){ 
     thisContext = cont; 
     String param= thisContext.getResources().getString(R.string.param); 

     setParam(param); 
    } 

    /** 
    * @return the param 
    */ 
    public static String getParam() { 
     return Param; 
    } 
    /** 
    * set the Param 
    */ 
    public static void setParam(String param) { 
     Param= param; 
    } 
} 

然後,你可以創建一個配置對象在應用程序中的onCreate像這樣:

new Configuration(this); 

然後事後你可以使用函數

Configuration.getParam(); 

您想要獲取的任何類中的值。

你將不得不在各種參數仍然寫的,但它是非常簡單的事情。如果

需要引用舊版本上是爲換出配置文件一樣簡單。

希望這可以幫助你! 乾杯

+0

感謝您的回答。我意識到使用資源文件。我已經使用了很多。對於某些價值和標籤和信息非常有用,特別是用於國際化/本地化目的。但我的意思是說數據有點複雜(實體,字段和關係...)一個(非常)簡單的例子就是...想象一個測驗應用程序,你想要預先加載問題,問題類型,回答類型,字段類型,...每個字段和關係。 –