- multiDex配置
- build.gradle 配置
android { defaultConfig { ... multiDexEnabled true ... } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dexOptions { javaMaxHeapSize "4g" //specify the heap size for the dex process } } dependencies { ... implementation 'androidx.multidex:multidex:2.0.1' ... }
- gradle.properties 配置
android.useAndroidX=true android.enableJetifier=true android.enableD8.desugaring = true //下面三相 debug版本一般不需要配置 org.gradle.daemon=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
- 添加 继承MultiDexApplication的类
新建 MyApplication.java 文件, 并在AndroidManifest.xml 中application添加android:name=".MyApplication" public class MyApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
- build.gradle 配置
- 混淆
- proguard-rules.pro
//网上有说会导致某些Bug,目前使用时没遇到 -ignorewarnings -dontpreverify
- proguard-rules.pro
- Gradle和Gradle Plug版本 (File -> Project Structure)
- 在网上查找下使用的版本是否对应。
- 出现 unexpected element
found in 错误时,请查看自己的gradle插件版本参考
- 项目依赖
- 使用 configurations.all 强制指定
android { ..... } //不能解决所有依赖,类似a.a.a.a.b这种,需要自行查找处理 configurations.all { resolutionStrategy { // - 下列force 删除,根据提示强制指向对应版本 -- debug版本不需要配置 //force 'com.google.android.gms:play-services-location:17.0.0' failOnVersionConflict() } }
- 使用 configurations.all 强制指定
- 广告展示
- 所有广告相关处理都尽量放在UI线程
app.runOnUiThread(new Runnable() { @Override public void run() { InterstitialAd.showAd(INTERSTITIAL_UNIT_ID, null); } });
- 注意广告初始化的位置
- 在继承 Application的类中进行初始化,
- 在继承 Activity 的类中初始化
- 部分广告内部在关闭时,是关闭当前Activity。需要提前弄清楚
- 需要开启Activity时
- 在AndroidManifest.xml中添加广告Activity
<activity android:name="org.cocos2dx.javascript.AdActivity" />
- 开启广告Activity。 mainActive 为主activity
Intent intent = new Intent(this.mainActive, AdActivity.class); intent.putExtra(AdActivity.SID, sid); intent.putExtra(AdActivity.NAME, name); this.mainActive.startActivity(intent);
- banner/插屏 需要自己写Layout。通过AndroidStudio添加xml文件,或者添加之后 invalidate 一下
- xml文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/express_container" android:layout_width="320dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_gravity="center" android:layout_marginStart="0dp" android:layout_marginTop="0dp" android:layout_marginEnd="0dp" android:layout_marginBottom="0dp" android:visibility="visible" /> </RelativeLayout>
- 创建view
//读取xml文件 View layout = LayoutInflater.from(this).inflate(activity_adopen, null); //添加xml布局 RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);//WRAP_CONTENT addContentView(layout,adParams); //广告容器 ViewGroup adView = (RelativeLayout) this.findViewById(R.id.express_container);
- xml文件
- 需要开启Activity时
- 所有广告相关处理都尽量放在UI线程
- 在哪里写广告逻辑
- 建议借用cocos的SDKClass
- 在 jsb_default/link 根目录中找到 package.json 添加字段
"serviceClassPath": [ "org.cocos2dx.javascript.service.xxx" ]
- 在service下面建立自己的ad.java,并书写逻辑
- 在 jsb_default/link 根目录中找到 package.json 添加字段
- 建议借用cocos的SDKClass
- 回调js
String cmd = "window['XXX_Call']('reward_show_fail','" + instance.rewardType + "','" + instance.rewardPart + "')"; callJS(cmd); public void callJS (String cmd) { // 一定要在 GL 线程中执行 app.runOnGLThread(new Runnable() { @Override public void run() { Cocos2dxJavascriptJavaBridge.evalString(cmd); } }); }
- 特别的(creator)接入穿山甲sdk时遇到
repositories { flatDir { dirs 'libs' } } dependencies { //剔除 '*.aar' implementation fileTree(dir: 'libs', include: ['*.jar']) }
- 包名
- create有 game 和 app 两个目录,两个目录中的 package都改为自己的包名,不然在引用 R 时,会出错
- 或者 删除game文件,并在setting.gradle中将 ':game'删除 (只打android包时)
- px 和 pd的转换
/** * 获取屏幕的宽 单位px * * @return int */ public int getScreenWidth() { return getResources().getDisplayMetrics().widthPixels; } /** * 获取屏幕的高 单位px * * @return int */ public int getScreenHeight() { return getResources().getDisplayMetrics().heightPixels; } /** * dp转换px */ public int dp2px(int dip) { final float scale = getResources().getDisplayMetrics().density; return (int) (dip * scale + 0.5f); } /** * px转换dp */ public int px2dp(int px) { final float scale = getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); }
- 后台两个进程问题(接入广告后,部分会有两个进程)
- AndroidManifest 中将 taskAffinity 删除
- 根据PROP_COMPILE_SDK_VERSION导入对应的support-v4库