项目是网狐旗舰版架构,默认安卓编译版本是Android-19, 如果运行在Android9.0及以上的设备就会提示“此应用专为旧版本打造的提示”,所以需要将工程里面的AndroidManifest.xml文件中编译目标版本升级。为了之后方便直接升级为安卓10(Android-29),特此记录其中遇到的一些问题。(本人Android小白)
升级AndroidSDK
- 下载Android-29开发工具包
使用AndroidStudio或者Eclipse中AndroidSDKManager下载Android-29和Android-23,推荐用AndroidStudio下载快,毕竟亲儿子
下载好之后将项目中project.properties文件target改成android-29,AndroidManifest.xml文件Target也需要改成29
android:targetSdkVersion="29"
改完以后打开Eclipse会有编译报错~~~~有关org.apache.http部分报错
添加org.apache.http.legacy.jar包,并添加依赖至项目
Android 6.0 移除了对 Apache HTTP 的支持,官方建议改用HttpURLConnection类。如果想继续使用 Apache HTTP API,两种方式-
- 项目有build.gradle文件方式(AndroidStudio)
在build.gradle文件中声明以下编译时依赖
android {
useLibrary 'org.apache.http.legacy'
}
-
项目没有build.gradle文件方式(Eclipse)
老项目如果没有build.gradle文件可以通过以下Eclipse方式 -
org.apache.http.legacy.jar包获取
不需百度,在自己电脑ANDROIDSDK文件目录下 sdk\platforms\android-23\optional\ 这个路径下就有这个jar包 -
添加依赖
将jar包直接拖到项目libs文件下,点击copy。然后在java bulid path里面添加jar
添加好之后项目里面需要编译报错就没有了(太天真),然后可以用cocos命令直接打包apk(如果有报错,将JDK版本升级至jdk1.8.0_92,记得改系统变量路径)
打包运行
首先是在木木模拟器下运行,系统是Android6.0,并无异常感觉很完美,然后运行在Android10设备里面闪退…尴尬!!莫得办法只有真机调试。本人用的是一加7pro Android10,eclipse版本是2018.12, 打开手机开发者模式,如果Eclipse没有Device选项(Window->show view->device),下载ADT插件下载帮助
- 崩溃在java getUUID()这个方法(网狐祖传),修改getIMEI方法(仅供参考,如果使用下面的方法需要更新项目中的android-support-v4.jar包)
public static String getIMEI(Activity context)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
return "Android SDK " + Build.VERSION.SDK_INT;
} else {
if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(context, new String[]{ android.Manifest.permission.READ_PHONE_STATE }, 1);
return null;
} else {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try{
return tm.getImei();
}catch(Exception e){ // 8以下没有 getImei
String imei = tm.getDeviceId();
if(imei == null)
{
imei = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
}
return imei;
}
}
}
}
由于Android10已经不在支持getImei(),所以此方法针对Android10以下机型,Android10可以接入安全联盟的文件获取OAID()
- 修改getMachineID()方法
private static String getMachineID(Activity context)
{
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, androidId;
//tmDevice = "" + tm.getDeviceId();
tmDevice = "" + getIMEI(context);
tmSerial = getSimSerial(tm);
androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
return deviceUuid.toString();
}
public static String getSimSerial(TelephonyManager tm)
{
String serial = "";
try
{
serial = tm.getSimSerialNumber();
}catch(Exception ex)
{
serial = "";
}
return serial;
}
修改之后重新编译打包apk,安装运行正常(高兴太早),运行之后发现所有的Http请求都无法获取数据~~~~(更特么的尴尬)
解决不能访问http请求问题
Android9.0之后 所有的Http请求都会被限制,最好的解决方法就是全部使用https请求,Android各版本改变可参考Android适配。
莫得办法只能用穷人的办法解决了。。。。
在安卓项目中添加一个xml文件路径是proj.android\res\xml。名字自取,内容如下
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
然后需要在AndroidManifest.xml文件中添加如下代码(network_security_config这个是你的xml文件名字)
<application
android:name="org.cocos2dx.lua.ClientApplication"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
>
重新编译打包,http请求正常,至此升级结束,项目编译版本已经是最新的Android-29(安卓10),如果需要升级安卓底包,需要把网狐祖传的installClient()方法修改,之后会做更新。初次制作,如有不足请赐教。