Android打包生成DEX文件过程中, 单个DEX文件可被引用的方法总数被限制为65536,超出会导致应用无法安装。
1> defaultConfig {
...
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies { compile 'com.android.support:multidex:1.0.0' }
application中重写以下方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base); MultiDex.install(this);
}
MultiDex.install(this);
9.0新加的限制,对未加密url直接放弃请求 (http的url均不可以),如想正常访问需在Application中添加红框中的内容
AAPT 全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。在 Android SDK 目录下可以找到它。
1 > com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error
2 > 在高版本中禁用AAPT2配置作废,报错信息如下 :
The option 'android.enableAapt2' is deprecated and should not be used anymore.
Use 'android.enableAapt2=true' to remove this warning. It will be removed at the end of 2018..
出现以上2种问题的公共解决方式为以下第二和第三条
在这里说下我更改缓存目录的原因,因为我用户名称之前是中文的(实属脑残党)所以用新版Android Studio时AAPT2检测异常,又无法禁用,网上有好几种方式更改后不觉得有用,所以只能永久的更改目录啦。
把C:\Users\xx\.gradle目录删除掉,然后在其他盘新建目录(换盘符是因为.gradle文件夹的内容会不断增加,切记不要有中文,不然换盘符没意义)
设置系统变量:GRADLE_USER_HOME,变量值为自己新建的.gradle目录
为什么要配置变量呢,因为在gradle-wrapper.properties文件中有配置此路径,至于能不能直接在这里更改路径应该也可以,自己试下吧
系统变量配置成功后,根据下图内容进行选择后重新build下即可,如果出现异常:Unexpected lock protocol found in lock file. Expected 3, found 0.可能是有缓存之类的没清除,按照图2清除掉缓存即可。可以查看原目录下是否有生成.gradle,有Bug的话请留言赐教 ^ ^
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification builder = new NotificationCompat.Builder(IntentActivity.this)
.setContentTitle("通知信息")
.setContentText("通知内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_cool)
.build();
manager.notify(1,builder);
Notification必须包含标题,标题内容,小图标三个属性,否则会发生异常,通知栏中将不显示通知内容
项目中的服务是内部类,然后创建时报错,根据错误提示在MyService中添加了无参的构造函数,依然报错.....
然后将内部MyService类声明成静态类后,完美解决。
如果startService()、 bindService()一起被调用的话,onCreate()方法只在startService()时调用一次;销毁服务时需要调用unBindService()和stopService(),否则服务还存在。
当使用startService()启动服务时,当前Activity被销毁,那服务依然存在;当使用bindService()启动服务时,Activity销毁则服务也被销毁。
当listView列表中的控件有Button的时候,会导致listView.setOnItemClickListener()事件无效
解决方式:
1> 将列表中的Button控件换成TextView
2> 将listView布局替换成LinearLayout
解决方式:
转载自:https://blog.csdn.net/xudailong_blog/article/details/85013539
按照标识的目录找到build.gradle.ftl文件,编辑修改并保存,build tools版本默认为Android Studio Ide的版本号
gradle-projects目录下是各种项目模板配置文件,默认新建的是NewAndroidProject项目
APP出现Anr的时候默认会在/data/anr/下生成anr的日志文件traces.txt,每次生成都会替换文件内容,但因Android手机的多样性,SDK版本的更新,有些手机的anr文件会丢失,有些生成的文件名称会改变,经过测试多款手机大致分为:
1> 正常生成 /data/anr/traces.txt 文件
每次发生anr,文件都会被替换,文件内容为最后一次出现anr时的日志
2> 生成/data/anr/traces_包名.txt文件
根据应用包名生成anr日志文件
3> 生成/data/anr/traces_包名_年月日.txt文件
根据应用包名和发生时间生成日志文件
4> 在/data/anr/下没有anr的日志文件
可以通过adb bugreport抓取日志,但是抓取的日志种类比较多,文件会很大,根据以下图片所说内容,并没有在当前项目路径下生成文件,应该会有默认的路径,但是没找到,后续找到会更新这里
certutil -hashfile libcomm.so MD5
Context.getApplicationInfo().nativeLibraryDir + "so库名称"
编译报错:D:\A_work\.gradle\caches\modules-2\modules-2.lock ,打开多个as项目导致,关闭掉多余项目即可,是否还有其它原因还未证实
按图的步骤操作即可找到,或者直接用快捷键Alt+6
实测 MX6 :打开【设置】中的【开发者选项】,页面底部找到【性能优化】,打开【高级日志输出】,勾选【全部允许】即可
其他类型的设备可以自行测试,但我觉得应该不会差太多
19: Android studio编译报错“android:TextAppearance.Material.Widget.Button.Inverse not found”
更改v7版本与api一致,重新编译
自定义CustomCrashHandler类实现Thread.UncaughtExceptionHandler,在uncaughtException类中开启子线程解析错误日志并发送,如果不将异常提交给默认的异常处理器 ,会导致ANR
public class CustomErrorHandler implements Thread.UncaughtExceptionHandler {
private ErrorPriCallback mErrorPriCallback;
public CustomErrorHandler() {
}
private Thread.UncaughtExceptionHandler otherHandler;
/**
* 初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器
*
* @param errorPriCallback 异常出现后处理方式回调
*/
public void init(ErrorPriCallback errorPriCallback) {
mErrorPriCallback = errorPriCallback;
otherHandler = Thread.getDefaultUncaughtExceptionHandler();//之前这里没有加,导致anr
Thread.setDefaultUncaughtExceptionHandler(this);
}
public void setHandler(Thread.UncaughtExceptionHandler handler) {
otherHandler = handler;
}
/**
* 异常发生时,系统回调的函数,我们在这里处理一些操作
*/
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
// 提示用户程序即将退出
new Thread(new Runnable() {
@Override
public void run() {
PApmLog.trace("crash-----> uncaughtException ");
// 崩溃信息
mErrorPriCallback.priInfo(CRASH, thread, ex);
// 如果有其他的handler在此处理
if (otherHandler != null) {
PApmLog.trace("crash-----> uncaughtException "+otherHandler);
otherHandler.uncaughtException(thread, ex);
}
}
}).start();
}
}