[Android]如何分辨开发版跟正式版
有些功能我们会发现在开发版跟正式版上会有不同的行为
这时候会是开发版用一套code
正式版需要另一套code
那需要怎么做才可以用程式判断出执行环境的差异呢?
首先因为Android是java-based的
并没有像Objective-C有define来作选择性编译
而在Android的架构中也没有明显的development/release两个版本的设计
我google了一下,比较类似的讨论有
这篇stackoverflow的讨论
当中我比较倾向是用Signature来去达到这个目标
因为只有这个是runtime可以分辨出差异,而且是程式中可以取得的
再来是我们发佈到google play (或是其他market)
应该都会用的是release key做签署
所以只要能够在runtime跟release key的signature做比较
就可以判断执行环境是development或是production
有了这个方向,
先查到Android中取得Signature的方法如下
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for(Signature signature : pkgInfo.signatures)
{
System.out.println("cert: " + sigature.toCharsString());
}
你只要把你的production的signature印出来,并且hardcode进你的code
之后你做个字串比对就可以判断是不是production environment了。
但是你会发现印出来的字串很长,大概3-400个bye吧 (随便估@@)
总觉得不是很精简。
这时候假掰的个性又出现了
那就来个SHA-1 hash之后再base64吧~ \(^O^o)
其实这是Facebook Android SDK的key hash给的灵感 XD
方法是找到你用来签署所用的keystore,对他下以下的指令 (以下为Mac环境为例)
keytool -exportcert -alias youralias -keystore yourkeystore.keystore | openssl sha1 -binary | openssl base64
这时候你应该会印出一个类似下面这种字串
+YyPzaeOKYkleq9Rwtk7+Rett/o=
把这个hash放在code中,
并且加上以下代码
private static final String SIG_HASH_PRODUCTION = "+YyPzaeOKYkleq9Rwtk7+Rett/o=";
public boolean isProduction()
{
try
{
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for(Signature signature : pkgInfo.signatures)
{
String sigHash =getSignatureHash(signature);
if(SIG_HASH_PRODUCTION.equals(sigHash))
{
return true;
}
}
}catch(Exception e){}
return false;
}
public String getSignatureHash(Signature signature)
{
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] hash = md.digest(signature.toByteArray());
String hashb64 = Base64.encodeToString(hash, Base64.NO_WRAP);
return hashb64;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
如此一来,只要用给google play上架签署的apk,
执行时期的isProduction()都会回传的是true
如此你可以在任何程式去用这个Utility function判断是否为production mode。
2013/2/4 Updated
上面的方法有一个缺点就是,预设是development。
比较好的方法还是预设市production mode,
因为避免"意外"发生而变成development mode。
而developement的key是在~/.android/debug.keystore
command如下
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
而程式中改成用debug has key做负面表列来判断是否为production mode。
或是直接改成isDebugMode()
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
